• 【Spark】配置参数关系-重要


    并行度数量

    并行度指所有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作业的性能。

    Spark笔记(pyspark)

    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左右比较合适,也是避免影响其他人的作业运行。

     

  • 相关阅读:
    76. 最小覆盖子串
    爬虫 — Js 逆向案例二微信公众平台登录
    AJAX 技术学习笔记(基础)
    HashMap为什么线程不安全?
    设计模式 —— 关于8月份学习设计模式的总结
    Spring Boot 整合RabbitMQ
    小程序提示没有找到可以构建的NPM包解决方法
    超声波清洗机靠谱吗?实用性比较高的超声波清洗机推荐
    Python + Django4 搭建个人博客(六): 数据库表和模型设计
    GET请求
  • 原文地址:https://blog.csdn.net/weixin_31866177/article/details/134078648