Hive函数及性能优化

一.Hive函数分类

从输入输出角度分类

  • 标准函数:一行数据中的一列或多列为输入,结果为单一值
  • 聚合函数:多行的零列到多列为输入,结果为单一值
  • 表生成函数:零个或多个输入,结果为多列或多行

从实现方式分类

  • 内置函数
  • 自定义函数
  • 1)UDF:自定义标准函数
  • 2)UDAF:自定义聚合函数
  • 3)UDTF:自定义表生成函数

内置函数
Hive提供大量内置函数供开发者使用

  • 标准函数
  • 1)字符函数
  • 2)类型转换函数
  • 3)数学函数
  • 4)日期函数
  • 5)集合函数
  • 6)条件函数
  • 聚合函数
  • 表生成函数

查看函数用法的命令:desc function 函数名;
详情请看hive函数大全:hive函数大全

二.Hive UDF开发流程

1)继承UDF类或GenericUDF类
2)重写evaluate()方法并实现函数逻辑
3)编译打包为jar文件
4)上传到正确的HDFS路径或linux本地路径
5)使用jar创建临时/永久函数
6)调用函数

临时函数:临时创建,退出终端后函数消失,在函数的有效期内,所有的数据库都可以使用;
永久函数:永久性使用,需要将jar包放到hdfs上,切换到其他数据库不可用;
练习请看如下链接:hive自定义函数

三.Hive事务

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

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

Hive事务的特点和局限
V0.14版本开始支持行级事务

  • 支持INSERT、DELETE、UPDATE(v2.2.0开始支持Merge)
  • 文件格式只支持ORC

局限

  • 表必须是bucketed表
  • 需要消耗额外的时间、资源和空间
  • 不支持开始、提交、回滚、桶或分区列上的更新
  • 锁可以为共享锁或排它锁(串联的而不是并发)
  • 不允许从一个非ACID连接读写ACID表
  • 使用较少

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>

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();

四. Hive性能调优

1.Hive性能调优工具 - EXPLAIN

EXPLAIN:显示查询语句的执行计划,但不运行
语法:

EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] hive_query
  • EXTENDED:提供执行计划关于操作的额外信息,比如文件路径
  • DEPENDENCY:提供JSON格式输出,包括查询所依赖的表和分区列表
  • AUTHORIZATION:列出所有需要授权的实体,包括查询的输入输出和授权失败
    通过工具生成可视化执行计划

2.Hive性能调优工具 - 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;

3.Hive优化设计

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

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

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

6.Job优化 - 并行执行

并行执行可提高集群利用率

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

7.查询优化

自动启动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.数据倾斜

某些节点计算的能力较差或者由于此节点需要计算的数据比较多,导致数据倾斜
在hive中产生数据倾斜的场景:

  • 1.group by产生数据倾斜-->开启Map端聚合参数设置
  • 2.大表和小表进行join操作-->使用mapjoin 将小表加载到内存
  • 3.空值产生的数据倾斜-->1)id为空的不参与关联2)给空值分配随机的key值
  • 4.小文件过多或文件过于复杂-->合理设置map和reduce数

9.压缩算法

减少传输数据量,会极大提升MapReduce性能:采用数据压缩是减少数据量的很好的方式
常用压缩方法对比如下表:

压缩方式 可分割 压缩后大小 压缩解压速度
gzip
lzo
snappy
bzip2

猜你喜欢

转载自blog.csdn.net/sun_0128/article/details/107309656