Hive Setting调优

本文详细介绍了Hive的性能调优,包括压缩设置、Mapper和Reducer的优化、Join操作的处理,如SMB Map Join和Skewjoin的解决策略,以及如何实现并行计算和其他相关配置,旨在全方位提升Hive的综合性能。

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

  • 压缩
a. 
set hive.exec.compress.intermediate=true;
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
解释:如果集群具有很好的CPU性能,但是网络带宽有限,这两个属性可以加速中间结果的交换。(如果集群具有很高的网络io延迟,那么这个选项应该被打开)
测试:

Q22
Q23
Q24
未压缩
2m9.787s
14m19.011s
4m41.635s
压缩
2m22.371s
13m57.379s
4m43.945s
结论:性能未见明显提升

b.
set hive.exec.compress.output=false;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec;
解释:默认是使得创建的结果表是否进行压缩,关系到可读性


Q22
Q23
Q24
未压缩
2m9.787s
14m19.011s
4m41.635s
压缩
2m14.084s
13m48.921s
4m40.755s
结论:  性能未见明显提升

c.
set hive.default.fileformat=TextFile;
解释:默认文件类型,未测试,应该影响不大。

  • Mapper settings
a.
set mapred.max.split.size=67108864;
set mapred.min.split.size=1;
解释:一个hive表包含的物理文件的数量与hive预测启动多少mapper数量无关,因为hive使用HiveCombineInputFormat来合并文件。上面两个参数是最能影响hive预测生成的mapper数量的,降低这些值会导致过多的map task,太高会导致过少的map task,系统利用率不高。两个极端都会影响性能。对于小数据集(1-100G),128M可能是个好的值。作为预测的话,使用中等表的大小除以想要利用的集群的map task数量。

10G Data:

Q22
Q23
Q24
8388608 (8MB)
1m40.767s
9m54.701s
4m54.342s
16777216 (16MB)
1m44.801s
10m45.015s
4m41.974s
33554432 (32MB)
2m0.222s
12m43.198s
4m36.464s
67108864 (64MB)
2m9.787s
14m19.011s
4m41.635s
134217728 (128MB)
2m51.450s
16m3.758s
4m43.410s

结论: 10G Data, Q22/Q23 随着mapred.max.split.size的减小而性能提升,Q24无明显性能提升

  • Reducer Settings
a.
set hive.exec.reducers.bytes.per.reducer=256000000;
解释:每个reducer处理的数据大小,如果input size是10G, 设置为1G,那么就会启动10个reducer

10G Data:

Q22
Q23
Q24
128000000
2m7.526s
13m44.007s
4m42.296s
256000000
2m9.787s
14m19.011s
4m41.635s
512000000
2m7.969s
13m45.184s
4m39.975s
结论: 性能未见明显提升

b.
set hive.exec.reducers.max=99999;
解释:可以使用的最大的reducer的数量,如果配置的是负值,hive将会使用999作为可以使用的最大的reducer数量。
结论: 从日志看,reducer数量远小于999,因此配置这个对性能影响应该不会太大。

  • join
a.
set hive.auto.convert.join=true;
解释: hive是否会根据输入文件大小将普通的join转为mapjoin,默认是true
测试:

