Hive优化及yarn调优

本文分享了从Oracle迁移到Hive后,针对批处理汇总操作进行的Hive SQL内存调优经验。主要调整了包括reducer大小、压缩设置、内存分配等多个参数,以优化join和group by等操作的性能。调优旨在解决特定的错误问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set hive.exec.reducers.bytes.per.reducer=100000000;
set hive.optimize.cp=true;
set hive.optimize.prunner=true;
set hive.exec.parallel=true ;
set hive.exec.parallel.thread.number=8;
set mapred.compress.map.output=true;
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec;
set mapred.reduce.parallel.copies=10;
set mapred.reduce.copy.backoff=200;
set mapred.job.shuffle.input.buffer.percent=0.9;
set mapred.job.reduce.input.buffer.percent=0.5;
set mapred.job.shuffle.merge.percent=0.8;
set io.sort.factor=300;
set hive.auto.convert.join=false;
set mapred.max.split.size=200000000;
set mapreduce.map.memory.mb=5632;
set mapreduce.reduce.memory.mb=11264;
set mapred.child.java.opts=-Xmx7168m;
set mapreduce.map.java.opts=-Xmx7168m;
set mapreduce.reduce.java.opts=-Xmx7168m;

 

最近数据汇总由Oracle迁移到了hive,进行批处理汇总.针对hive sql进行了一些内存调优,在这里分享下

其实汇总这块很简单,就是join 和group by等操作

<think>嗯,用户这次的问题是关于Hive on Spark的并发性能方法。从用户引用的资料来看,ta已经对基础有一定了解,现在需要更深入的并发优化方案。用户可能是个大数据工程师,正在处理生产环境中高并发查询的性能瓶颈。 我注意到用户引用的资料很有针对性:引用[1]提到参数的重要性,引用[2]强join优化,引用[3]重点讲内存管理,引用[4]则涉及shuffle细节。这些正好构成并发的四个维度:资源分配、执行器配置、查询优化和shuffle优化。 用户上次询问的是基础配置,这次转向并发场景,说明ta的集群可能面临业务增长压力。需要特别注意:高并发时资源争用是核心矛盾,这和单查询有本质区别。比如spark.executor.cores不是越大越好,要避免YARN容器碎片化。 在回复结构上,我决定按层次展开:先集群资源层(YARN队列/动态分配),再执行器配置(并行度/内存),最后查询层(分区/Join)。每个建议都要带具体参数和计算逻辑,比如执行器核数设置公式$v = \min(4, \lfloor \frac{yarn\_node\_cores}{executor\_count} \rfloor)$就很有实操性。 特别要强反模式:比如spark.dynamicAllocation.maxExecutors设得过高可能压垮集群,或者小文件过多导致元数据瓶颈。用户引用[2]提到的hive.auto.convert.join.noconditionaltask.size也要解释清楚Spark和MR的区别。 最后补充监控方法,因为需要数据支撑。打算用表格对比优化前后效果,这样用户能直观看到价值。相关问题设计成递进的,从参数验证到极端场景覆盖。</think>以下是针对 Hive on Spark 并发性能的完整方案,结合资源配置、参数优化及执行策略三个维度,重点提升多任务并行处理能力: --- ### 一、资源层优化YARN 队列管理) 1. **动态资源分配** 启用 Spark 动态资源伸缩,避免资源闲置: ```xml <!-- hive-site.xml --> <property> <name>spark.dynamicAllocation.enabled</name> <value>true</value> </property> <property> <name>spark.dynamicAllocation.maxExecutors</name> <value>50</value> <!-- 按集群规模整 --> </property> <property> <name>spark.dynamicAllocation.minExecutors</name> <value>5</value> </property> ``` 动态分配根据负载自动增减 Executor,提高集群利用率[^3]。 2. **队列资源隔离** 在 YARN 中划分独立队列,避免并发任务资源争抢: ```bash # 提交任务时指定队列 SET spark.yarn.queue=prod_high_priority; ``` --- ### 二、Executor 并发配置 1. **Executor 粒度整** 根据数据量和并发数平衡 Executor 数量与核数: ```properties # spark-defaults.conf spark.executor.instances = 20 # 总Executor数 spark.executor.cores = 4 # 每个Executor核数(建议4-6核) spark.executor.memory = 8g # Executor堆内存 spark.executor.memoryOverhead=2g # 堆外内存(避免OOM) ``` **计算逻辑**: 设集群可用核数 $C$,目标并发查询数 $Q$,则: $$ \text{spark.executor.instances} = \min \left( \frac{C}{4}, Q \times 2 \right) $$ 2. **并行度控制** 整分区数匹配并发需求: ```sql -- 手动设置Reduce阶段并行度 SET spark.sql.shuffle.partitions=200; -- 根据数据量动态整(推荐) SET hive.exec.reducers.bytes.per.reducer=256000000; -- 每个Reducer处理256MB ``` **原则**:`shuffle.partitions` ≥ `Executor数 × Executor核数 × 2` --- ### 三、查询层优化 1. **小文件合并** 减少Map Task数量,降低度开销: ```sql SET hive.merge.sparkfiles=true; SET hive.merge.smallfiles.avgsize=128000000; -- 128MB SET hive.merge.size.per.task=256000000; -- 256MB ``` 2. **MapJoin 优化** 提升小表关联效率,避免Shuffle: ```sql SET hive.auto.convert.join=true; SET hive.auto.convert.join.noconditionaltask.size=30000000; -- Spark下该值需比MR配置更小[^2] ``` 3. **倾斜处理** 解决数据倾斜导致的并发瓶颈: ```sql -- 启用倾斜优化 SET spark.sql.adaptive.skewJoin.enabled=true; SET spark.sql.adaptive.skewJoin.skewedPartitionFactor=5; -- 倾斜判定阈值 ``` --- ### 四、Shuffle 稳定性 1. **重试机制增强** 避免网络波动导致任务失败: ```properties spark.shuffle.io.maxRetries=5 # 重试次数提升[^4] spark.shuffle.io.retryWait=30s # 重试间隔延长 ``` 2. **Shuffle 传输优化** ```properties spark.reducer.maxSizeInFlight=96m # 提升Reduce拉取数据量 spark.shuffle.file.buffer=128k # 增大Shuffle写缓存 ``` --- ### 五、监控与验证 1. **监控指标** - YARN ResourceManager:观察队列资源使用率 - Spark History Server:分析 `Shuffle Write/Read` 时间 - Hive 日志:关注 `Total MapReduce CPU Time Spent` 2. **压测方法** ```sql -- 模拟并发查询 SET hive.exec.parallel=true; SET hive.exec.parallel.thread.number=16; -- 并发线程数 ``` --- ### 效果对比(示例) | 配置项 | 前 | 后 | 效果 | |----------------|--------------|--------------|--------------| | Executor 数量 | 10 | 20 | 并发提升 2x | | Shuffle 分区 | 100 | 200 | 负载均衡性↑ | | 查询延迟 | 120s | 45s | 响应速度↑ 62%| > **注**:实际效果因数据规模及集群硬件差异而不同,建议逐步整参数并监控稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值