Hive Storage Handler入门和实战

为什么要有Storage Handler

引入Storage Handler,Hive用户使用SQL可读写外部数据源。ElasticSearch, Kafka,HBase等数据源的查询对非专业开发是有一定门槛的,借助Storage Handler,他们有了一种方便快捷的手段查询数据。另外,Hive作为数仓的核心组件,借助Storage Handler,数据导入导出可以统一以SQL实现,减少了大数据开发维护的技术栈。

Storage Handler的使用

1. 用Java实现HiveStorageHandler接口,并将Jar包加入Hive classpath。

2. 创建外部表(External Table),且STORED BY 声明为第一步开发的类。

3. 使用HiveSQL操作外部表

 

Storage Handler的原理

先介绍一点预备知识:
1. InputFormat: getSplits()和getRecordReader(). MR框架根据getSplits()生成若干个Mapper, splits : mapper = 1: 1。一个HDFS文件,可能会有多个splits。getRecordReader()返回的RecordReader负责split的二进制数据转化为实现Writable接口的类实例。

Hive Storage Handler入门和实战_第1张图片

2. OutputFormat:与InputFormat处理数据的方向相反。

3. SerDe: Hive的序列化/反序列化器,完成Hive “Row”(Java Object)和Readabale/Writable之间的“翻译”工作。SerDe是MR和Hive之间的桥梁。

以一个简单查询:SELECT C1 FROM T1为例。T1是使用StorageHandler创建的表,外部数据源Kafka。执行查询时,Hive的SQL执行引擎默认(不开启Hive on Spark)将该查询转化为一个MR Application,该MR App包含若干个Mapper。Mapper的个数由Storage Handler的InputFormat类的getSplits()决定。Mapper内部的RecordReader.createKey()产生一个Key对象,createValue产生一个Value对象, Key和Value都是实现了Writable接口的类。RecordReader的next(K, V)负责将数据写入到K,V对象。最后由SerDe的deserialize()方法,将Key, Value"翻译"为Hive "Row"。

 

实现Kafka Storage Handler

要解决的问题:

1. Kafka 消息的反序列化

2. Kafka topic partition与Mapper个数关系。在InputFormat.getSplits()实现

3. Offset管理

4. Hive SerDe选择

我们假设Kafka 消息为String格式,使用Kafka低阶API SimpleConsumer,需要自己解析二进制数组,并转化为String。同时SimpleConsumer需要程序员实现topic分区lead迁移和其他错误处理逻辑。mapper个数与topic partition相等。采用应用自己管理offset的方式,Kafka Storage Handler不commit offset。使用Hive自带AvroSerDe,这要求代码构造

详细代码见:https://github.com/chncaesar/HiveKafkaStorageHandler

 

 

 

参考资料

https://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/InputFormat.html

https://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/RecordReader.html

https://hive.apache.org/javadocs/r1.2.2/api/org/apache/hadoop/hive/serde2/AbstractSerDe.html

https://cwiki.apache.org/confluence/display/Hive/StorageHandlers

https://cwiki.apache.org/confluence/display/Hive/SerDe

你可能感兴趣的:(Hive)