Spark Task:移动计算策略——任务调度数据本地性

本文深入解析Spark的Task本地性策略,包括PROCESS_LOCAL、NODE_LOCAL、NO_PREF、RACK_LOCAL和ANY级别。调度策略优先级为PROCESS_LOCAL > NODE_LOCAL > RACK_LOCAL。在资源受限时,Task可能会降低数据本地性要求,寻找可用Executor执行,以提高整体执行效率。同一节点不同Executor间的NODE_LOCAL执行通常与PROCESS_LOCAL相差不大,但涉及I/O操作的NODE_LOCAL则会慢于PROCESS_LOCAL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码解析:[Spark进阶]--深入Spark Locality Level

1、任务本地性策略

  • PROCESS_LOCAL:一个JVM内部,将RDD缓存、Executor、数据所在的datanode在同一个进程内

要处理的数据就在同一个本地进程中,即数据和Task在同一个Executor JVM中,这种情况就是RDD的数据在之前就已经被缓存过了,因为BlockManager是以Executor为单位的,所以只要Task所需要的Block在所属的Executor的BlockManager上已经被缓存,这个数据本地性就是PROCESS_LOCAL,这种是最好的locality,这种情况下数据不需要在网络中传输

  • NODE_LOCAL:在多个Executor之间,同一台主机上进行调度

数据在同一台节点上,但是并不不在同一个jvm中,比如数据在同一台节点上的另外一个Executor上,速度要比PROCESS_LOCAL略慢。还有一种情况是读取HDFS的块就在当前节点上,数据本地性也是NODE_LOCAL。

  • NO_PREF:数据从哪里访问都一样,表示数据本地性无意义,看起来很奇怪,其实指的是从MySQL、MongoDB之类的数据源读取数据。
  • RACK_LOCAL:在同一个机架内

数据在同一机架上的其它节点,需要经过网络传输,速度要比NODE_LOCAL慢。

ANY:数据在其它更远的网络上,甚至都不在同一个机架上,比RACK_LOCAL更慢,一般情况下不会出现这种级别,万一出现了可能