并行度数量
并行度指所有Executor可以同时执行的Task数,
每个Executor中的一个Core(线程,虚拟核数)同时只能执行一个Task,
所以 最大并行度 = Executor数量 * 每个Executor的Core数;
eg:资源配置10个Executor节点,每个节点2个Core,那么同一时间可以并行计算的task数为20,
如果RDD有100个分区,那么需要5轮计算完毕,
如果RDD有2个分区,那么计算时只使用2个Core,其余18个Core空转,浪费资源,
所以Spark调优中会通过增大RDD分区数,增大任务并行度来提高效率。
暂时的结论,每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task
Task被执行的并发度 = Executor数目 * 每个Executor核数
每个Task执行的结果就是生成了目标RDD的一个partiton。
rdd.repartion() 需要切分的足够小,来匹配exec.memory。exec.memory不能开太大。
repartition数量大于parallelism=exec.instance*exec.cores
这样就类似滑动窗口一样,一截一截处理所有的partition
附图
问了GPT3.5
Q: spark中,rdd.repartition()中的数据怎么设置合理,与executor核数和executor数量有关吗?
A:
在Spark中,`rdd.repartition()`方法用于重新分区RDD的数据,可以通过调整分区数量来控制数据的分布和并行度。分区数量的设置与executor核数和executor数量有一定的关系。
当你调用`rdd.repartition(numPartitions)`时,`numPartitions`参数表示你希望将RDD分成的分区数量。以下是一些考虑因素:
1. Executor核数:每个Executor可以并行处理的任务数量受到其核数的限制。如果你的Executor具有多个核,可以考虑将分区数量设置为Executor核数的倍数,以充分利用每个Executor的计算能力。
2. Executor数量:Executor数量表示集群中同时运行的Executor实例的数量。如果你的集群中有多个Executor,可以考虑将分区数量设置为Executor数量的倍数,以便在整个集群上实现更好的并行性。
3. 数据大小和平衡性:分区数量的设置还应考虑到数据的大小和平衡性。如果数据量很大,可以增加分区数量以提高并行度。另外,还应确保数据在分区之间均衡分布,避免某些分区过大或过小。
需要注意的是,分区数量的设置需要根据具体的数据和任务特点进行调整和测试。过多的分区可能会导致过多的任务调度开销,而过少的分区可能无法充分利用集群资源。可以通过观察任务的执行时间和资源使用情况进行优化和调整。
总结起来,分区数量的设置应综合考虑Executor核数、Executor数量、数据大小和平衡性等因素,以实现合理的数据分布和并行度,从而提高Spark作业的性能。
executor参数设置
1.2.1 --driver-memory:
一般设置1g-2g即可,如果程序中需要collect相对比较大的数据,这个参数可以适当增大
1.2.2 --num-executors | --executor-cores | --executor-memory
这三个参数是控制spark任务实际使用资源情况。其中
num-exectors*executor-memory
就是程序运行时需要的内存量(根据实际处理的数据量以及程序的复杂程度,需要针对不同的任务设置不同的参数)
一般情况下executor-cores可以设置1或者2就行了。设置的特别高,容易造成物理内存或者虚拟内存超限,最终导致任务失败。
需要注意的是,executor-memory设置最好控制在在4g以内(甚至2g),最好不要设置的特别大。(根据实际集群资源来配置)如果设置的特别大,可能会卡住整个集群,导致后续任务都无法启动。
num-executors是执行器数量,执行器越多,并行度越高,相对执行速度也会快。但是如果申请数量太多,也会造成资源的大量浪费。
一般数据量较小的任务,可以配置num-executors == 200,同时executor-memory==4g;这样申请资源大概在1TB左右。大型的任务可以根据实际情况调整num-executors即可。
num-executors
参数说明:该参数用于设置Spark作业总共要用多少个Executor进程来执行。Driver在向YARN集群管理器申请资源时,YARN集群管理器会尽可能按照你的设置来在集群的各个工作节点上,启动相应数量的Executor进程。这个参数非常之重要,如果不设置的话,默认只会给你启动少量的Executor进程,此时你的Spark作业的运行速度是非常慢的。
参数调优建议:每个Spark作业的运行一般设置50~100个左右的Executor进程比较合适,设置太少或太多的Executor进程都不好。设置的太少,无法充分利用集群资源;设置的太多的话,大部分队列可能无法给予充分的资源。
executor-memory
参数说明:该参数用于设置每个Executor进程的内存。Executor内存的大小,很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常,也有直接的关联。
参数调优建议:每个Executor进程的内存设置4G ~ 8G较为合适。但是这只是一个参考值,具体的设置还是得根据不同部门的资源队列来定。可以看看团队的资源队列的最大内存限制是多少,num-executors乘以executor-memory,就代表了你的Spark作业申请到的总内存量(也就是所有Executor进程的内存总和),这个量是不能超过队列的最大内存量的。此外,如果你是跟团队里其他人共享这个资源队列,那么申请的总内存量最好不要超过资源队列最大总内存的1/3 ~ 1/2,避免你自己的Spark作业占用了队列所有的资源,导致别人的作业无法运行。
executor-cores
参数说明:该参数用于设置每个Executor进程的CPU core数量。这个参数决定了每个Executor进程并行执行task线程的能力。因为每个CPU core同一时间只能执行一个task线程,因此每个Executor进程的CPU core数量越多,越能够快速地执行完分配给自己的所有task线程。
参数调优建议:Executor的CPU core数量设置为2~4个较为合适。同样得根据不同部门的资源队列来定,可以看看自己的资源队列的最大CPU core限制是多少,再依据设置的Executor数量,来决定每个Executor进程可以分配到几个CPU core。同样建议,如果是跟他人共享这个队列,那么num-executors * executor-cores不要超过队列总CPU core的1/3~1/2左右比较合适,也是避免影响其他人的作业运行。