大数据计算的原则,数据不移动,计算移动 ----数据本地化
Application的执行流程:
job在执行之前,首先是由DAGScheduler负责切割Job,划分stage(依据宽窄依耐),DAGScheduler会以taskSet的形式发送TaskScheduler,TaskScheduler会根据数据本地化的算法,发送task到相Executor中执行
如果发送到Executor中的task等到3s,重发5次都无法执行,TaskScheduler就会判断这个Executor资源满了,这个时候TaskScheduler就会降一个数据本地化级别重新发送task,如果还是无法执行,再降一个数据本地化级别,一直到ANY
1,进程本地化 PROCESS_LOCAL task计算的数据就在本进程(同一个Executor)的内存中
2,节点本地化 NODE_LOCAL task计算的数据在同一个worker的不同Executor进程中/task计算的数据是在本地Worker磁盘上
3,没有本地化 NO_PREF 如果读取数据在数据库中
4,机架本地化 RACK_LOCAL task计算数据,在同一个机架不同节点上
5,垮机架 ANY
如何提高数据本地化级别?
增加task执行的等待时间,可以重3s,提高到6S;注意不要本末倒置了,提高的时间不要太长
配置参数
spark.locality.wait 默认是3秒 相当于是全局的
spark.locality.wait.process 默认和spark.locality.wait 是相等的
spark.locality.wait.node 默认和spark.locality.wait 是相等的
spark.locality.wait.rack 默认和spark.locality.wait 是相等的
new SparkConf().set("spark.locality.wait","6")
--conf spark.locality.wait=6 提交spark-submit的时候使用
问题:
val rdd1 = sc.textFile("path")
rdd1 = rdd1.cache()
rdd1.count
这个job中的task能达到最高的数据本地化级别吗(PROCESS_LOCAL )?
不能,对于这个job中的task最高的数据本地化级别是NODE_LOCAL
如何查看task计算的数据本地化?
1,taskSetManager打印的日志
2,通过Driver的web端查看 4040端口