hive参数调优汇总

本文介绍了Hive的参数调优方法,重点关注Map端部分聚合。通过设置hive.map.aggr=true启用Map端聚合,调整hive.groupby.mapaggr.checkinterval以控制聚合条目数目。对于数据倾斜问题,启用hive.groupby.skewindata=true,使用两阶段MR Job实现负载均衡,确保相同Group By Key在Reduce中的正确聚合。

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

参考:http://blog.youkuaiyun.com/beckham008/article/details/23741151?utm_source=tuicool&utm_medium=referral

1.设置合理solt数

mapred.tasktracker.map.tasks.maximum 
每个tasktracker可同时运行的最大map task数,默认值2。

mapred.tasktracker.reduce.tasks.maximum
每个tasktracker可同时运行的最大reduce task数,默认值1。

2.配置磁盘块
mapred.local.dir
map task中间结果写本地磁盘路径,默认值${hadoop.tmp.dir}/mapred/local。
可配置多块磁盘缓解写压力。当存在多个可以磁盘时,Hadoop将采用轮询方式将不同的map task中间结果写到磁盘上。

3.配置RPC Handler数
mapred.job.tracker.handler.count
jobtracker可并发处理来自tasktracker的RPC请求数,默认值10。

4.配置HTTP线程数
tasktracker.http.threads
HTTP服务器的工作线程数,用于获取map task的输出结果,默认值40。

5.启用批调度

6.选择合适的压缩算法
Job输出结果是否压缩
mapred.output.compress 
是否压缩,默认值false。
mapred.output.compression.type
压缩类型,有NONE, RECORD和BLOCK,默认值RECORD。
mapred.output.compression.codec
压缩算法,默认值org.apache.hadoop.io.compress.DefaultCodec。

map task输出是否压缩
mapred.compress.map.output
是否压缩,默认值false
mapred.map.output.compression.codec
压缩算法,默认值org.apache.hadoop.io.compress.DefaultCodec。

7.设置失败容忍度
mapred.max.map.failures.percent
例如:set mapred.max.map.failures.percent=30; 
作业最多允许失败的map task比例,默认值0。
mapred.max.reduce.failures.percent
作业最多允许失败的reduce task比例,默认值0。
mapred.map.max.attempts
一个map task的最多重试次数,默认值4。
mapred.reduce.max.attempts
一个reduce task的最多重试次数,默认值4。

8.设置跳过坏记录
mapred.skip.attempts.to.start.skipping
当任务失败次数达到该值时,启用跳过坏记录功能,默认值2。
mapred.skip.out.dir
检测出的坏记录存放目录,默认值为输出目录的_logs/skip,设置为none表示不输出。
mapred.skip.map.max.skip.records
map task最多允许的跳过记录数,默认值0。
mapred.skip.reduce.max.skip.groups
reduce task最多允许的跳过记录数,默认值0。

9.配置jvm重用
mapred.job.reuse.jvm.num.tasks 
一个jvm可连续启动多个同类型任务,默认值1,若为-1表示不受限制。

10.配置jvm参数
mapred.child.java.opts
任务启动的jvm参数,默认值-Xmx200m,建议值-XX:-UseGCOverheadLimit -Xms512m -Xmx2048m -verbose:gc -Xloggc:/tmp/@taskid@.gc

11. map task调优
io.sort.mb
默认值100M
io.sort.record.percent
默认值0.05
io.sort.spill.percent
默认值0.80

12.reduce task调优
io.sort.factor
默认值10
mapred.reduce.parallel.copies
默认值5



=================================================================================
  1 .设置任务名称,方便查找监控 
  SET mapred.job.name=P_DWA_D_IA_S_USER_PROD; 
  
 
  2 .决定是否可以在 Map 端进行聚合操作 
  set hive.map.aggr=true; 
  
 
  3 .有数据倾斜的时候进行负载均衡 
  set hive.groupby.skewindata=true; 
  
 
  H iveQL 去重操作 
  和 SQL一样,HiveQL中同样支持DISTINCT操作,如下示例: 
  ( 1) SELECT count(DISTINCT uid) FROM log 
  ( 2) SELECT ip, count(DISTINCT uid) FROM log GROUP BY ip 
  ( 3) SELECT ip, count(DISTINCT uid, uname) FROMlog GROUP BY ip 
  ( 4) SELECT ip, count(DISTINCTuid), count(DISTINCT uname) FROMlog GROUP BY ip 
  
 
  当 我们使用Hive QL中的去重关键字DISTINCT时,需要注意的一点是: 
  在 多个列上进行的去重操作与hive环境变量hive.groupby.skewindata存在关系。 
  当 hive.groupby.skewindata=true时,hive不支持多列上的去重操作,并报错: 
  E rror in semantic analysis: DISTINCT on different columns notsupported with skew in data.  
  注 意:上面示例中的(3)不属于多列上的DISTINCT操作。 
  
 
  G roup By 语句 
  • Map 端部分聚合:
  • 并不是所有的聚合操作都需要在 Reduce 端完成,很多聚合操作都可以先在 Map 端进行部分聚合,最后在 Reduce端得出最终结果。
  • 基于 Hash
  • 参数包括:
  • hive.map.aggr = true 是否在 Map 端进行聚合,默认为True
  • hive.groupby.mapaggr.checkinterval =100000 在 Map 端进行聚合操作的条目数目
  • 有数据倾斜的时候进行负载均衡
  • hive.groupby.skewindata = false
  • 当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group ByKey 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce中),最后完成最终的聚合操作。
  4 .每个MapReduce作业的任务可以申请的内存资源数量 
  SET mapreduce.map.memory.mb=2048; 
  每 个MapReduce作业的map任务可以申请的内存资源数量 
  SET mapreduce.reduce.memory.mb=8192; 
  每 个MapReduce作业的reduce任务可以申请的内存资源数量 
  
  5.对于简单的不需要聚合的类似SELECT <col> from <table> LIMIT n语句,不需要起MapReduce job,直接通过Fetch task获取数据
