Spark 从 0 到 1 学习(10) —— Spark 调优(二)——数据本地化

1. 数据本地化

1.1 数据本地化的级别

1.1.1 PROCESS_LOCAL(进程本地)

task 要计算的数据在本进程(Executor) 的内存中。

在这里插入图片描述

1.1.2 NODE_LOCAL(节点本地)

  1. task 所计算的数据在本节点所在的磁盘上。
  2. 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。

猜你喜欢

转载自blog.csdn.net/dwjf321/article/details/109056176