spark学习之并行度并发core数和分区的关系
Posted 柳小葱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark学习之并行度并发core数和分区的关系相关的知识,希望对你有一定的参考价值。
👊上次的百度面试遇到了关于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的并行与并发:
- 蓝色的圆圈是真实的core
- 绿色的圆圈是虚拟的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权威指南》
- 以及私信帮助我解答问题的大佬们
以上是关于spark学习之并行度并发core数和分区的关系的主要内容,如果未能解决你的问题,请参考以下文章