set hive.fetch.task.conversion=more;
  
合并小文件
6. hive.merge.mapredfiles(默认为false)
正常的map-reduce job后,是否启动merge job来合并reduce端输出的结果,建议开启

set mapred.max.split.size=524288000;
set mapred.min.split.size.per.node=471859200;
set mapred.min.split.size.per.rack=471859200;
set hive.hadoop.supports.splittable.combineinputformat=true;     
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 

注:第四个参数存在其他参数才能生效
  

7.设置参数不走map-reduce
set hive.fetch.task.conversion=more;
 
8.hive动态分区参数设置
ive.exec.dynamic.partition=true
默认值:false
描述:是否允许动态分区
hive.exec.dynamic.partition.mode=nonstrict
默认值:strict
描述:strict是避免全分区字段是动态的,必须有至少一个分区字段是指定有值的
设置如下参数配置动态分区的使用环境:
hive.exec.max.dynamic.partitions.pernode=100
默认值:100
描述:each mapper or reducer可以创建的最大动态分区数
hive.exec.max.dynamic.partitions=1000
默认值:1000
描述:一个DML操作可以创建的最大动态分区数
hive.exec.max.created.files=100000
默认值:100000
描述:一个DML操作可以创建的文件数

  =============================================================================================================
### Hive 性能的最佳实践 #### 合理设置执行引擎 为了提升Hive查询的执行效率,可以选择更高效的执行引擎。`hive.execution.engine` 参数决定了使用的执行框架,在处理大规模数据集时推荐采用Tez作为执行引擎[^4]。 ```sql SET hive.execution.engine=tez; ``` 这有助于充分利用集群资源,加速复杂查询过程中的计算任务完成速度。 #### 更新统计信息 利用 `ALTER TABLE` 命令维护表结构的同时也应关注统计数据的准确性。精确的元数据可以帮助Hive编译器构建最查询计划,进而改善整体性能表现[^1]。 ```sql ANALYZE TABLE table_name COMPUTE STATISTICS; ``` 此命令用于收集有关整个表格的信息;对于分区表,则可通过指定具体分区来获取相应部分的数据特征: ```sql ANALYZE TABLE table_name PARTITION (partition_spec) COMPUTE STATISTICS; ``` #### 维护最新分区信息 针对含有大量分区的大规模分布式存储环境而言,保持最新的分区列表至关重要。定期执行 `MSCK REPAIR TABLE` 可确保新增加或修改过的分区被正确识别并加入到现有架构之中。 ```sql MSCK REPAIR TABLE table_name; ``` #### 减少小文件数量 过多的小型文件会对I/O造成压力,影响读取速率。借助于 `COMPACT` 或者 `OPTIMIZE` 操作可以有效地合并零碎文件片段,降低磁盘访问频率,增强吞吐量。 ```sql ALTER TABLE table_name COMPACT 'MAJOR'; -- OR -- OPTIMIZE table_name ZORDER BY column_list; ``` ZOrdering是一种特别有效的技术,它不仅减少了不必要的Shuffle操作次数,而且还能促进更好的压缩效果。 #### 单次扫描多用途 当面对同一张表需实施多项独立却又相互关联的操作需求时,尽可能尝试一次性完成全部工作流程而非分批逐步推进。这样做的好处是可以节省重复加载相同数据所带来的开销成本,提高总体工作效率[^5]。 例如,可以在同一个CTAS(Create Table As Select)语句里实现过滤、转换以及汇总等多项逻辑运算: ```sql CREATE TABLE new_table AS SELECT * FROM source_table WHERE condition GROUP BY group_columns HAVING having_condition; ``` #### 数据倾斜处理策略 遇到因键分布不均而导致的部分节点负载过重情况时,可以通过整Join方式(如Map Join)、增加广播变量或是重新分配Key等方式缓解此类现象带来的负面影响。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值