数据本地化对于Spark Job性能有着巨大的影响,如果数据以及要计算它的代码是在一起的,那么性能当然会非常高。但是,如果数据和计算它的代码是分开的,那么其中之一必须到另外一方的机器上。移动代码到其匹配的数据节点,会比移动大量数据到代码所在的节点上去,速度要快得多,因为代码比较小。Spark也正是基于这个数据本地化的原则来构建task调度算法。
数据本地化,是指数据离计算它的代码距离有多近,有几种数据本地化级别:
1、PROCESS_LOCAL:数据和计算它的代码在同一个JVM进程中,对应spark是指的在一个executor内,这种距离最近,性能最好。
2、NODE_LOCAL:数据和计算它的代码在一个节点上,但是不在一个进程中,比如在不同的executor进程中,或者是数据在HDFS文件的block中,这种距离远些,性能次之。
尽量控制在前2种。 如下计算代码和匹配数据距离依次更远,性能依次变的更差。
3、NO_PREF:从任何地方访问数据速度都是一样,不关心数据的位置。
4、RACK_LOCAL:数据和计算它的代码在一个机架上。
5、ANY:数据可能在任意地方,比如其他网络环境内,或者其他机架上。
注:Spark UI中,在stage中看task列表,Locality Level列可以看到该task的数据本地化级别。
实际使用过程中,资源是有限的。
例如,如果一个executor在某一时刻已经启动了很多task,没有资源可以继续启动新task。此时,应该选择等待一段时间。
是spark切换每个级别的等待间隔时间,默认值3秒过短,生产上建议配置到50~60秒。
也可以细化到每个级别的等待间隔时间配置:
个人建议越在前面的配置略大些好,例如50~60秒。
原文:https://www.cnblogs.com/wwcom123/p/10533994.html