Application任务执行流程
在Spark Application提交后,Driver会根据action算子划分成一个个的job,然后对每一 个job划分成一个个的stage,stage内部实际上是由一系列并行计算的task组成的,然后 以TaskSet的形式提交给你TaskScheduler,TaskScheduler在进行分配之前都会计算出 每一个task最优计算位置。Spark的task的分配算法优先将task发布到数据所在的节点上 ,从而达到数据最优计算位置。
Spark中数据的本地化介绍
Spark中数据的本地化方式分为5种,优先级依次是1到5
-
PROCESS_LOCAL:进程本地化;
表示 task 要计算的数据在同一个 Executor 中;
如图:
-
NODE_LOCAL:节点本地化;
速度稍慢,因为数据需要在不同的进程之间传递或从文件中读取。
分为两种情况,
第一种:task 要计算的数据是在同一个 worker 的不同 Executor 进程中。
第二种:task 要计算的数据是在同一个 worker 的磁盘上,或在 HDFS 上恰好有 block 在同一个节点上。如果 Spark 要计算的数据来源于 HDFS 上,那么最好的本地化级别就是 NODE_LOCAL。
如图:
-
NO_PREF: 没有最佳位置,数据从哪访问都一样快,不需要位置优先。比如 Spark SQL 从 Mysql 中读取数据。
-
RACK_LOCAL: 机架本地化,数据在同一机架的不同节点上。需要通过网络传输数据以及文件 IO,比 NODE_LOCAL 慢。
情况一:task 计算的数据在 worker2 的 EXecutor 中。
情况二:task 计算的数据在 work2 的磁盘上。
如图: