谈谈spark.sql.shuffle.partitions和 spark.default.parallelism 的区别及spark并行度的理解

spark.sql.shuffle.partitions和 spark.default.parallelism 的区别

首先两者最直观的区别:
spark.default.parallelism只有在处理RDD时有效.
spark.sql.shuffle.partitions则是只对SparkSQL有效.
看一下官网给出的两者定义:
在这里插入图片描述
以我的四级水准乱翻译一下:
 spark.sql.shuffle.partitions: 设置的是 RDD1做shuffle处理后生成的结果RDD2的分区数.
  默认值: 200
 spark.default.parallelism: 设置的是 RDD1做shuffle处理/并行处理(窄依赖算子)后生成的结果RDD2的分区数
  默认值:
   对于分布式的shuffle算子, 默认值使用了结果RDD2所依赖的所有父RDD中分区数最大的, 作为自己的分区数.
   对于并行处理算子(窄依赖的), 有父依赖的, 结果RDD分区数=父RDD分区数, 没有父依赖的看集群配置:
    Local mode:给定的core个数
    Mesos fine grained mode: 8
    Others: max(RDD分区数为总core数, 2)

spark并行度的理解

 并行度其实就是指的是spark作业中, 各个stage的taskset中的task的数量, 代表了spark作业中各个阶段的并行度, 而taskset中的task数量 = task任务的父RDD中分区数

如何设置spark.sql.shuffle.partitions和spark.default.parallelism的值

官网建议: 设置为当前spark job的总core数量的2~3倍. 理由如下:
 背景: spark作业是 1 core 1 task的
 为什么是2倍?
  这块主要是涉及超线程技术,一个物理核虚拟出两个逻辑核,spark的1core 1task是针对逻辑核而言的。
 为什么是2~3倍?
  假设我们给当前Spark job 设置总Core数为 100, 则Spark任务虚拟成200个逻辑Core,那么依据1 core 1 task, 当前spark集群中最多并行运行200task任务, 那么通过设置上述两个参数为200, 使得我们结果RDD的分区数为200, 一个分区 1task 1core, 完美! 但是实际生产中会有这样的情况, 200个task中有些task的处理速度快, 有些处理慢, 假设有20个task很快就处理完毕了, 此时就会出现 我们集群中有20个core处理闲置状态, 不符合spark官网所说的最大化压榨集群能力.
  而如果我们设置上述参数值为299, 此时的现象: 虽然集群能并行处理299个task, 奈何总逻辑core只有200, 所以会出现有99个task处于等待处理的情况. 处理较快的那20task闲置下来的20个core就可以接着运行99个中的20个task, 这样就最大化spark集群的计算能力

### 设置 Spark 默认并行度为 400 的方法 在 Spark 中,可以通过多种方式设置默认的并行度(`default parallelism`)。以下是几种常见的配置方法: #### 方法一:通过 `spark.default.parallelism` 参数 可以在 Spark 配置文件或启动应用程序时指定该参数来设置全局默认并行度。具体操作如下: - 如果使用的是 Spark Shell 或其他交互环境,在启动命令中加入以下选项即可完成配置: ```bash --conf spark.default.parallelism=400 ``` - 对于集群模式下的作业提交,也可以通过 `--conf` 参数传递给 `spark-submit` 工具[^1]。 #### 方法二:修改 Spark 配置文件 对于长期运行的任务或者固定部署场景,可以编辑 Spark 的配置文件 `spark-defaults.conf` 并添加以下内容: ```properties spark.default.parallelism 400 ``` 保存更改后重启 Spark 应用程序以使新配置生效[^3]。 #### 方法三:动态调整 Shuffle 分区数量 除了上述静态设定外,还可以针对特定任务灵活控制其分区数目。例如当执行 SQL 查询语句前可临时改变 shuffle partitions 数量至目标值 (此处设为400),即执行下面这条指令之前的所有后续shuffle操作都将采用新的定义好的partition count: ```sql SET spark.sql.shuffle.partitions=400; ``` ### 处理与优化性能问题 即使设置了较高的初始并行级别也可能遇到某些特殊情况比如数据分布不均等问题影响整体效率表现。此时就需要借助更高级别的特性来进行进一步微调: #### 开启自适应查询执行(AQE) 启用 AQE 功能可以帮助系统自动识别潜在的数据倾斜状况并对之采取相应措施而无需人工干预过多细节部分。主要涉及以下几个关键参数调节: - **开启AQE**: 将 `spark.sql.adaptive.enabled=true` 添加到您的应用配置当中去激活整个机制。 - **处理倾斜连接** : 启用 skew join 自动检测缓解策略,确保相关联表间存在显著差异大小关系时候能够有效应对可能出现的大规模重复计算现象. * 设定阈值判断标准:`spark.sql.adaptive.skewJoin.skewedPartitionFactor`=X(推荐保持原厂预设5不变除非特殊需求); * 明确触发条件界限: `spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes`=Y字节单位表示达到多少容量以上才被认定属于严重失衡范畴值得特别对待. 这些做法共同作用之下往往能带来较为明显的提速效果同时减少资源浪费情况发生概率[^4]. ### 示例代码片段展示如何初始化带有定制化属性的对象实例 ```scala import org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession val conf = new SparkConf() .setAppName("CustomParallelismApp") .setMaster("local[*]") .set("spark.default.parallelism", "400") val spark = SparkSession.builder.config(conf).getOrCreate() // 执行业务逻辑... println(s"Current default parallelism is set to ${spark.conf.get("spark.default.parallelism")}") ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值