Spark任务调优(1)——数据本地化

Spark官网有关于数据本地化的相关介绍:http://spark.apache.org/docs/2.1.0/tuning.html#data-locality


本地化说明

数据本地化可以对Spark任务的性能产生重大影响。如果数据和操作数据的代码在一块,计算通常会很快。但是如果数据和代码不在一起,就必须将一方移动到另一方。通常,将序列化的代码块从一个地方发送到另一个地方要比发送数据更快,因为代码的大小比数据要小得多(这也是大数据计算核心思想之一:计算向数据移动)。Spark围绕这个数据本地化的一般原则构建它的调度。

数据本地化是指数据与运行代码之间的距离。根据数据的当前位置,有几个本地化级别。从近到远:

  • PROCESS_LOCAL    数据位于与运行代码相同的JVM中。这是最好的地方。
  • NODE_LOCAL    数据位于同一节点上。示例:可能在同一个节点上的HDFS中,或者在同一个节点上的另一个executor中。这比PROCESS_LOCAL稍微慢一些,因为数据必须在进程之间来回移动。
  • NO_PREF    数据在任何地方都可以同样快速地访问,并且没有本地偏好。
  • RACK_LOCAL    数据位于同一台服务器上。数据在同一机架上的不同服务器上,所以需要通过网络发送,通常是通过一个交换机。
  • ANAY   数据在网络上的其他地方,而不是在同一个机架上。

Spark倾向于将所有任务都安排在最佳的本地化级别,但这并不总是可行的。在没有任何空闲的executor来处理未处理数据的情况下,Spark将切换到较低的本地化级别。有两种选择:a)等到一个繁忙的CPU释放出来,在同一台服务器上启动一个数据任务,或者,b)立即在一个需要移动数据的较远的地方启动一个新的任务。

Spark通常做的是等待一个繁忙的CPU释放的希望。一旦超时过期,它就开始将数据从远处移动到空闲CPU。每个级别之间的等待超时时间可以单独配置,也可以全部在一个参数中;有关详细信息,请参阅配置页面上关于spark.locality参数的说明。如果您的任务运行时间很长,并且看到了不好的本地化级别,您应该增加这些设置(即增加每个级别间的超时时间),但是默认情况下通常很好。


如何查看本地化级别

1、通过Task日志查看

2、我常用的方法是从yarn的RM Web UI界面找到对应的任务,进入任务的明细界面。



何时需要调节

观察日志或者WebUI,查看Task数据本地化的级别,如果大部分都是PROCESS_LOCAL,则不需要调节。如果大部分都是NODE_LOCAL、ANY,RACK_LOCAL那最好提高数据本地化级别。
调节是一个反复尝试的过程,每次调节完以后,再来运行,观察日志。 

看看大部分的task的本地化级别有没有提升;看看,整个spark作业的运行时间有没有缩短。

如何调节数据本地化级别

通过改变数据本地化级别之间的超时等待时间。Spark官网对相关配置项有详细的介绍。

spark.locality.wait 默认3s

spark.locality.wait.process  默认与spark.locality.wait保持一致,可以单独指定

spark.locality.wait.node 默认与spark.locality.wait保持一致,可以单独指定

spark.locality.wait.rack 默认与spark.locality.wait保持一致,可以单独指定

注意:

修改的等待时间不能太长,因为时间太长,虽然每个Task的本地化级别提高了,但是整个Application的执行时间会由于等待时间过长而大大加长,从而失去了调节本地化级别的意义。


原理

Driver端的TaskScheduler在分发任务前,都会通过MapOutputTracker查询Task任务所需数据的位置信息,优先将Task发送到资源充足且数据所在节点的Executor的线程池中。Task在线程池中排队等待执行,如果等待时间超过3s(默认值,可能更长),重试5次,依然无法执行的话,TaskScheduler就认为这个节点没有计算能力(即资源被其他任务占完了)。TaskScheduler会降低数据本地化级别,将Task按照NODE_LOCAL重新发送,如果还无法执行,就继续降低数据本地化级别。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值