Flume-Hbase-Sink针对不一样版本flume与HBase的适配研究与经验总结

导语:本文细致而全面地讲解使用flume输出数据到HBase的三种不一样 Flume-Hbase-Sink 之间的差别性,以及技术细节。而且透彻而全面地总结了不一样版本flume和HBase之间的兼容性问题。 为了更加详细说明三种不一样hbasesink的差别性,本文在附录附上详细的源码解读。html

1、Flume 的HBaseSinks 详细介绍
Flume 有两大类 HBasesinks: HBaseSink (org.apache.flume.sink.hbase.HBaseSink) 和 AsyncHBaseSink (org.apache.flume.sink.hbase.AsyncHBaseSink) 。java

1.一、HBasesink
提供两种序列化模式:正则表达式

1.1.一、SimpleHbaseEventSerializer
将整个事件event的body部分当作完整的一列写入hbase,所以在插入HBase的时候,一个event的body只能被插入一个column;apache

1.1.二、RegexHbaseEventSerializer
根据正则表达式将event 的body拆分到不一样的列当中,所以在插入HBase的时候,支持用户自定义插入同一个rowkey对应的同一个columnFamily 的多个column。安全

【优势】ide

(a) 安全性较高:支持secure HBase clusters (FLUME-1626) ,支持往secure hbase写数据(hbase能够开启kerberos校验);函数

(b) 支持0.96及以上版本的HBase 的IPC通讯----- the new HBase IPC which was introduced in HBase 0.96 and up。oop

【缺点】性能

性能没有AsyncHBaseSink高。由于HBaseSink采用阻塞调用(blocking calls),而AsyncHBaseSink采用非阻塞调用(non-blocking calls)。ui

1.二、AsyncHBaseSink
目前只提供一种序列化模式:SimpleAsyncHbaseEventSerializer:

将整个事件event的body部分当作完整的一列写入hbase,所以在插入HBase的时候,一个event的body只能被插入一个column。

【优势】

AsyncHBaseSink采用非阻塞调用(non-blocking calls),所以,性能比HBaseSink高;

【缺点】

(a) 不支持secure HBase clusters (FLUME-1626),不支持往secure hbase写数据;

(b) 不支持0.96及以上版本的HBase 的IPC通讯----- the new HBase IPC which was introduced in HBase 0.96 and up。

2、两大类HBasesinks的详细用法
2.1 HBasesink--SimpleHbaseEventSerializer
2.2 HBasesink--RegexHbaseEventSerializer
以下是展现如何使用 HBasesink--RegexHbaseEventSerializer(使用正则匹配切割event,而后存入HBase表的多个列):
2.3 AsyncHBaseSink--SimpleAsyncHbaseEventSerializer
若是读者感兴趣,能够仔细阅读Apache flume官网,上面有一些更加详细的信息:

http://archive.cloudera.com/cdh/3/flume-ng/FlumeUserGuide.html

3、使用flume-hbase-sink的常见错误总结
3.一、无HBase读写权限
若是提交./flume-ng 任务的用户没有HBase的读写权限,那么就会出现无权限读写HBase:

[ERROR - org.apache.flume.lifecycle.LifecycleSupervisor$MonitorRunnable.run(LifecycleSupervisor.java:253)]Unable to start SinkRunner: { policy:org.apache.flume.sink.DefaultSinkProcessor@f46fdc1 counterGroup:{ name:null counters:{} } } - Exception follows.
org.apache.flume.FlumeException: Could not start sink. Table or column family does not exist in Hbase (Permission denied).

【解决方法】

须要为用户赋予HBase读写权限,或者超级管理员权限。

3.二、低版本flume使用错误的序列化模式,致使与HBase版本接口不匹配
本文做者使用 flume-1.6.0 的RegexHbaseEventSerializer(属于 HBasesink)对HBase-1.1.3 和 HBase-1.2.1进行插入数据,出现如下错误:

