HiveQL从Map/Reduce的运行角度来考虑优化性能,从更底层思考如何优化运算性能.
2.1列裁剪
HiveQL只读所需要的列,而忽略其它列。节省了读开销,中间表存储开销和数据整合开销。
裁剪所对应的参数项为:hive.optimize.cp=true(默认值为真)
2.2分区裁剪
查询中减少不必要的分区。如:
SELECT * FROM (SELECTT a,COUNT(1) FROM b GROUP BY a) c WHERE c.dt=’2020-04-09’; #(多余分区)
SELECT * FROM a JOIN (SELECT * FROM b) c ON (a.a1=b.a2) WHERE c.dt=’2020-04-09’;
若将“c.dt=’2020-04-09”分区条件放入子查询中更为高效,减少了读入分区数目。 Hive 自动执行这种裁剪优化。
分区参数为:hive.optimize.pruner=true(默认值为真)
2.3 JOIN操作
在有join操作的查询语句中,应将条目少的表/子查询放在 Join 操作符的左边。 因为在 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,载入条目较少的表可以有效减少 OOM(out of memory)即内存溢出。
2.4map join操作
Join 操作在 Map 阶段完成,不再需要Reduce。
相关的参数为:
hive.join.emit.interval = 1000
hive.mapjoin.size.key = 10000
hive.mapjoin.cache.numrows = 10000
2.5GROUP BY操作
(1)Map端部分聚合:聚合操作都可以先在Map端进行部分聚合,然后reduce端得出最终结果.
hive.map.aggr=true用于设定是否在 map 端进行聚合,默认值为真
hive.groupby.mapaggr.checkinterval=100000用于设定 map 端进行聚合操作的条目数
(2)有数据倾斜时进行负载均衡:
设定 hive.groupby.skewindata= true ,生成两 个 MapReduce 任务查询计划。第一个 map 的输出结果集合会随机分布到 reduce 中, 每个 reduce 做部分聚合操作,并输出结果。这样相同的 Group By Key 有可 能分发到不同的 reduce 中,从而达到负载均衡的目的;第二个根据预处理的数据结果将相同的 Group By Key 分布到同一个 reduce 中,最后完成最终的聚合操作。
2.6合并小文件
小文件容易在文件存储端造成瓶颈,给 HDFS 带来压力,影响处理效率。可以通过合并Map和Reduce的结果文件来消除影响。
设置合并小文件属性的参数有:
合并Map输出文件:hive.merge.mapfiles=true(默认值为真)
合并Reduce 端输出文件:hive.merge.mapredfiles=false(默认值为假)
合并文件的大小:hive.merge.size.per.task=25610001000(默认值为 256000000)
HiveQL配置文件优化策略
最新推荐文章于 2022-05-17 16:51:30 发布