一、为什么要本地化?
数据本地化对spark的应用程序性能具有重要的影响,当数据与计算该数据的代码在一起,那应用的性能是很高的,如果数据与代码不在同一个地方,那么就要将代码移动到数据所在的节点中,因为移动代码相比较于移动数据速度要快得多。 Spark正是通过这样的原则来分配调度task的。二、数据本地化级别
数据本地化的五个级别,性能递减:
- PROCESS_LOCAL:进程本地化,性能最佳。数据与计算的代码在同一个jvm进程
- NODE_LOCAL:节点本地化,数据与计算的代码在同一个节点,比如在不同的executor进程中,或者数据在HDFS的block中
- NO_PREF:从任何地方访问数据速度都是一样的
- RACK_LOCAL:数据和计算的代码在同一个机架上
- ANY:数据在任意地方,比如其他机架上或网络中,性能最差
三、Spark优化
Spark相关配置:
// 默认等待时间是 3s
spark.locality.wait: 3
// 扩展参数,默认值均是spark.locality.wait
spark.locality.process
spark.locality.node
spark.locality.rack
spark本地化原则调度任务原理:
- spark默认是3秒等待时间,5次重试分配
- 若超时失败,则下降到下一个本地原则重新分配
- 数据发生传输时,Task首先BlockManager获取数据,若本地没有数据,则调用getRemote方法从数据所在节点BlockManager获取数据,返回至该节点
总结
本地化原则大大提高了Spark的应用程序计算性能,我们可以通过实际经验设置超时时间,避免等待时间过短产生降级。

773

被折叠的 条评论
为什么被折叠?



