文章目录
一.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 | 是 | 小 | 慢 |