我试图了解Spark群集上的位置级别及其与分区RDD数量的关系以及对其执行的操作。具体来说,我有一个数据帧,其中分区数为9647。然后,我对其执行了df.count
并在Spark UI中观察到以下内容:
根据上下文,我将作业提交到具有以下配置的Yarn集群:
- executor_memory='10g',
- driver_memory='10g',
- num_executors='5',
- executor_cores=5'
此外,我注意到所有执行程序都来自5个不同的节点(主机)。
从图中,我发现在所有9644个任务中,超过95%的任务未在同一节点内运行。因此,我只是想知道拥有很多rack_local的原因。具体来说,为什么节点不选择最近的数据源来执行,换句话说,在本地有更多的节点?
谢谢
答案 0 :(得分:0)
这里有几点需要考虑。
下面您可以找到一些影响Spark中数据局部性的因素:
getPreferredLocations
,Spark将为每个RDD找到首选位置。稍后,TaskScheduler将利用此信息来决定任务的locality。在RDD的定义中,您可以找到getPreferredLocations
的定义,该定义负责指定RDD的最优位置。例如,如果源是HDFS,Spark将创建HadoopRDD(或NewHadoopRDD)的实例,并且它将访问Hadoop API以检索有关源文件overriding,getPreferredLocations
函数的位置的信息。它的基类。spark.locality.wait
来设置等待时间,该时间应决定有关 locality 的级别。 Spark将使用此设置来等待特定时间以使资源可用。如果spark.locality.wait
间隔到期后节点上没有可用的资源(核心),则Spark将降级本地级别,例如:{{1} }在新的降级级别上将发生相同的情况,直到满足所需的资源规格为止。另一方面,升级的一种方法是添加更多资源,例如:添加新的执行程序。 here(第915行)中找到的测试说明了这种情况。默认值为3秒,如果您认为应该给任务更多的时间,尽管不建议(可能会无效地增加Spark的空闲时间),但您可能决定增加此值。我改善位置的最后建议是使用PROCESS_LOCAL -> NODE_LOCAL
使Spark知道分区的位置。
注意:持久性将在首次调用操作后生效。
有用的链接:
https://www.waitingforcode.com/apache-spark/spark-data-locality/read