2016-12-22 12:14:50 ERROR [SinkRunner-PollingRunner-DefaultSinkProcessor] (org.apache.flume.sink.hbase.HBaseSink.process:351)  - Failed to commit transaction.Transaction rolled back.
java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.Put.setWriteToWAL(Z)V
    at org.apache.flume.sink.hbase.HBaseSink$3.run(HBaseSink.java:377)
    at org.apache.flume.sink.hbase.HBaseSink$3.run(HBaseSink.java:372)
    at org.apache.flume.auth.SimpleAuthenticator.execute(SimpleAuthenticator.java:50)
    at org.apache.flume.sink.hbase.HBaseSink.putEventsAndCommit(HBaseSink.java:372)
    at org.apache.flume.sink.hbase.HBaseSink.process(HBaseSink.java:342)
    at org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:68)
    at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147)
    at java.lang.Thread.run(Thread.java:745)

错误信息提示:

java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.Put.setWriteToWAL(Z)V

查看源码,SimpleHbaseEventSerializer和 RegexHbaseEventSerializer的getActions函数产生的是put对象实例,也就是org.apache.hadoop.hbase.client.Put实例(想要了解更详细的内容,能够阅读本文的【附录:源码解读】章节)。org.apache.hadoop.hbase.client.Put里的确包含setWriteToWAL(boolean write)这个函数。新版本的hbase(0.98以上版本),setWriteToWAL(boolean write)方法改变了返回值,从void 变成了 Mutation。而flume-1.6.0以及如下版本,没法适配setWriteToWAL(boolean write)的改变,从而致使出错。

与SimpleHbaseEventSerializer和 RegexHbaseEventSerializer不一样的是,SimpleAsyncHbaseEventSerializer的getActions函数不是产生put实例,而是生成PutRequest实例。而PutRequest实例是能够与任意版本的HBase接口适配的。

想要了解更详细的内容,能够阅读本文的【附录:源码解读】章节。

【解决方法】

(1) 若是不改变flume的版本,那么须要将HBase降级到0.98 及如下版本;

(2) 若是不改变HBase版本,须要将flume升级到 1.7.0 及以上版本。

4、总结flume与HBase版本适配问题&&用户自定义HBase 的column
总结:通过上述解读,以及做者本人验证,有如下几条经验总结:

4.1 flume与HBase版本适配问题
4.1.1 对于HBasesink
(a) 对于Flume-1.6.0 及如下版本:HBasesink目前只支持往 HBase-0.98 版本及如下版本写入数据,当HBase超过0.98版本,1.6.0 及如下版本的Flume则不支持往HBase写入数据;

(b) 对于Flume-1.7.0 及以上版本:HBasesink目前支持往0.98及以上版本的HBase写入数据(固然也支持往0.98及如下版本的HBase写入数据);

4.1.2 对于AsyncHBaseSink
(a) 支持全部版本的HBase写入数据。

(b) 不支持0.96及以上版本的HBase 的IPC通讯方式------ the new HBase IPC which was introduced in HBase 0.96 and up。

4.2 flume-hbase-sink支持用户自定义HBase的column
4.2.1 对于HBasesink
(a)序列化模式SimpleHbaseEventSerializer

将整个事件event的body部分当作完整的一列写入hbase,所以在插入HBase的时候,一个event的body只能被插入一个column;

(b) 序列化模式RegexHbaseEventSerializer

根据正则表达式将event body拆分到不一样的列当中,所以在插入HBase的时候,支持用户自定义插入同一个rowkey对应的同一个columnFamily 的多个column。

4.2.2 对于AsyncHBaseSink
目前只提供一种序列化模式:SimpleAsyncHbaseEventSerializer:

将整个事件event的body部分当作完整的一列写入hbase,所以在插入HBase的时候,一个event的body只能被插入一个column。

转载自:https://cloud.tencent.com/developer/article/1025430

相关文章
相关标签/搜索