HbaseReader 插件原理
HbaseReader 插件实现了从 Hbase中读取数据。在底层实现上,HbaseReader 通过 HBase 的 Java 客户端连接远程 HBase 服务,并通过 Scan 方式读取你指定 rowkey 范围内的数据,并将读取的数据使用 DataX 自定义的数据类型拼装为抽象的数据集,并传递给下游 Writer 处理。
HbaseReader 插件官方文档,有介绍各个参数的说明
https://github.com/alibaba/DataX/blob/master/hbase094xreader/doc/hbase094xreader.md
TxtFileWriter插件官方文档,有介绍各个参数的说明
https://github.com/alibaba/DataX/blob/master/txtfilewriter/doc/txtfilewriter.md
读取有两种模式
normal 模式 和 multiVersionFixedColumn模式
normal 模式:把HBase中的表,当成普通二维表(横表)进行读取,读取最新版本数据。
multiVersionFixedColumn模式:把HBase中的表,当成竖表进行读取。
读出的每条记录一定是四列形式,依次为:rowKey,family:qualifier,timestamp,value。
读取时需要明确指定要读取的列,把每一个 cell 中的值,作为一条记录(record),若有多个版本就有多条记录(record)。
为演示效果,先将hbase中表,列族的版本数改一下,这里改成3个版本,并添加多个版本的数据
为方便插入多个版本的数据,可看以下博文 (mysql到hbase),最下面最下面
https://blog.csdn.net/qq_41712271/article/details/108610591
//建表
create 'ns1:product','f1'
//修改列族的版本数
alter 'ns1:product',{'NAME'=>'f1','VERSIONS'=>'3'}
//检查,是否修改成功
desc 'ns1:product'//如这里每列有两个版本的数据,111为一个版本,222为一个版本 (productId和title组成的rowkey,所以一样)
get 'ns1:product', '23_电视', {COLUMN => 'f1', VERSIONS => 3}
COLUMN CELLf1:addTime timestamp=222222222, value=2020-02-01 23:05:31f1:addTime timestamp=111111111, value=2019-02-01 23:05:31f1:num timestamp=222222222, value=22f1:num timestamp=111111111, value=11f1:productId timestamp=222222222, value=23f1:productId timestamp=111111111, value=23f1:title timestamp=222222222, value=电视f1:title timestamp=111111111, value=电视
normal 模式 示例代码
{"job": {"setting": {"speed": {"channel": 1}},"content": [{"reader": {"name": "hbase11xreader","parameter": {"hbaseConfig": {"hbase.zookeeper.quorum": "kncloud02:2181,kncloud03:2181,kncloud04:2181","hbase.cluster.distributed": true,"zookeeper.znode.parent": "/hbase-unsecure"},"table": "ns1:product","encoding": "utf-8","mode": "normal","column": [{"name": "rowkey","type": "string"},{"name": "f1:productId","type": "string"},{"name": "f1:title","type": "string"},{"name": "f1:num","type": "string"},{"name": "f1:addTime","type": "date","format":"yyyy-MM-dd HH:mm:ss"}],"range": {"startRowkey": "","endRowkey": "","isBinaryRowkey": true}}},"writer": {"name": "txtfilewriter","parameter": {"path": "/usr/local/datax/linshiwenjian","fileName": "product","writeMode": "truncate"}}}]}
}
multiVersionFixedColumn模式 示例代码
改动的位置
"mode": "multiVersionFixedColumn",
"maxVersion": "-1",
{"job": {"setting": {"speed": {"channel": 1}},"content": [{"reader": {"name": "hbase11xreader","parameter": {"hbaseConfig": {"hbase.zookeeper.quorum": "kncloud02:2181,kncloud03:2181,kncloud04:2181","hbase.cluster.distributed": true,"zookeeper.znode.parent": "/hbase-unsecure"},"table": "ns1:product","encoding": "utf-8","mode": "multiVersionFixedColumn","maxVersion": "-1","column": [{"name": "rowkey","type": "string"},{"name": "f1:productId","type": "string"},{"name": "f1:title","type": "string"},{"name": "f1:num","type": "string"},{"name": "f1:addTime","type": "date","format": "yyyy-MM-dd HH:mm:ss"}],"range": {"startRowkey": "","endRowkey": ""}}},"writer": {"name": "txtfilewriter","parameter": {"path": "/usr/local/datax/linshiwenjian","fileName": "product_multiVersions","writeMode": "truncate"}}}]}
}
最终执行后,各个模式的结果
normal 模式 的结果
| rowKey | f1:productId | f1:title | f1:num | f1:addTime |
23_电视, 23, 电视, 22, 2020-02-01 23:05:31
24_手机, 24, 手机, 66, 2020-02-25 23:05:52multiVersionFixedColumn 模式 的结果
| rowKey | column:qualifier | timestamp | value |
23_电视, f1:addTime, 222222222, 2020-02-01 23:05:31
23_电视, f1:addTime, 111111111, 2019-02-01 23:05:31
23_电视, f1:num, 222222222, 22
23_电视, f1:num, 111111111, 11
23_电视, f1:productId, 222222222, 23
23_电视, f1:productId, 111111111, 23
23_电视, f1:title, 222222222, 电视
23_电视, f1:title, 111111111, 电视
24_手机, f1:addTime, 222222222, 2020-02-25 23:05:52
24_手机, f1:addTime, 111111111, 2019-02-25 23:05:52
24_手机, f1:num, 222222222, 66
24_手机, f1:num, 111111111, 55
24_手机, f1:productId, 222222222, 24
24_手机, f1:productId, 111111111, 24
24_手机, f1:title, 222222222, 手机
24_手机, f1:title, 111111111, 手机