1.数据本地性级别划分
-
PROCESS_LOCAL:
要处理的数据在同一个本地进程,
即数据和Task在同一个Excutor JVM中。
这种情况是RDD的数据经过缓存,此时不需要网络传输,是最优locality。(但是数据要先缓存)。 -
NODE_LOCAL:
(1)数据和Task在同一节点上的不同executor中;
(2)数据HDFS和Task在同一个结点上,
此时需要进行进程间进行传输,速度比PROCESS_LOCAL略慢。 -
NO_PREF:
数据从哪访问都一样,相当于没有数据本地性,一般值从外部数据源读取数据。 -
RACK_LOCAL:
数据与Task在同机架的不同节点,此时需要通过网络传输,速度比NODE_LOCAL慢。 -
ANY:
数据和Task可能在集群的任何地方,性能最差,一般出现这种情况就该排查原因了
2.源码
package org.apache.spark.scheduler
import org.apache.spark.annotation.DeveloperApi
@DeveloperApi
object TaskLocality extends Enumeration {
// Process local is expected to be used ONLY within TaskSetManager for now.
val PROCESS_LOCAL, NODE_LOCAL, NO_PREF, RACK_LOCAL, ANY = Value
type TaskLocality = Value
def isAllowed(constraint: TaskLocality, condition: TaskLocality): Boolean = {
condition <= constraint
}
}