Streaming Data Ingest介绍

Streaming Data Ingest介绍

主要是使用Hive HCatalog Streaming API
传统情况下增加新的数据,需要收集hdfs上的数据,并且定期的向新的分区中增加。
那么,batch insert是很有必要的。之前,不能向已存在的分区中插入数据,
现在,hive0.14版本之后,Hive Streaming Api支持持续的插入数据。
新插入的数据,可以在一个批次中,提交到hive表中。
Hive HCatalog Streaming API是为流式客户端准备的,如Flume,Storm,它们持续不断的产生数据。
流式支持,是基于Hive表对ACID的支持。

这个API分为两个部分
第一个部分提供连接和事务的管理
第二个部分提供I/O支持
事务是通过metastore管理的。

HiveEndPoint

描述了一个需要连接的hive终端,库名,表名,分区名都包括
调用它上面的newConnection 方法建立一个到Hive Metastore的用于Streaming的连接。它返回一个StreamingConnection对象。同一个endpoint上,可以建立多个连接。
StreamingConnection可以被用来初始化新的事务来执行IO
HiveEndPoint.newConnection()方法接收一个boolean类型的参数,来决定是否创建分区,分区的创建时原子性的,所以,多个客户端可以比赛创建分区,但是只有一个会创建成功。

事务的实现,与传统的数据库的实现有一点不一样。
每个事务都有一个事务ID,多个事务会被分组到一个“事务批次”
这能够帮助把很多的事务记录分组到更少的文件中,避免一个事务一个文件。

在创建连接之后,client端会请求一个新的事务批次,会返回一组事务id,这些事务id都是一个事务批次中的一部分。然后,client端会通过初始化新的事务,来每次处理一个事务id。

Client端的write()方法会在每个事务中写一条或者多条记录,然后在转到下一个事务之前,commit或者abort当前事务。每一个TransactionBatch.write()自动调用当前事务id的IO操作。

StreamingConnection

这个类用来获取事务的批次。
一旦HiveEndPoint提供了连接,这个程序就会进入循环调用fetchTransactionBatch方法写一系列的事务。

TransactionBatch

它是用来写一系列事务的,在每个bucket中,每个TxnBatch都会在hdfs上创建一个文件,这个API检查每条记录来决定它属于哪个bucket,并且把这条记录写入相应的bucket中。
对于TxnBatch中的每个事务,程序调用beginNextTransaction方法来写数据,
然后commit或者abort。在一个Transaction Batch中的事务都会写入同一个bucket。Transaction Batch中的事务最终会被metastore认为过时,如果在hive.txn.timeout时间内内有被commit或者abort。TrasnactionBatch类提供heartbeat()方法来延长未操作的事务的生命周期。

参考文档:https://cwiki.apache.org/confluence/display/Hive/Streaming+Data+Ingest

你可能感兴趣的:(Hive)