由于项目需将kafka的数据存储至hbase中,有幸了解了confluent 的kafka-connect-hbase 组件,官方提供了基础版本(https://github.com/mravi/kafka-connect-hbase),,而我采用了改进版nishutayal(https://github.com/nishutayal/kafka-connect-hbase),并对改进版进行了更改,增加了topic和hbase表之间的映射关系配置以及从kafka解析中项的配置,其中对比如下:
版本 | 对比 |
confluent 基础版本 | 不支持对多个列族的写入 |
nishutayal 增强版本 | zhi支持对多个列族的写入,topic和hbase表为一一对应的关系,较为固定,不支持多个topic往同一个hbase写入 |
改进版本 | 增加支持多个topic往同一个hbase表的写入 增加kafka数据解析项的配置,可根据配置解析指定item
|
由于kafka-connect-hbase依托于confluent框架,梳理kafka-connect-hbase 类图如下:
其中:
- HbaseSinkConnector为 connector中的配置类
- task启动调用HBaseSinkTask中的start 方法,初始化HbaseClient 、toPutFunction 。
- 根据kafka consumer配置 (consumer.max.poll.records、consumer.max.poll.interval.ms),定时定量的调用HBaseSinkTask的put方法,在此方法中调用toPutFunction中的appliy方法,利用EventParser进行数据的解析,生成byte[],最后调用HBaseClient中的write方法写入至HBase中。
kafka-connect-hbase 组件其实并不复杂,只要按照confluent的框架要求编写相关实现类即可。
新增配置如下:
topics.assign.db.tables | topic与hbase表之间的映射关系,如device_profile_test|device_profile,即将topic中的device_profile_test数据写入至hbase表device_profile中 |
event.parse.item | kafka 消息中value中的解析项,如event.parse.item=payload,则只解析kafka中的payload项 |
hbase.tableName.rowkey.columns hbase.tableName.rowkey.delimiter hbase.tableName.family hbase.tableName.xxfamliy.columns
| 以前根据topic配置,现在全部改为hbase的tableName进行配置,更好的便于理解和支持多个topic写入同一个hbase表中。 |
参考: