文章目录
1. 数据本地化
1.1 数据本地化的级别
1.1.1 PROCESS_LOCAL(进程本地)
task 要计算的数据在本进程(Executor) 的内存中。
1.1.2 NODE_LOCAL(节点本地)
- task 所计算的数据在本节点所在的磁盘上。
- task 所计算的数据在本节点的其他 Executor 进程的内存中。
1.1.3 NO_PREF
task 所计算的数据在关系型数据库中,如:mysql。
1.1.4 RACK_LOCAL
task 所计算的数据在同机架的不同节点的磁盘或 Executor 进程的内存中。
1.1.5 ANY
task 所计算的数据跨机架。
2. Spark 数据本地化调优
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjJgBdgD-1602580285852)(E:\maven\big-data-cloud\spark\spark_data_local.png)]
Spark 中任务调度时,TaskScheduler 在分发之前需要依据数据的位置来分发,最好将 task 分发到数据所在的节点上,如果 TaskScheduler 分发的 task 在默认 3s 依然无法执行的话,TaskScheduler 会重新发送这个 task 到 形同的 Executor 中去执行,会重试 5次。如果依然无法执行,那么 TaskScheduler 会降低一级数据本地化的级别再次发送 task。
如上图所示,会先尝试选择 1,PROCESS_LOCAL 数据本地化级别,如果重试 5次,每次等待 3秒,会默认这个 Executor 计算资源满了,那么会降低一级数据本地化级别到 2,NODE_LOCAL。如果还是重试 5次,每次等待 3s 还是失败,那么再降低一级数据本地化级别到 3,RACK_LOCAL。这样数据就会有网络传输,降低了执行效率。
2.1 如何提高数据本地化的级别?
可以增加每次发送 task 的等待时间(默认都是 3s),将 3s 倍数调大,结合 WEBUI 来调节:
- spark.locality.wait
- spark.locality.wait.process
- spark.locality.wait.node
- spark.locality.wait.rack
注意:等待时间不能调的很大,调整数据本地化的级别不用本末倒置,虽然每个 task 的本地化级别是最高了,但是整个 Application 的执行时间反而加长。
2.2 如何查看数据本地化的级别?
通过日志或者 WEBUI。