sql Hive优化配置项(含建表属性)总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql Hive优化配置项(含建表属性)总结相关的知识,希望对你有一定的参考价值。

-- 实战任务配置
-- 注: hadoop相关的设置用1024, hive相关的用1000

-- 内存限制
set mapreduce.job.running.map.limit=500;
set mapreduce.job.running.reduce.limit=400;
set mapreduce.map.memory.mb=2048;
set mapreduce.reduce.memory.mb=4096;

-- join优化
set hive.auto.convert.join=true; -- 开启mapjoin自动转换
set hive.mapjoin.smalltable.filesize=50000000; -- 小表判定规则(50mb, 默认25mb)
-- n路join时, 如果n-1张小表总大小小于300mb, 直接转换成一个mapjoin
set hive.auto.convert.join.noconditionaltask.size=300000000;

-- 合并文件
set mapred.max.split.size=134217728;  -- 输入合并(map输入最大为128mb)
set mapred.min.split.size.per.node=52428800; -- 一个节点上split的至少的大小(50mb, 默认为1B)
set mapred.min.split.size.per.rack=52428800; -- 一个交换机下split的至少的大小(50mb, 默认为1B)
set hive.merge.smallfiles.avgsize=128000000; -- 小文件判定标准(128mb, block size一半即可, 默认16mb)
set hive.merge.mapfiles=true;  -- map端输出合并
set hive.merge.mapredfiles=true; -- reduce端输出合并
set hive.merge.size.per.task = 256000000 -- 合并文件的大小, 能够保证block size充分利用
set hive.merge.orcfile.stripe.level=false; -- orc小文件合并

-- 压缩
set hive.exec.compress.intermediate=true; -- (可选, 大表适用)map端输出压缩
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
set mapred.output.compress=true; -- reduce端结果压缩

-- 动态分区支持
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

-- 其它优化
set mapreduce.job.reduce.slowstart.completedmaps=1.0;
set hive.groupby.skewindata=true; -- group by倾斜处理

-- 资源隔离处理
set mapreduce.map.cpu.vcores=2;
set mapreduce.map.memory.mb=6144;
set mapreduce.map.java.opts=-Xmx4608M;
set mapreduce.reduce.cpu.vcores=4;
set mapreduce.reduce.memory.mb=8192;
set mapreduce.reduce.java.opts=-Xmx6144M;
set yarn.app.mapreduce.am.resource.cpu-vcores=3;
set yarn.app.mapreduce.am.resource.mb=8192;
set yarn.app.mapreduce.am.command-opts=-Xmx6144m;
set mapreduce.task.io.sort.mb=1024;

-- (可选, 重要或紧急任务适用)并行执行, 高优先级指定
set hive.exec.parallel = true;
set hive.exec.parallel.thread.number=16; -- 同一个sql允许最大并行度,默认为8。
SET mapreduce.job.priority=HIGH; -- 所有可用枚举值为:VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW

-- [废弃]Lzo压缩专用(由于orc暂不支持lzo压缩输出, 使用默认的zlib即可, 无需设置)
set mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
set io.compression.codecs=com.hadoop.compression.lzo.LzopCodec;
参考链接: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

![ORC建表属性配置](http://image.congyh.com/18-6-7/83867902.jpg)

例子

```sql
CREATE TABLE lxw1234_orc2 stored AS ORC 
TBLPROPERTIES
('orc.create.index'='true', -- 建立Row Group Index, 适用于范围过滤
"orc.bloom.filter.columns"="pcid[, col2]", -- 指定需要创建布隆过滤器的列, 适用于等值过滤
) 
AS 
SELECT CAST(siteid AS INT) AS id,
pcid 
FROM lxw1234_text
```
-- 配置项介绍的官网链接: https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
-- 配置项使用的官网链接: https://cwiki.apache.org/confluence/display/Hive/AdminManual+Configuration#AdminManualConfiguration-ConfiguringHive
-- 所有的配置属性都在HiveConf.java中管理, 可以在代码中看到所有的配置所选项.

-- 设置Hive MR任务并行运行
set hive.exec.parallel = true;
set hive.exec.parallel.thread.number=16; -- 同一个sql允许最大并行度,默认为8。

SET mapreduce.job.priority=HIGH; -- 所有可用枚举值为:VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW
-- 如果使用hadoop来调整优先级的话:
hadoop job -set-priority job_id    VERY_HIGH

set hive.groupby.skewindata=true; -- 解决group by数据倾斜的问题, 解决方法是第一轮reduce先不按照key进行分发, 而是随机负载均衡进行分发, 然后起一轮额外的reduce进行常规的汇总.

-- 开启动态分区, 并使用非strict模式, 允许完全的动态分区
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

-- 指定job运行队列
set mapreduce.job.queuename=队列名

-- 启动本地模式, 加速执行, 即不需要提交到集群执行的直接local mr
set hive.exec.mode.local.auto=true

-- limit抽样优化(缺点是有些数据可能永远访问不到)
set hive.limit.optimize.enable=true; -- 将针对查询对元数据进行抽样
set hive.limit.row.max.size=100000; -- 最多从10w行数据中抽样
set hive.limit.optimize.limit.file=10; -- 最多从10个文件中进行抽样

-- jvm调优
set mapred.job.reuse.jvm.num.tasks=10; -- 默认是1, 修改成-1则不受限制, 重用是任务顺序执行, 不用重新启动jvm
set mapreduce.map.java.opts=-Xmx2600M; -- jvm内存最大值上调为2600m, 默认为1536M
-- 实战任务配置, 无注释版

set mapreduce.job.running.map.limit=500;
set mapreduce.job.running.reduce.limit=400;
set mapreduce.map.memory.mb=2048;
set mapreduce.reduce.memory.mb=4096;
set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=50000000;
set hive.auto.convert.join.noconditionaltask.size=300000000;
set hive.merge.smallfiles.avgsize=128000000;
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task = 256000000;
set hive.merge.orcfile.stripe.level=false;
set mapred.output.compress=true;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set mapreduce.job.reduce.slowstart.completedmaps=1.0;
set hive.groupby.skewindata=true;

-- 可选
set hive.exec.parallel = true;
set hive.exec.parallel.thread.number=16; -- 同一个sql允许最大并行度,默认为8。
SET mapreduce.job.priority=HIGH; -- 所有可用枚举值为:VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW

以上是关于sql Hive优化配置项(含建表属性)总结的主要内容,如果未能解决你的问题,请参考以下文章

hive优化方法

Hive优化之Hive的配置参数优化

hive增加UpdateDelete支持

hive&hue优化

Hive优化总结

Hive SQL使用Skewed方式建表解决数据倾斜小记