<Zhuuu_ZZ>HIVE(十三)性能调优

一 Hive性能调优工具 - EXPLAIN

  • EXPLAIN:显示查询语句的执行计划,但不运行
  • 语法
EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] hive_query
  • EXTENDED
    • 提供执行计划关于操作的额外信息,比如文件路径
  • DEPENDENCY
    • 提供JSON格式输出,包括查询所依赖的表和分区列表
  • AUTHORIZATION
    • 列出所有需要授权的实体,包括查询的输入输出和授权失败
  • 通过工具生成可视化执行计划
    在这里插入图片描述
explain select * from employee_partition;

在这里插入图片描述

二 Hive性能调优工具 - ANALYZE

  • ANALYZE:分析表数据,用于执行计划选择的参考
    • 收集表的统计信息,如行数、最大值等
    • 使用时调用该信息加速查询
  • 语法
analyze table employee compute statistics;

在这里插入图片描述

analyze table employee_partition 
partition(country="china",add="LiaoNing") compute statistics;

在这里插入图片描述

ANALYZE TABLE employee_id COMPUTE STATISTICS FOR COLUMNS id;

在这里插入图片描述

三 Hive优化设计

  • 使用分区表、桶表
  • 使用索引
  • 使用适当的文件格式,如orc, avro, parquet
  • 使用适当的压缩格式,如snappy
  • 考虑数据本地化 - 增加一些副本
  • 避免小文件
  • 使用spark代替MapReduce
  • 使用Hive LLAP(在内存中读取缓存)
  • 考虑在不需要时关闭并发

四 Job优化 - 本地模式(强烈推荐)

  • Hive支持将作业自动转换为本地模式运行
    • 当要处理的数据很小时,完全分布式模式的启动时间比作业处理时间要长
-- 通过以下设置开启本地模式
SET hive.exec.mode.local.auto=true; --default false 
SET hive.exec.mode.local.auto.inputbytes.max=50000000; 
SET hive.exec.mode.local.auto.input.files.max=5; --default 4
  • 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中运行
-- 通过以下设置开启JVM重用
set mapred.job.reuse.jvm.num.tasks = 5;  -- 默认值为1

六 Job优化 - 并行执行

  • 并行执行可提高集群利用率
    • Hive查询通常被转换成许多按默认顺序执行的阶段
    • 这些阶段并不总是相互依赖的
    • 它们可以并行运行以节省总体作业运行时间
    • 如果集群的利用率已经很高,并行执行帮助不大
-- 通过以下设置开启并行执行
SET hive.exec.parallel=true;  -- default false 
SET hive.exec.parallel.thread.number=16;  -- default 8,定义并行运行的最大数量

七 查询优化

  • 自动启动Map端Join
  • 防止数据倾斜
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;	
  • 启动Vectorization(矢量化)
set hive.vectorized.execution.enabled = true; 
set hive.vectorized.execution.reduce.enabled = true;
  • 使用CTE、临时表、窗口函数等正确的编码约定、

八 压缩算法

  • 减少传输数据量,会极大提升MapReduce性能
    • 采用数据压缩是减少数据量的很好的方式
  • 常用压缩方法对比
    在这里插入图片描述
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值