场景

之前有处理过因为文件大小导致并行问题产生的数据倾斜问题,但并不是所有场景都适用,这篇文章讲讲个人认为的并行参数心得

-- 参数可以控制reducer,是一种倾斜的调测手段
set hive.exec.reducers.bytes.per.reducer;  
-- 默认是64MB

看到很多文献和博客都表示数据倾斜的时候 可以调整并行, 但是并不是适用所有场景

set hive.exec.reducers.bytes.per.reducer=134217728;  --reduce大小,我们集群默认64
set hive.exec.reducers.max --我们集群默认设置是1099

甚至设置失败会直接报错

-- 设置太小的个数不合适,会直接报错
[30041] Errorwhile processing statement: FAILED: Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Failed to create Spark client for Spark session fa2bdba3-a761-409f-b3f8-dd1e83de1a59_0: java.util.concurrent.TimeoutException: Client 'fa2bdba3-a761-409f-b3f8-dd1e83de1a59_0' timed out waiting for connection from the Remote Spark Driver

参数

网上茫茫多的数据倾斜并行相关参数(仅讨论对资源修改)其实可以进行一下总结

  • 容器个数
--通过调整
spark.executor.instances
--参数来设置容器的数量。增加容器个数可以提高并行度,允许同时执行更多的任务。
  • 容器内核心数
--通过调整
spark.executor.cores
--参数来设置每个容器内可用的核心数。增加核心数可以提高每个容器的并行度,使其能够更快地完成计算任务。
  • Hive并行设置
--通过设置
set hive.exec.parallel=true
--开启Hive的并行执行功能,然后通过调整
set hive.exec.parallel.thread.number
--参数来设置并行执行的线程数。增加线程数可以提高Hive作业的并行度。
  • Reduce调整
--通过调整
set hive.exec.reducers.bytes.per.reducer
set hive.exec.reducers.max
--参数来调整Reduce任务的个数。

--增加
hive.exec.reducers.bytes.per.reducer
--参数的值可以减少每个Reducer处理的数据量,从而增加Reducer的并行度。通过调整
hive.exec.reducers.max
--参数的值可以限制Reduce任务的最大个数。

个人心得

  1. 优化的整体思路
    在执行顺序上,一般先根据需求创建对应个数的容器(通过调整spark.executor.instances参数),
  2. 然后再分配容器内核心数(通过调整spark.executor.cores参数)。
  3. 在Hive作业执行时,会根据设置的并行线程数(通过调整set hive.exec.parallel.thread.number参数)来决定每个Stage内并行执行的任务数量。
  4. 可以根据需要调整Reduce任务的个数(通过调整set hive.exec.reducers.bytes.per.reducerset hive.exec.reducers.max参数)来控制输出结果的并行度
  5. 作业的日志信息:查看作业的日志信息,观察任务的运行时间、资源使用情况和日志中是否有异常情况。
  6. 数据倾斜情况:观察作业的输入数据是否存在倾斜,是否有某些键值对的数据量远远大于其他键值对,导致任务执行时间不均衡。
  7. Shuffle阶段的性能瓶颈:观察作业的执行计划中是否存在Shuffle阶段,查看Shuffle的输入输出数据量、网络传输速度和磁盘IO等指标,判断是否存在Shuffle阶段的性能瓶颈。
  8. 资源利用情况:观察作业执行过程中CPU、内存、磁盘和网络等资源的利用情况,判断是否存在资源瓶颈。综合以上信息,可以根据实际情况判断作业是否需要在容器级别扩容、在Stage内增加并行度或者增加Reduce并行度,以优化作业的性能和资源利用。