一 Hive性能调优工具 - EXPLAIN
- EXPLAIN:显示查询语句的执行计划,但不运行
- 语法
EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] hive_query
- EXTENDED
- DEPENDENCY
- 提供JSON格式输出,包括查询所依赖的表和分区列表
- AUTHORIZATION
- 列出所有需要授权的实体,包括查询的输入输出和授权失败
- 通过工具生成可视化执行计划
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8cf2f4478907474336667481ac89479a.png)
explain select * from employee_partition;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/34f16d08f4337abd53dc77c9b9e110aa.png)
二 Hive性能调优工具 - ANALYZE
- ANALYZE:分析表数据,用于执行计划选择的参考
- 收集表的统计信息,如行数、最大值等
- 使用时调用该信息加速查询
- 语法
analyze table employee compute statistics;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a40b9f1f82542c31c838aa3594ad08e6.png)
analyze table employee_partition
partition(country="china",add="LiaoNing") compute statistics;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3781846cb51f9360123ae892d81886fc.png)
ANALYZE TABLE employee_id COMPUTE STATISTICS FOR COLUMNS id;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bc96e6d3f0c69890dd86f2b0d21ed971.png)
三 Hive优化设计
- 使用分区表、桶表
- 使用索引
- 使用适当的文件格式,如orc, avro, parquet
- 使用适当的压缩格式,如snappy
- 考虑数据本地化 - 增加一些副本
- 避免小文件
- 使用spark代替MapReduce
- 使用Hive LLAP(在内存中读取缓存)
- 考虑在不需要时关闭并发
四 Job优化 - 本地模式(强烈推荐)
- Hive支持将作业自动转换为本地模式运行
- 当要处理的数据很小时,完全分布式模式的启动时间比作业处理时间要长
SET hive.exec.mode.local.auto=true;
SET hive.exec.mode.local.auto.inputbytes.max=50000000;
SET hive.exec.mode.local.auto.input.files.max=5;
- Job必须满足以下条件才能在本地模式下运行
- Job总输入大小小于 hive.exec.mode.local.auto. inputbytes.max
- map任务总数小于 hive.exec.mode.local.auto. input.files.max
- 所需的Reduce任务总数为1或0(set mapreduce.job.reduces=1;)
五 Job优化 - JVM重用(JVM Reuse)
- 通过JVM重用减少JVM启动的消耗
- 默认每个Map或Reduce启动一个新的JVM
- Map或Reduce运行时间很短时,JVM启动过程占很大开销
- 通过共享JVM来重用JVM,以串行方式运行MapReduce Job
- 适用于同一个Job中的Map或Reduce任务
- 对于不同Job的任务,总是在独立的JVM中运行
set mapred.job.reuse.jvm.num.tasks = 5;
六 Job优化 - 并行执行
- 并行执行可提高集群利用率
- Hive查询通常被转换成许多按默认顺序执行的阶段
- 这些阶段并不总是相互依赖的
- 它们可以并行运行以节省总体作业运行时间
- 如果集群的利用率已经很高,并行执行帮助不大
SET hive.exec.parallel=true;
SET hive.exec.parallel.thread.number=16;
七 查询优化
set hive.optimize.skewjoin=true;
- 启用CBO(Cost based Optimizer)
set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
八 压缩算法
- 减少传输数据量,会极大提升MapReduce性能
- 常用压缩方法对比
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/64bd2f24ac62f9ebde5788a93772a03f.png)