Hive性能调优

it2023-06-01  67

一、存储优化,选用ORC text:行存储,默认不压缩,序列化、反序列化开销大 sequence:行存储,二进制,压缩率底 RCfile:行分块,列式存储,解压效率差,读取稍慢 Parquet:列式存储,压缩比率高,但比ORC差,存取速度快 ORC:行分块,列式存储,压缩快,存取快,压缩率最高,RCfile升级版

二、表设计优化 1、创建分区表 2、创建桶表 3、拆分不同的表存储

三、sql参数优化

1、作业有多个可并行的job时,设置任务并行及并行个数: // 开启任务并行执行 set hive.exec.parallel=true; // 同一个sql允许并行任务的最大线程数 set hive.exec.parallel.thread.number=8;

2、修改reduce、map个数, (一般情况下不会修改此参数,可能会造成很多小文件,或者如果reduce资源不够会一直等待,除非比较特殊的任务,前提是排除sql逻辑及数据问题) 设置每个reduce处理的数据量 set hive.exec.reducers.bytes.per.reducer=104857600; 设置reduce个数 set mapred.reduce.tasks=1; 调整最大限制个数 set hive.exec.reducers.max;

3、使用mapjoin set hive.auto.convert.join = true; set hive.mapjoin.smalltable.filesize=50000000; – 默认是25M set hive.auto.convert.join.noconditionaltask = true; – 默认值 set hive.auto.convert.join.noconditionaltask.size = 10000000; --默认值

4、使用TEZ查询引擎 set hive.execution.engine=tez;

5、合并输入输出小文件 –输出合并小文件 set hive.merge.mapredfiles=true; set hive.merge.smallfiles.avgsize=512000000; set hive.merge.size.per.task=1024000000; --默认值 256M – 输入合并小文件,也用于调节map数量 set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --默认值 set mapred.max.split.size=512000000; set mapred.min.split.size.per.node=256000000; set mapred.min.split.size.per.rack=256000000; set mapred.min.split.size=256000000;

6、数据倾斜 set hive.map.aggr=true;–在map中会做部分聚集操作,效率更高但需要更多的内存。 set hive.groupby.skewindata=true;

如果以上不管用,可以对倾斜的数据进行单独的sql处理。

四、sql优化 1、使用union+group by 替代 union 2、大小表使用mapjoin 3、用in 替代join查询 4、从逻辑上看有无优化的点

最新回复(0)