计数操作导致更多的rack_local pyspark

时间:2019-04-12 11:42:12

标签: apache-spark cluster-computing yarn

我试图了解Spark群集上的位置级别及其与分区RDD数量的关系以及对其执行的操作。具体来说,我有一个数据帧,其中分区数为9647。然后,我对其执行了df.count并在Spark UI中观察到以下内容:

enter image description here

根据上下文,我将作业提交到具有以下配置的Yarn集群:

- executor_memory='10g',
- driver_memory='10g',
- num_executors='5',
- executor_cores=5'

此外,我注意到所有执行程序都来自5个不同的节点(主机)。

从图中,我发现在所有9644个任务中,超过95%的任务未在同一节点内运行。因此,我只是想知道拥有很多rack_local的原因。具体来说,为什么节点不选择最近的数据源来执行,换句话说,在本地有更多的节点?

谢谢

1 个答案:

答案 0 :(得分:0)

这里有几点需要考虑。

下面您可以找到一些影响Spark中数据局部性的因素:

  1. Spark最初将尝试将task放置在尽可能靠近源数据所在节点的位置。例如,如果源系统是HDFS,Spark将尝试在存在特定分区数据的同一节点中执行任务。通过实施getPreferredLocations,Spark将为每个RDD找到首选位置。稍后,TaskScheduler将利用此信息来决定任务的locality。在RDD的定义中,您可以找到getPreferredLocations的定义,该定义负责指定RDD的最优位置。例如,如果源是HDFS,Spark将创建HadoopRDD(或NewHadoopRDD)的实例,并且它将访问Hadoop API以检索有关源文件overridinggetPreferredLocations函数的位置的信息。它的基类。
  2. 不能实现高局部性的主要原因(例如:PROCESS_LOCAL或NODE_LOCAL)是目标节点中缺少资源。 Spark使用设置spark.locality.wait来设置等待时间,该时间应决定有关 locality 的级别。 Spark将使用此设置来等待特定时间以使资源可用。如果spark.locality.wait间隔到期后节点上没有可用的资源(核心),则Spark将降级本地级别,例如:{{1} }在新的降级级别上将发生相同的情况,直到满足所需的资源规格为止。另一方面,升级的一种方法是添加更多资源,例如:添加新的执行程序。 here(第915行)中找到的测试说明了这种情况。默认值为3秒,如果您认为应该给任务更多的时间,尽管不建议(可能会无效地增加Spark的空闲时间),但您可能决定增加此值。
  3. 如果您的数据位于Spark群集之外,则本地级别将设置为ANY。

我改善位置的最后建议是使用PROCESS_LOCAL -> NODE_LOCAL使Spark知道分区的位置。

注意:持久性将在首次调用操作后生效。

有用的链接:

https://www.waitingforcode.com/apache-spark/spark-data-locality/read

http://www.russellspitzer.com/2017/09/01/Spark-Locality/

https://github.com/apache/spark/blob/0bb716bac38488bc216fbda29ce54e93751e641b/core/src/main/scala/org/apache/spark/scheduler/TaskSetManager.scala