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

本文探讨了Spark任务中data locality的重要性,解释了`spark.locality.wait`参数的作用,即允许任务等待分配到数据所在的节点以提高性能。文章详细介绍了本地化级别的概念,包括PROCESS_LOCAL、NODE_LOCAL等,并建议在观察到多数任务为NODE_LOCAL或ANY时,可以通过调整`spark.locality.wait`来优化任务分配和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,读者需要知道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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值