7

Spark 架构完全围绕执行器和核心的概念展开。我想看看在集群中运行的 Spark 应用程序实际上有多少个执行程序和内核运行。

我试图在我的应用程序中使用以下代码段,但没有运气。

val conf = new SparkConf().setAppName("ExecutorTestJob")
val sc = new SparkContext(conf)
conf.get("spark.executor.instances")
conf.get("spark.executor.cores")

有什么方法可以使用SparkContextObject 或SparkConfobject 等获取这些值。

4

3 回答 3

7

Scala(编程方式):

getExecutorStorageStatus并且getExecutorMemoryStatus都返回执行者的数量,包括驱动程序。像下面的示例片段。

/** Method that just returns the current active/registered executors
        * excluding the driver.
        * @param sc The spark context to retrieve registered executors.
        * @return a list of executors each in the form of host:port.
        */
       def currentActiveExecutors(sc: SparkContext): Seq[String] = {
         val allExecutors = sc.getExecutorMemoryStatus.map(_._1)
         val driverHost: String = sc.getConf.get("spark.driver.host")
         allExecutors.filter(! _.split(":")(0).equals(driverHost)).toList
       }

sc.getConf.getInt("spark.executor.instances", 1)

同样获取所有属性并打印如下,您也可以获得核心信息..

sc.getConf.getAll.mkString("\n")

或者

sc.getConf.toDebugString

大多数spark.executor.cores执行者spark.driver.cores驱动程序应该有这个值。

Python :

以上方法getExecutorStorageStatus和getExecutorMemoryStatus,在python api中没有实现

编辑但可以使用从 SparkSession 公开的 Py4J 绑定进行访问。

sc._jsc.sc().getExecutorMemoryStatus()

于 2016-08-26T09:36:38.777 回答
5

这是一个老问题,但这是我在 Spark 2.3.0 上解决这个问题的代码:

+ 414     executor_count = len(spark.sparkContext._jsc.sc().statusTracker().getExecutorInfos()) - 1
+ 415     cores_per_executor = int(spark.sparkContext.getConf().get('spark.executor.cores','1'))
于 2018-09-19T17:10:38.693 回答
-3

这是获取核心数量的python示例(包括master的) def workername(): import socket return str(socket.gethostname()) anrdd=sc.parallelize(['','']) namesRDD = anrdd.flatMap(lambda e: (1,workername())) namesRDD.count()

于 2016-10-18T10:07:16.557 回答