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

本文深入解析了并行与并发的区别,并详细介绍了Spark中Executor和core的角色,以及如何通过调整Executor和分区数来控制Spark的并行度。核心观点是,Spark的并行度由task数量和executor的core数决定,合理设置能提高计算效率。同时,通过repartition等方法可以优化RDD分区,进一步提升性能。
摘要由CSDN通过智能技术生成

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

🍀我将先对并行和并发的基本定义开始讲起,然后介绍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权威指南》
  • 以及私信帮助我解答问题的大佬们
spark并行度和shuffle并行度Spark中两个重要的概念。 spark并行度是指在Spark作业中同时执行的任务量。它由spark.default.parallelism参控制,默认值为CPU核心。可以通过设置该参来调整并行度,以便更好地利用集群资源。 shuffle并行度是指在进行shuffle操作时,据被划分为多个分区并在不同的节点上进行处理的能力。它由spark.sql.shuffle.partitions参控制,默认值为200。可以通过设置该参来调整shuffle操作的并行度,以便更好地平衡负载和提高性能。 spark.sql.shuffle.partitions和spark.default.parallelism的区别在于它们的作用范围和影响对象。spark.default.parallelism是全局参,影响整个Spark应用程序的并行度。而spark.sql.shuffle.partitions是针对Spark SQL中的shuffle操作的参,只影响与shuffle相关的操作的并行度。 设置spark.sql.shuffle.partitions和spark.default.parallelism的值可以根据具体的需求进行调整。一般来说,可以根据据量、集群规模和任务复杂度等因素来决定并行度的设置。较大的并行度可以提高作业的执行速度,但也会增加资源消耗。较小的并行度可以减少资源消耗,但可能导致作业执行时间较长。 总结起来,spark并行度是指整个Spark应用程序的任务并行度,而shuffle并行度是指shuffle操作的并行度。可以通过调整spark.default.parallelism和spark.sql.shuffle.partitions的值来优化Spark作业的性能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳小葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值