Q22
开始执行数据清洗流程... 2025-06-27 18:08:35 [main] INFO c.s.service.SparkStreamingPipeline - runFromRabbitMQ被用,参数数量: 2 2025-06-27 18:08:35 [main] INFO c.s.service.SparkStreamingPipeline - 准备从RabbitMQ批量拉取 10 条消息... 2025-06-27 18:08:36 [main] INFO com.suwei.service.RabbitMQService - 批量接收消息完成,共接收 10 条消息 2025-06-27 18:08:36 [main] INFO c.s.service.SparkStreamingPipeline - 成功拉取到 10 条原始消息,开始数据清洗... 2025-06-27 18:08:36 [main] INFO o.a.spark.sql.internal.SharedState - Setting hive.metastore.warehouse.dir ('null') to the value of spark.sql.warehouse.dir. log4j:WARN No appenders could be found for logger (org.apache.htrace.core.Tracer). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 2025-06-27 18:08:36 [main] INFO o.a.spark.sql.internal.SharedState - Warehouse path is 'file:/E:/suwei/Model/BigData/spark-warehouse'. 2025-06-27 18:08:36 [main] INFO o.s.j.server.handler.ContextHandler - Started o.s.j.s.ServletContextHandler@6b4fd7d{/SQL,null,AVAILABLE,@Spark} 2025-06-27 18:08:36 [main] INFO o.s.j.server.handler.ContextHandler - Started o.s.j.s.ServletContextHandler@12723c5d{/SQL/json,null,AVAILABLE,@Spark} 2025-06-27 18:08:36 [main] INFO o.s.j.server.handler.ContextHandler - Started o.s.j.s.ServletContextHandler@7747cc1b{/SQL/execution,null,AVAILABLE,@Spark} 2025-06-27 18:08:36 [main] INFO o.s.j.server.handler.ContextHandler - Started o.s.j.s.ServletContextHandler@74bfdd66{/SQL/execution/json,null,AVAILABLE,@Spark} 2025-06-27 18:08:36 [main] INFO o.s.j.server.handler.ContextHandler - Started o.s.j.s.ServletContextHandler@1e9d7366{/static/sql,null,AVAILABLE,@Spark} 2025-06-27 18:08:37 [main] WARN o.a.spark.sql.SparkSession$Builder - Using an existing SparkSession; some spark core configurations may not take effect. 2025-06-27 18:08:38 [main] INFO o.a.s.s.c.e.codegen.CodeGenerator - Code generated in 185.4571 ms 2025-06-27 18:08:39 [main] INFO o.a.s.s.c.e.codegen.CodeGenerator - Code
最新发布
06-28
<think>我们正在处理SparkStreaming与RabbitMQ集成的数据清洗流程中的日志分析及化。根据引用[1],我们知道在Spark Streaming中整批处理时间间隔对性能有重要影响。同时,引用[3]提到事件驱动模型(如Reactor)适用于网络服务器,这可以类比到消息队列的消费者设计。步骤1:理解日志来源SparkStreaming从RabbitMQ拉取消息时,通常使用RabbitMQ的消费者客户端。日志可能包括: -连接建立/断开日志-消息拉取频率和批量大小-消息处理延迟-错误日志(如连接失败、反序列化错误等)步骤2:关键日志分析点1.连接稳定性:检查是否有频繁重连,可能涉及网络问题或认证问题。2.消息拉取情况:记录每个批次拉取的消息数,与预期配置是否一致。3.处理延迟:记录从拉取到处理完成的时间,对比批处理间隔。4.错误日志:特别注意反序列化错误、队列不存在等。步骤3:化建议根据引用[1]中关于批处理间隔的整经验,我们可以: -整批处理间隔:避免过短(增加开销)或过长(影响实时性)。初始建议设置为2-5秒,然后根据监控整。 -整拉取批量大小:RabbitMQ消费者可以配置每次拉取的消息数,应匹配Spark Streaming的批处理能力。 -资源动态配:如引用[1]中微博案例,结合集群资源动态整。另外,引用[3]提到事件驱动模型,我们可以化消费者线程模型(如使用Reactor模式),避免阻塞。步骤4:日志分析示例假设我们有以下日志片段(模拟):``` INFORabbitMQConsumer: Connectedto rabbitmq://host:5672INFORabbitMQConsumer:Starting consumerforqueue 'data_queue' INFOMicroBatchExecutor: Startingbatch15(offset range:1000-1500)with500messagesWARN RabbitMQConsumer: Slowprocessingdetected inbatch15,took4500ms(expected<3000ms) ERRORRabbitMQConsumer: Deserializationfailed formessage id=12345, skipping```分析:-批次15处理时间4500ms超过预期3000ms,可能成为瓶颈。-反序列化错误需要检查数据格式。化行动:1.针对慢处理:增加分区数(如果分区不足),或化清洗逻辑(如使用mapPartitions减少重复初始化)。2.反序列化错误:添加异常处理,将错误消息转到死信队列,避免阻塞后续消息。步骤5:监控指标根据引用[1]提到的性能评测指标(如吞吐量),我们应监控: -输入速率(RabbitMQ消息到达率) -处理速率(SparkStreaming处理的消息数/秒)-度延迟(消息在队列中等待时间)-处理延迟(从拉取到处理完成的时间)我们可以使用Spark Streaming自带的监控界面,或集成Prometheus等工具。步骤6:代码层面化在Spark Streaming中,我们可以通过以下方式化RabbitMQ集成:-使用直接流(DirectStream)方式,精确控制每个批次的偏移量。 -使用高性能的序列化格式(如Avro、Protobuf)。示例代码片段(使用Spark-RabbitMQ连接器): ```scalaimportorg.apache.spark.streaming.rabbitmq._val stream= RabbitMQUtils.createStream(ssc, params, message=>newString(message))//然后进行数据清洗valcleaned =stream.map(...).filter(...) ```注意:确保使用可靠的连接器(如Spark-RabbitMQconnector)并配置自动恢复。最后,生成相关问题。</think>### Spark Streaming 与 RabbitMQ 集成中的数据清洗日志分析及化建议 #### 一、日志关键信息分析 在 Spark Streaming 从 RabbitMQ 拉取消息的流程中,需重点关注以下日志类型: 1. **连接与认证日志** - RabbitMQ 连接状态:`INFO RabbitMQConsumer: Connected to amqp://user@host:5672/vhost` - 认证失败警告:`WARN Connection: Authentication failure (code=ACCESS_REFUSED)` *需验证凭据和 vhost 权限 [^2]* 2. **消息拉取性能日志** - 批次延迟警告:`WARN MicroBatchExecutor: Batch 15 took 4500ms (> batch_interval=2000ms)` - 积压警报:`WARN RabbitMQSource: Queue backlog=12,500 msgs (> threshold=10,000)` *反映实时性瓶颈 [^1]* 3. **数据异常日志** - 反序列化错误:`ERROR Deserializer: Invalid JSON format in msgId=7x83a` - 清洗过滤统计:`INFO Cleanser: Filtered 23% messages (schema mismatch)` *指示数据质量问题* 4. **资源使用日志** - 执行器溢出:`WARN Executor: Spilling in-memory map (size=1.2GB/>1GB limit)` - 垃圾回收:`INFO GC: ParNew GC took 320ms (frequency↑)` *反映内存压力 [^3]* #### 二、化建议 基于日志分析的核心化方向: 1. **批处理间隔动态整** - 初始设置公式:$$ batch\_interval = \frac{avg\_msg\_size \times msg\_rate}{core\_throughput} $$ - 实施动态节(参考引用[1]案例): ```python if backlog > threshold: batch_interval = max(500ms, current - 10%) # 加速处理 elif cpu_usage < 40%: batch_interval = min(5000ms, current + 20%) # 减少度开销 ``` 2. **消费者并行化化** - 分区策略整: ```scala val streams = (0 until parallelism).map { i => RabbitMQUtils.createStream(ctx, params.copy(queueName = s"queue_$i")) } val unifiedStream = ctx.union(streams) ``` - 根据 `Partition backlog imbalance detected` 日志整分区数 3. **数据清洗加速策略** - 序列化化:采用二进制格式(如 Protobuf)替代 JSON - 异常处理管道化: ```python # 坏数据直接转入死信队列 .transform(rdd => rdd.pipe("dead_letter_handler.py")) ``` 4. **资源弹性配置** - 内存公式:$$ executor\_memory = \frac{batch\_size \times msg\_size \times safety\_factor}{cores} $$ - 启用背压机制:`spark.streaming.backpressure.enabled=true` #### 三、监控指标体系 建立实时监控看板,关键指标包括: | 指标类型 | 计算公式 | 健康阈值 | |-------------------|-----------------------------------|----------------| | 消费吞吐量 | $$ \frac{msg\_processed}{batch\_interval} $$ | ≥ 队列输入速率 | | 端到端延迟 | $$ process\_end\_time - msg\_timestamp $$ | < 2×batch_interval | | 错误率 | $$ \frac{error\_count}{total\_msg} \times 100\% $$ | < 0.1% | *通过 Grafana 可视化指标波动与日志事件联动 [^1]* #### 四、故障诊断流程 ```mermaid graph TD A[发现延迟升高日志] --> B{检查队列积压} B -->|积压高| C[增加分区/批处理] B -->|无积压| D{检查GC日志} D -->|GC频繁| E[整内存比例] D -->|GC正常| F[检查数据倾斜] ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值