-
优化HiveQL查询:
- 使用合适的文件格式(如ORC、Parquet)可以显著减少存储空间需求,并提高查询效率。
- 选择合适的压缩方式(如Snappy、GZIP),减少数据在磁盘和网络中的传输时间。
- 利用分区和分桶来减少查询需要扫描的数据量。
- 使用合适的JOIN类型和策略,尽量避免笛卡尔积。
- 使用Vectorization(向量化查询)来提高查询性能。
- 适当地使用物化视图来加速频繁的和复杂的查询。
-
优化数据存储:
- 根据查询模式,合理设计表的分区和分桶策略。
- 定期执行数据压缩和数据格式转换(如将文本文件转换为ORC或Parquet格式)。
- 对于频繁查询的列,可以考虑列式存储。
-
优化Hive配置:
- 调整Hive配置参数,如增加内存分配、调整执行引擎(使用Tez或Spark替代MapReduce)。
- 根据集群资源,合理设置MapReduce作业的参数(如map和reduce任务的数量、内存使用限制等)。
-
利用缓存:
- 利用Hive的LLAP(Live Long and Process)功能,对热数据进行内存缓存,加速查询响应。
-
监控和调试:
- 使用EXPLAIN命令查看查询执行计划,找出性能瓶颈。
- 监控Hive执行的MapReduce作业,分析任务执行的时间和资源消耗,进一步调优。
-
硬件和集群优化:
- 根据需要扩展或优化硬件资源(如增加内存、使用更快的存储)。
- 在集群管理工具(如Ambari或Cloudera Manager)中调整资源分配和任务调度策略。
--设置Hive的执行引擎。推荐使用tez
或spark
来代替默认的mr
(MapReduce),因为它们可以提供更好的性能。
set hive.execution.engine
: 推荐使用ORC
或Parquet
--设置是否压缩Hive写入的数据。将此设置为true
可以节省存储空间并减少写入时间。 set hive.exec.compress.output
:true;
--设置MapReduce作业的输出是否压缩。
set mapreduce.output.fileoutputformat.compress=true;
--设置为true
以启用查询的向量化执行,可以显著提高性能。
set hive.vectorized.execution.enabled
和 hive.vectorized.execution.reduce.enabled
--设置为true
以启用表达式求值的缓存,可以减少重复计算。
set hive.cache.expr.evaluationtrue=true;
--设置为true
以启用查询执行的并行处理。
set hive.exec.parallel=true;
--设置动态分区模式,nonstrict
模式允许不指定所有的分区列值。
set hive.exec.dynamic.partition.mode=true;
--增加map个数
set mapred.map.tasks=5;(最好还是调整split.size,更适配数据量)
set mapred.min.split.size=300000000;(默认块大小128M)
-- 增大reduce个数
set hive.exec.reducers.bytes.per.reducer=64000000;(设置好每个reducer处理数据量,自动适配reduce的个数)
-- 设置输出文件大小
set hive.merge.size.per.task=64000000;
矢量化查询优化
set hive.vectorized.execution.enabled = false;
一些情况下使用矢量优化会拖慢性能,默认关闭,vectorized优化支持的函数连接符等如下
arithmetic: +, -, *, /, % AND, OR, NOT comparisons <, >, <=, >=, =, !=, BETWEEN, IN ( list-of-constants ) as filters Boolean-valued expressions (non-filters) using AND, OR, NOT, <, >, <=, >=, =, != IS [NOT] NULL all math functions (SIN, LOG, etc.) string functions SUBSTR, CONCAT, TRIM, LTRIM, RTRIM, LOWER, UPPER, LENGTH type casts Hive user-defined functions, including standard and generic UDFs date functions (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, UNIX_TIMESTAMP) the IF conditional expression
官网:https://cwiki.apache.org/confluence/display/Hive/Vectorized+Query+Execution
这里解释也比较详尽:乱用Hive调优,你的任务越调优越慢 - 哔哩哔哩 (bilibili.com)