浅谈spark的数据本地性(data locality)
spark的数据本地性(data locality)
Spark其中一个特性就是数据本地性,简单的说就是“移动数据不如移动计算”。
因为数据在网络传输中会有不小的I/O消耗,并且传输距离越长消耗越大。
所以,数据本地性可以理解为数据传输距离,而我们的目的就是避免数据在网络中传输或尽量减少传输的距离。
根据传输的距离,我们可以对数据本地性根据传输距离进行分级。
查看Spark Web UI任务信息,我们可以看到下面的信息,其中Locality Level 一栏就是数据本地性的情况。
数据本地性级别划分
- 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 |
降级顺序如下: