👊上次的百度面试遇到了关于spark的并发数的问题,今天我们就来将这些问题都一并解决一下,图画的的有点丑,还行大家见谅,百度实习的问题我放在了下面的链接👇:
🍀我将先对并行和并发的基本定义开始讲起,然后介绍spark中是如何控制并行和并发的,以及这些和cpu核数、分区数有何关系。
Spark Executor 是集群中运行在工作节点(Worker)中的一个JVM进程,是整个集群中的专门用于计算的的节点。在提交应用中,可以提供制定计算节点的个数,以及对应的资源。这里的资源一般是指工作节点Executor的内存大小和使用的虚拟CPU核(core)数量。
配置Executor的相关启动参数:
配置 | 说明 |
---|---|
– nums-executors | 配置Executor的数量 |
– nums-memory | 配置每个Executor的内存大小 |
– nums-cores | 配置每个Executor的虚拟CPU core |
演示一下Executor的并行与并发:
并行度(paralleism):在分布式计算框架中,一般都是多个任务同时执行,由于任务分布在不同的计算节点进行计算,所以能够真正实现多个任务并行执行,记住,这里是并行,而不是并发,这里我们将整个集群并行执行任务的数量,成为并行度。
spark中的并行度和分区之间是有关系的,rdd的每一个分区都是一个task,然后传送到对应的executor中进行计算。如果资源充足(executor core数=task数)并行度就等于分区数,如果(executor core数<task数)就是并发执行。
众所周知,rdd是spark中最基本数据处理模型,里面包含了分区的概念。
在下图的例子中,我们发现rdd读取的数据,需要转化为task才能传输给executor节点进行计算,那么task是如何进行划分的呢,划分的规则就是我们所谓的分区,不同的分区被划为不同的task。
RDD的分区是可变的,你可以根据资源的需要去改变分区,使资源利用率最大化。rdd默认的分区是可以进行配置的,如果不配置采用的就是totalcores,即当前环境的最大可用核数。
spark根据分区数来决定task的个数,而task的个数和executor所拥有的core数来决定着spark的并行度,当task数多余core数时,就会产生并发操作。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://liuxiaocong.blog.csdn.net/article/details/123243056
内容来源于网络,如有侵权,请联系作者删除!