浅谈spark的数据本地性(data locality)

spark的数据本地性(data locality)

Spark其中一个特性就是数据本地性,简单的说就是“移动数据不如移动计算”。

因为数据在网络传输中会有不小的I/O消耗,并且传输距离越长消耗越大。

所以,数据本地性可以理解为数据传输距离,而我们的目的就是避免数据在网络中传输或尽量减少传输的距离。

根据传输的距离,我们可以对数据本地性根据传输距离进行分级。

查看Spark Web UI任务信息,我们可以看到下面的信息,其中Locality Level 一栏就是数据本地性的情况。

浅谈spark的数据本地性(data locality)


数据本地性级别划分
  • PROCESS_LOCAL:要处理的数据在同一个本地进程,
    即数据和Task在同一个Excutor JVM中。
    这种情况是RDD的数据经过缓存,此时不需要网络传输,是最优locality。(但是数据要先缓存)。
  • NODE_LOCAL:分两种情况:
    一是数据和Task在同一节点上的不同executor中;
    二是数据HDFS和Task在同一个结点上,
    此时需要进行进程间进行传输,速度比PROCESS_LOCAL略慢。
  • NO_PREF:数据从哪访问都一样,相当于没有数据本地性
    一般值从Mysql之类的数据源读取数据。
  • RACK_LOCAL:数据与Task在同机架的不同节点

    此时需要通过网络传输,速度比NODE_LOCAL慢。
  • ANY:数据和Task可能在集群的任何地方,
    性能最差,一般出现这种情况就该排查原因了

相关参数

Spark程序调度过程中不一定严格按照计算出来的数据本地性进行执行。

因为我们的任务是并行执行的,但是Executor的core资源有限,在你计算出来最优本地性的时候也许资源被占用。

此时如果我们降级到其他本地性级别也许整体效率更高。

所以,我们可以通过一些参数,控制等待时间,

一旦到达等待时间仍然没有获得资源,就尝试降低本地性级别让其他Excutor 执行。

相关参数如下:

参数 含义 默认值
spark.locality.wait 设置所有级别的数据本地性
默认:3s
spark.locality.wait.process 多长时间等不到PROCESS_LOCAL就降级 默认:spark.locality.wait
spark.locality.wait.node 多长时间等不到NODE_LOCAL就降级 默认:spark.locality.wait
spark.locality.wait.rack 多长时间等不到RACK_LOCAL就降级 默认:spark.locality.wait

降级顺序如下:
浅谈spark的数据本地性(data locality)