spark学习之并行度、并发、core数和分区的关系

x33g5p2x  于2022-03-03 转载在 Spark  
字(1.6k)|赞(0)|评价(0)|浏览(871)

👊上次的百度面试遇到了关于spark的并发数的问题,今天我们就来将这些问题都一并解决一下,图画的的有点丑,还行大家见谅,百度实习的问题我放在了下面的链接👇:

  • 链接: 2022百度大数据开发工程师实习面试经历.

🍀我将先对并行和并发的基本定义开始讲起,然后介绍spark中是如何控制并行和并发的,以及这些和cpu核数、分区数有何关系。

1. 并行和并发

  • 并行:指多个处理器或者是多核的处理器同时处理多个不同的任务(并行是物理上的同时发生)

  • 并发:指一个处理器同时处理多个任务,指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行(并发是逻辑上的同时发生)

2. Executor和core

Spark Executor 是集群中运行在工作节点(Worker)中的一个JVM进程,是整个集群中的专门用于计算的的节点。在提交应用中,可以提供制定计算节点的个数,以及对应的资源。这里的资源一般是指工作节点Executor的内存大小和使用的虚拟CPU核(core)数量。

配置Executor的相关启动参数:

配置说明
– nums-executors配置Executor的数量
– nums-memory配置每个Executor的内存大小
– nums-cores配置每个Executor的虚拟CPU core

演示一下Executor的并行与并发:

  1. 蓝色的圆圈是真实的core
  2. 绿色的圆圈是虚拟的core
  • 在下图中,Executor的真实核数为3,虚拟核数为3,每一个虚拟核抢占了一个真实的核,所以实现的是并行计算

  • 在下图中,Executor的真实核数为1,虚拟核数为3,3哥虚拟核去抢占1个真实的核的资源,所以实现的是并发计算

并行度(paralleism):在分布式计算框架中,一般都是多个任务同时执行,由于任务分布在不同的计算节点进行计算,所以能够真正实现多个任务并行执行,记住,这里是并行,而不是并发,这里我们将整个集群并行执行任务的数量,成为并行度。

spark中的并行度和分区之间是有关系的,rdd的每一个分区都是一个task,然后传送到对应的executor中进行计算。如果资源充足(executor core数=task数)并行度就等于分区数,如果(executor core数<task数)就是并发执行。

3. Spark的task

众所周知,rdd是spark中最基本数据处理模型,里面包含了分区的概念。

在下图的例子中,我们发现rdd读取的数据,需要转化为task才能传输给executor节点进行计算,那么task是如何进行划分的呢,划分的规则就是我们所谓的分区,不同的分区被划为不同的task。

RDD的分区是可变的,你可以根据资源的需要去改变分区,使资源利用率最大化。rdd默认的分区是可以进行配置的,如果不配置采用的就是totalcores,即当前环境的最大可用核数。

4. Spark如何提高并行度?

  • 设置合理的task数量,至少设置成与spark Application (executor)的总cpu core 数量相同。比如:150个分区,150个task,150个core,差不多每个task同时运行完毕。(官方推荐,task数量,设置成spark Application 总cpu core数量的2~3倍 ,比如150个cpu core ,基本设置 task数量为 300~ 500)
  • 重新设置RDD的分区数,常见的方法有repartitions 、 coalesce、join、以及一些会产生宽依赖的算子。

5. 总结

spark根据分区数来决定task的个数,而task的个数和executor所拥有的core数来决定着spark的并行度,当task数多余core数时,就会产生并发操作。

6. 参考资料

  • 链接: spark性能调优.
  • 《尚硅谷spark3.0教程》
  • 《spark权威指南》
  • 以及私信帮助我解答问题的大佬们

相关文章