Spark性能调优之调节数据本地化等待时长 spark.locality.wait

875 阅读4分钟

博闻强识plus 2019-06-29 20:23:49  1153  收藏 1

分类专栏: Hadoop生态 spark

版权

首先,读者需要知道Spark的task是干什么的?

详见笔者之前的文章《Spark性能调优之调节task并行度》

介绍task 摘要如下:

我们写的spark作业称为application;

  • 一个application有多个job(一个action比如:collect操作触发一个job);

  • 每个job在发生shuffle(比如:reduceByKey)时,就会被拆成一个stage;

  • 每个stage被拆为多个task,task被分配到executor上执行,一个task会有一个线程去执行,

  • 一个task处理一小片数据。

为什么又有 “数据本地化等待时长 ” - - spark.locality.wait 这个参数呢?

Spark在driver 上,对application的每个stage的task分配之前,会先计算出每个task要计算的是哪个分片数据(RDD 上的某个Partition);Spark分配task的算法,优先希望每个task恰好分配到它所要计算的数据的节点上,这样,就避免了网络间数据传输。

但事实上,有时候,task并没有分配到它所要计算的数据的节点上,原因呢?

有可能是那个节点的计算资源和计算能力满了,task处理数据是需要计算资源的。所以,通常来说,Spark会等待一段时间,看能否将task分配到它要处理数据所在节点上,这个等待时长默认是3秒(3s不是绝对的,针对不同的本地化级别可以设置不同等待时长)。如果超过等待时长,无法继续等待,就会选择一个性能比较差的本地化级别,比如说:将task分配到距离它所要处理数据节点比较近的一个节点上,然后传输数据进行计算。

对于我们来说,最好是,task正好分配到它要处理数据所在节点上,这样直接从本地executor对应的BlockManager中获取数据,纯内存传输数据,或带有部分磁盘IO。

那么我们提到本地化级别是什么?又有哪几种呢?

本地化就是指task被分配要处理部分数据,task和它要处理的数据可能会在不同的节点位置。根据这种位置关系,就有以下5种不同的本地化级别:

1.PROCESS_LOCAL:进程本地化。计算数据的task由某个executor执行,数据也就在这个executor对应的BlockManager中。这种本地化级别,性能最好。(如下图) 在这里插入图片描述

2.NODE_LOCAL:节点本地化。第一种情况,数据作为HDFS block数据块就在节点上,而task节点是在某个executor上运行;第二种情况,task和它要处理的数据,在同一节点的不同executor上,数据需要在进程之间传输。(如下图)

在这里插入图片描述

image.png

3.NO_PREF:对于task来说,数据在哪里获取都一样,无好坏之分。

4.RACK_LOCAL:机架本地化。task和它要处理的数据在同一机架的不同节点上,数据需要通过网络在节点之间传输。(如下图)

在这里插入图片描述

5.ANY:task和它要处理的数据可能在集群的任何地方,而且不在同一机架(Rack)上,数据要跨机架传输。性能最差。(如下图)

在这里插入图片描述

Spark分配task时,优先选择PROCESS_LOCAL(进程本地化),如果分配PROCESS_LOCAL级别时,没分配到的话,会默认等待3s,这个等待时长是由spark.locality.wait设置。所以,Spark作业中,我们可以设置spark.locality.wait 参数,调节等待时长。

什么时候调节设置spark.locality.wait参数?

在测试spark作业的时候,先用client模式跑,观察spark作业的运行日志。日志中会显示,start task… PROCESS_LOCAL, NODE_LOCAL

观察大多数task的数据本地化级别。如果大多都是PROCESS_LOCAL,就不用调节spark.locality.wait。但如果大多是NODE_LOCAL, ANY ,那么最好调节下数据本地化的等待时长,再观察大部分task本地化级别有没有提升,看spark作业时间有没有缩短.

怎么调节spark.locality.wait?

SparkConf sparkConf = new sparkConf()

.set(“spark.locality.wait”, “10”)  // 10就是10秒

————————————————

版权声明:本文为CSDN博主「博闻强识plus」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/lilei199211…