博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive函数及性能优化
阅读量:4160 次
发布时间:2019-05-26

本文共 4009 字,大约阅读时间需要 13 分钟。

文章目录

一.Hive函数分类

从输入输出角度分类

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

从实现方式分类

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

内置函数

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

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

查看函数用法的命令:desc function 函数名;

详情请看hive函数大全:

二.Hive UDF开发流程

1)继承UDF类或GenericUDF类

2)重写evaluate()方法并实现函数逻辑
3)编译打包为jar文件
4)上传到正确的HDFS路径或linux本地路径
5)使用jar创建临时/永久函数
6)调用函数
临时函数:临时创建,退出终端后函数消失,在函数的有效期内,所有的数据库都可以使用;
永久函数:永久性使用,需要将jar包放到hdfs上,切换到其他数据库不可用;
练习请看如下链接:

三.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
hive.support.concurrency
true
hive.txn.manager
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager

Hive PLSQL:Hive存储过程(v2.0之后)

  • 支持SparkSQL和Impala
  • 兼容Oracle、DB2、MySQL、TSQL标准
  • 使将现有的过程迁移到Hive变得简单和高效
  • 使编写UDF不需要Java技能
  • 它的性能比Java UDF稍微慢一些
  • 功能较新

在Hive2 bin目录下运行./hplsql

./hplsql -f plsql_demo.plRETURNS 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

转载地址:http://xcjxi.baihongyu.com/

你可能感兴趣的文章
Online Multi-Object Tracking via Structural Constraint Event Aggregation
查看>>
The Solution Path Algotithm for Identity-Aware Multi-Object Tracking
查看>>
Groupwise Tracking of Crowded Similar-Appearance Targets from Low-Continuity Image Sequences
查看>>
CDTS: Collaborative Detection, Tracking, and Segmentation for Online Multiple Object Segmentation
查看>>
Deep Network Flow for Multi-Object Tracking
查看>>
Multiple People Tracking by Lifted Multicut and Person Re-identification
查看>>
Multi-Object Tracking with Quadruplet Convolutional Neural Networks
查看>>
关于多目标跟踪的一点理解
查看>>
Learning by tracking:Siamese CNN for robust target association
查看>>
MUSTer:Multi-Store Tracker:A Cognitive Psychology Inspired Approach to Object Tracking
查看>>
Understanding and Diagnosing Visual Tracking Systems
查看>>
Multiple People Tracking by Lifted Multicut and Person Re-identification
查看>>
Visual Tracking Using Attention-Modulated Disintegration and Integration
查看>>
Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning
查看>>
Multiple Object Tracking with High Performance Detection and Appearance Feature
查看>>
深度学习入门(上)-第一章 必备基础知识点
查看>>
ubuntu unzip解压时提示错误 解决方法
查看>>
sprintf函数的说明
查看>>
BOOST_TYPEOF和BOOST_AUTO 作用
查看>>
随机森林概述
查看>>