Hive(八)之 性能优化

8.性能优化

8.1 Hive事务

1.事务(Transaction )指一组单元化操作,这些操作要么都执行,要么都不执行

ACID特性:

  • Atomicity:原子性
  • Consistency:一致性
  • Isolation:隔离性
  • Durability:持久性

2.Hive事务的特点和局限

  • V0.14版本开始支持行级事务
    • 支持INSERT、DELETE、UPDATE(v2.2.0开始支持Merge)
    • 文件格式只支持ORC
  • 局限
    • 表必须是bucketed表
    • 需要消耗额外的时间、资源和空间
    • 不支持开始、提交、回滚、桶或分区列上的更新
    • 锁可以为共享锁或排它锁(串联的而不是并发)
    • 不允许从一个非ACID连接读写ACID表
    • 使用较少

3. Hive事务的开启和设置

  • 通过Hive命令行方式设置,当前session有效
  • 通过配置文件设置,全局有效
  • 通过UI工具(如Ambari)设置
-- 通过命令行方式开启事务
set hive.support.concurrency = true;
set hive.enforce.bucketing = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on = true;
set hive.compactor.worker.threads = 1; 
-- 通过配置文件hive-site.xml
<property> 
<name>hive.support.concurrency</name> 
<value>true</value>
 </property>
 <property> 
<name>hive.txn.manager</name> <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>

在这里插入图片描述

8.2 Hive PLSQL

  • Hive PLSQL:Hive存储过程(v2.0之后)
    • 支持SparkSQL和Impala
    • 兼容Oracle、DB2、MySQL、TSQL标准
    • 使将现有的过程迁移到Hive变得简单和高效
    • 使编写UDF不需要Java技能
    • 它的性能比Java UDF稍微慢一些
    • 功能较新
  • 在Hive2 bin目录下运行./hplsql
./hplsql -f plsql_demo.pl
RETURNS STRING 
BEGIN RETURN 'Hello, ' || text || '!'; 
END;
Print hello(' word') 

CREATE PROCEDURE getCount()
BEGIN DECLARE cnt INT = 0;	
SELECT COUNT(*) INTO cnt FROM employee;
PRINT 'Users cnt: ' || cnt;
END;
call getCount();

8.3 Hive性能调优工具

1.EXPLAIN
在这里插入图片描述

2.ANALYZE

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

ANALYZE TABLE employee_partitioned 
PARTITION(year=2014, month=12) COMPUTE STATISTICS;

ANALYZE TABLE employee_id COMPUTE STATISTICS 
FOR COLUMNS employee_id;

8.4 Hive优化设计

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

8.5 Job优化

1.本地模式运行

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

2.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

3.并行执行

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

8.6 查询优化

  • 自动启动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、临时表、窗口函数等正确的编码约定

8.7 压缩算法

  • 减少传输数据量,会极大提升MapReduce性能
  • 采用数据压缩是减少数据量的很好的方式
  • 常用压缩方法对比
压缩方式 可分割 压缩后大小 压缩解压速度
gzip
lzo
snappy
bzip2

猜你喜欢

转载自blog.csdn.net/zmzdmx/article/details/108742998