HBase数据源为您提供读取和写入HBase的双向通道,本文为您介绍DataWorks的HBase数据源的同步能力支持情况。
支持的版本
HBase插件可分为HBase和HBase{xx}xsql两种,其中HBase{xx}xsql插件需通过HBase结合Phoenix使用。
HBase插件:
支持
HBase0.94.x、HBase1.1.x、HBase2.x,支持向导模式和脚本模式,可使用hbaseVersion指定版本。如果您的HBase版本为
HBase0.94.x,Reader和Writer端的插件请选择094x。"reader": { "hbaseVersion": "094x" }"writer": { "hbaseVersion": "094x" }如果您的HBase版本为HBase1.1.x或HBase2.x,Reader和Writer端的插件请选择11x。
"reader": { "hbaseVersion": "11x" }"writer": { "hbaseVersion": "11x" }HBase1.1.x插件当前可以兼容HBase 2.0。
HBase{xx}xsql插件
HBase20xsql插件:支持
HBase2.x和Phoenix5.x。 只支持脚本模式。HBase11xsql插件:支持
HBase1.1.x和Phoenix5.x。只支持脚本模式。HBase{xx}xsql Writer插件实现了向HBase中的SQL表(Phoenix)批量导入数据。因为Phoenix对rowkey进行了数据编码,如果您直接使用HBaseAPI写入,需要手动转换数据,麻烦且易错。HBase{xx}xsql Writer插件为您提供了简单的SQL表的数据导入方式。
说明通过Phoenix的JDBC驱动,执行UPSERT语句向表中批量写入数据。因为使用上层接口,所以可以同步更新索引表。
使用限制
HBase Reader | HBase20xsql Reader | HBase11xsql Writer |
|
|
|
支持的功能
HBase Reader
支持normal和multiVersionFixedColumn模式 ,配置方式参见:HBase字段映射配置指导。。
normal模式:把HBase中的表当成普通二维表(横表)进行读取,获取最新版本数据。hbase:007:0> scan 'student' ROW COLUMN+CELL s001 column=basic:age, timestamp=2026-03-09T14:41:40.240, value=20 s001 column=basic:name, timestamp=2026-03-09T14:41:40.214, value=Tom s001 column=score:english, timestamp=2026-03-09T14:41:40.333, value=90 s001 column=score:math, timestamp=2026-03-09T14:41:40.277, value=85 1 row(s) in 0.0580 seconds读取后的数据如下所示。
rowKey
basic:age
basic:name
score:english
score:math
s001
20
Tom
90
85
multiVersionFixedColumn模式:把HBase中的表当成竖表进行读取。读出的每条记录是四列形式,依次为rowKey、family:qualifier、timestamp和value。读取时需要明确指定要读取的列,把每一个cell中的值,作为一条记录(record),若有多个版本则存在多条记录。hbase:007:0> scan 'student',{VERSIONS=>5} ROW COLUMN+CELL s001 column=basic:age, timestamp=2026-03-09T14:41:40.240, value=20 s001 column=basic:age, timestamp=2026-03-09T14:30:00.100, value=19 s001 column=basic:name, timestamp=2026-03-09T14:41:40.214, value=Tom s001 column=score:english, timestamp=2026-03-09T14:41:40.333, value=90 s001 column=score:math, timestamp=2026-03-09T14:41:40.277, value=85 1 row(s) in 0.0260 seconds }读取后的数据(4列) 如下所示。
rowKey
column:qualifier
timestamp
value
s001
basic:age
2026-03-09T14:41:40.240
20
s001
basic:age
2026-03-09T14:30:00.100
19
s001
basic:name
2026-03-09T14:41:40.214
Tom
s001
score:english
2026-03-09T14:41:40.333
90
s001
score:math
2026-03-09T14:41:40.277
85
HBase Writer
rowkey生成规则:目前HBase Writer支持源端多个字段拼接作为HBase表的rowkey。写入HBase的版本(时间戳)支持:
指定当前时间作为版本。
指定源端列作为版本。
指定一个时间作为版本。
支持的字段类型
离线读
支持读取HBase数据类型及HBase Reader针对HBase类型的转换列表如下表所示。
类型分类
数据集成column配置类型
数据库数据类型
整数类
long
short、int和long
浮点类
double
float和double
字符串类
string
binary_string和string
日期时间类
date
date
字节类
bytes
bytes
布尔类
boolean
boolean
HBase20xsql Reader支持大部分Phoenix类型,但也存在个别类型未被支持的情况,请注意检查您的类型。
HBase20xsql Reader针对Phoenix类型的转换列表,如下所示。
DataX内部类型
Phoenix数据类型
long
INTEGER、TINYINT、SMALLINT、BIGINT
double
FLOAT、DECIMAL、DOUBLE
string
CHAR、VARCHAR
date
DATE、TIME、TIMESTAMP
bytes
BINARY、VARBINARY
boolean
BOOLEAN
离线写
支持读取HBase数据类型,HBase Writer针对HBase类型的转换列表,如下表所示。
column的配置需要和HBase表对应的列类型保持一致。
除下表中罗列的字段类型外,其它类型均不支持。
类型分类 | 数据库数据类型 |
整数类 | INT、LONG和SHORT |
浮点类 | FLOAT和DOUBLE |
布尔类 | BOOLEAN |
字符串类 | STRING |
注意事项
如果您在测试连通性时遇到"tried to access method com.google.common.base.Stopwatch"的错误信息,请在数据源的配置信息中添加 hbaseVersion属性,指定HBase版本。
创建数据源
在进行数据同步任务开发时,您需要在DataWorks上创建一个对应的数据源,操作流程请参见数据源管理,详细的配置参数解释可在配置界面查看对应参数的文案提示。
数据同步任务开发
数据同步任务的配置入口和通用配置流程可参见下文的配置指导。
单表离线同步任务配置指导
使用向导模式时,由于HBase为无固定结构的数据源,默认不会显示字段映射,您需要手动配置字段映射。
HBase作为数据来源时,首先需要选择输出模式:横表(normal 模式)和竖表(multiVersionFixedColumn 模式)。
两种模式下的字段映射配置方式不同:
横表(normal)模式:默认模式,将HBase表按普通二维表读取,获取最新版本数据。HBase作为数据来源,需要配置来源字段和目标字段的映射关系。如图所示,源端与目的端字段为一一映射关系。当前数据源类型由于源端表无固定字段,默认为同行映射,如需改变映射关系,需手动编辑字段顺序。
新版数据开发

旧版数据开发

目标表写入结果:

竖表(multiVersionFixedColumn)模式:每条输出记录由4列组成(rowKey、family:qualifier、timestamp、value),可读取多版本数据。来源字段配置格式为:
ColumnFamily:Qualifier(如basic:age),目标端为固定的4列表(字段为如row_key、cf、timestamp_col、value)。配置时,无需关注映射关系。新版数据开发

旧版数据开发

目标表结果:

HBase作为数据去向(仅支持normal模式),需要分别配置目标字段和rowkey。其中,rowkey字段可以由多个源端字段拼接而成。
脚本模式配置的全量参数和脚本Demo请参见下文的附录:脚本Demo与参数说明。
常见问题
Q:并发设置多少比较合适?速度慢时增加并发有用吗?
A:数据导入进程默认JVM的堆大小是2GB,并发(channel数)是通过多线程实现的,开过多的线程有时并不能提高导入速度,反而可能因为过于频繁的GC导致性能下降。一般建议并发数(channel)为5-10。
Q:batchSize设置多少比较合适?
A:默认是256,但应根据每行的大小来计算最合适的batchSize。通常一次操作的数据量在2MB~4MB左右,用该值除以行大小,即可得到batchSize。
Q:使用
multiVersionFixedColumn模式读取HBase时,报错java.lang.StringIndexOutOfBoundsException: String index out of range: -1,如何解决?A:该错误通常是由于column配置中的
name字段未使用列族:列名(columnFamily:qualifier)格式导致的。例如只写了列名age而非basic:age。请确保除rowkey外,所有column的name必须包含列族前缀,格式为columnFamily:qualifier。
附录:脚本Demo与参数说明
离线任务脚本配置方式
如果您配置离线任务时使用脚本模式的方式进行配置,您需要按照统一的脚本格式要求,在任务脚本中编写相应的参数,详情请参见脚本模式配置,以下为您介绍脚本模式下数据源的参数配置详情。
HBase Reader脚本Demo
{
"type":"job",
"version":"2.0",//版本号。
"steps":[
{
"stepType":"hbase",//插件名。
"parameter":{
"mode":"normal",//读取HBase的模式,支持normal模式、multiVersionFixedColumn模式。
"scanCacheSize":"256",//HBase client每次RPC从服务器端读取的行数。
"scanBatchSize":"100",//HBase client每次RPC从服务器端读取的列数。
"hbaseVersion":"094x/11x",//HBase版本。
"column":[//字段。
{
"name":"rowkey",//字段名。
"type":"string"//数据类型。
},
{
"name":"basic:age",
"type":"string"
},
{
"name":"basic:name",
"type":"string"
},
{
"name":"score:english",
"type":"string"
},
{
"name":"score:math",
"type":"string"
}
],
"range":{//指定HBase Reader读取的rowkey范围。
"endRowkey":"",//指定结束rowkey。
"isBinaryRowkey":true,//指定配置的startRowkey和endRowkey转换为byte[]时的方式,默认值为false。
"startRowkey":""//指定开始rowkey。
},
"maxVersion":"",//指定在多版本模式下的HBase Reader读取的版本数。
"encoding":"UTF-8",//编码格式。
"table":"student",//表名。
"hbaseConfig":{//连接HBase集群需要的配置信息,JSON格式。
"hbase.zookeeper.quorum":"hostname",
"hbase.rootdir":"hdfs://ip:port/database",
"hbase.cluster.distributed":"true"
}
},
"name":"Reader",
"category":"reader"
},
{
"stepType":"odps",//目标端插件名。此处以MaxCompute为例,您可以根据实际情况替换为其他Writer插件。
"parameter":{
"partition":"",//目标表的分区信息。非分区表无需配置。
"truncate":true,//写入前是否清空表或分区中的数据,true表示清空。
"datasource":"odps_datasource",//MaxCompute数据源名称。
"column":[//目标端字段列表。
"rowkey",
"basic_age",
"basic_name",
"score_english",
"score_math"
],
"table":"student_target"//MaxCompute目标表名。
},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"//错误记录数。
},
"speed":{
"throttle":true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
"concurrent":1,//作业并发数。
"mbps":"12"//限流,此处1mbps = 1MB/s。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}HBase Reader脚本Demo(multiVersionFixedColumn模式)
以下示例展示了使用multiVersionFixedColumn模式读取HBase数据,并写入MaxCompute的完整脚本配置。在该模式下,HBase中每个Cell的值将被转换为一条独立的记录,每条记录由4列组成:rowKey、family:qualifier、timestamp、value。
{
"type":"job",
"version":"2.0",
"steps":[
{
"stepType":"hbase",//插件名。
"parameter":{
"mode":"multiVersionFixedColumn",//读取HBase的模式,此处使用multiVersionFixedColumn模式。
"scanCacheSize":"256",//HBase client每次RPC从服务器端读取的行数。
"scanBatchSize":"100",//HBase client每次RPC从服务器端读取的列数。
"hbaseVersion":"20x",//HBase版本。
"datasource":"hbase_datasource",//HBase数据源名称。
"column":[//字段。第一个字段必须为rowkey,其余字段的name必须为"列族:列名"格式。
{
"name":"rowkey",//rowkey字段。
"type":"string"
},
{
"name":"basic:age",//列族basic下的列age。
"type":"string"
},
{
"name":"basic:name",//列族basic下的列name。
"type":"string"
},
{
"name":"score:english",//列族score下的列english。
"type":"string"
},
{
"name":"score:math",//列族score下的列math。
"type":"string"
}
],
"range":{
"isBinaryRowkey":false
},
"maxVersion":"-1",//读取所有版本数据。multiVersionFixedColumn模式下此参数必填。取值为-1表示读取所有版本。
"encoding":"UTF-8",//编码格式。
"table":"student"//HBase表名。
},
"name":"Reader",
"category":"reader"
},
{
"stepType":"odps",//目标端插件名。此处以MaxCompute为例。
"parameter":{
"partition":"",//目标表的分区信息。非分区表无需配置。
"truncate":true,//写入前是否清空表或分区中的数据,true表示清空。
"datasource":"odps_datasource",//MaxCompute数据源名称。
"column":[//目标端固定4列,分别对应rowKey、family:qualifier、timestamp、value。
"rowkey",
"cf",
"timestamp_col",
"value"
],
"table":"hbase_multiversion_target"//MaxCompute目标表名。
},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"//错误记录数。
},
"speed":{
"throttle":false,//不限流。
"concurrent":2//作业并发数。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}MaxCompute目标表需要提前创建,建表语句示例:CREATE TABLE IF NOT EXISTS hbase_multiversion_target (row_key STRING, cf STRING, timestamp_col STRING, value STRING);
HBase Reader脚本参数
参数 | 描述 | 是否必选 | 默认值 |
haveKerberos | haveKerberos值为true时,表示HBase集群需要Kerberos认证。 说明
| 否 | false |
hbaseConfig | 连接HBase集群需要的配置信息,JSON格式。必填的配置为hbase.zookeeper.quorum,表示HBase的ZK链接地址。同时可以补充更多HBase client的配置,例如设置scan的cache、batch来优化与服务器的交互。 说明 如果是云HBase的数据库,需要使用内网地址连接访问。 | 是 | 无 |
mode | 读取HBase的模式,支持normal模式和multiVersionFixedColumn模式。 | 是 | 无 |
table | 读取的HBase表名(大小写敏感) 。 | 是 | 无 |
encoding | 编码方式,UTF-8或GBK,用于将二进制存储的HBase byte[]转换为String时的编码。 | 否 | utf-8 |
column | 要读取的HBase字段,normal模式与multiVersionFixedColumn模式下必填。
| 是 | 无 |
maxVersion | 指定在多版本模式下的HBase Reader读取的版本数,取值只能为-1或大于1的数字,-1表示读取所有版本。 | multiVersionFixedColumn模式下必填项 | 无 |
range | 指定HBase Reader读取的rowkey范围。
| 否 | 无 |
scanCacheSize | HBase Reader每次从HBase中读取的行数。 | 否 | 256 |
scanBatchSize | HBase Reader每次从HBase中读取的列数。配置为-1时将返回所有列。 说明 scanBatchSize配置的数值最好大于实际列数,避免出现数据质量风险。 | 否 | 100 |
HBase Writer脚本Demo
{
"type":"job",
"version":"2.0",//版本号
"steps":[
{
"stepType":"stream",
"parameter":{},
"name":"Reader",
"category":"reader"
},
{
"stepType":"hbase",//插件名。
"parameter":{
"mode":"normal",//写入HBase的模式。
"walFlag":"false",//关闭(false)放弃写WAL日志。
"hbaseVersion":"094x",//Hbase版本。
"rowkeyColumn":[//要写入的HBase的rowkey列。
{
"index":"0",//序列号。
"type":"string"//数据类型。
},
{
"index":"-1",
"type":"string",
"value":"_"
}
],
"nullMode":"skip",//读取的为null值时,如何处理。
"column":[//要写入的HBase字段。
{
"name":"columnFamilyName1:columnName1",//字段名。
"index":"0",//索引号。
"type":"string"//数据类型。
},
{
"name":"columnFamilyName2:columnName2",
"index":"1",
"type":"string"
},
{
"name":"columnFamilyName3:columnName3",
"index":"2",
"type":"string"
}
],
"encoding":"utf-8",//编码格式。
"table":"",//表名。
"hbaseConfig":{//连接HBase集群需要的配置信息,JSON格式。
"hbase.zookeeper.quorum":"hostname",
"hbase.rootdir":"hdfs: //ip:port/database",
"hbase.cluster.distributed":"true"
}
},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"//错误记录数。
},
"speed":{
"throttle":true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
"concurrent":1, //作业并发数。
"mbps":"12"//限流
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}HBase Writer脚本参数
参数 | 描述 | 是否必选 | 默认值 |
haveKerberos | haveKerberos值为true时,表示HBase集群需要Kerberos认证。 说明
| 否 | false |
hbaseConfig | 连接HBase集群需要的配置信息,JSON格式。必填的配置为hbase.zookeeper.quorum,表示HBase的ZK连接地址。同时可以补充更多HBase client的配置,例如设置scan的cache、batch来优化与服务器的交互。 说明 如果使用阿里云HBase的数据库,需要使用内网地址连接访问。 | 是 | 无 |
mode | 写入HBase的模式,目前仅支持normal模式,后续考虑动态列模式。 | 是 | 无 |
table | 要写入的HBase表名(大小写敏感) 。 | 是 | 无 |
encoding | 编码方式,UTF-8或GBK,用于STRING转HBase byte[]时的编码。 | 否 | utf-8 |
column | 要写入的HBase字段:
| 是 | 无 |
rowkeyColumn | 要写入的HBase的rowkey列:
配置格式如下所示。 | 是 | 无 |
versionColumn | 指定写入HBase的时间戳。支持当前时间、指定时间列或指定时间(三者选一),如果不配置则表示用当前时间。
配置格式如下所示。
| 否 | 无 |
nullMode | 读取的数据为null值时,您可以通过以下两种方式解决:
| 否 | skip |
walFlag | HBase Client向集群中的RegionServer提交数据时(Put/Delete操作),首先会先写WAL(Write Ahead Log)日志(即HLog,一个RegionServer上的所有Region共享一个HLog),只有当WAL日志写成功后,才会接着写MemStore,最后客户端被通知提交数据成功。 如果写WAL日志失败,客户端则被通知提交失败。关闭(false)放弃写WAL日志,从而提高数据写入的性能。 | 否 | false |
writeBufferSize | 设置HBase Client的写Buffer大小,单位字节,配合autoflush使用。 autoflush(默认处于关闭状态):
| 否 | 8M |
fileSystemUsername | 同步任务时如果出现Ranger权限问题,可将向导式配置任务转为脚本模式,并配置有权限的fileSystemUsername,DataWorks将按照指定的用户访问HBase。 | 否 | 无 |
HBase20xsql Reader脚本Demo
{
"type":"job",
"version":"2.0",//版本号。
"steps":[
{
"stepType":"hbase20xsql",//插件名。
"parameter":{
"queryServerAddress": "http://127.0.0.1:8765", //填写连接Phoenix QueryServer地址。
"serialization": "PROTOBUF", //QueryServer序列化格式。
"table": "TEST", //读取表名。
"column": ["ID", "NAME"], //所要读取列名。
"splitKey": "ID" //切分列,必须是表主键。
},
"name":"Reader",
"category":"reader"
},
{
"stepType":"stream",
"parameter":{},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"//错误记录数。
},
"speed":{
"throttle":true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
"concurrent":1,//作业并发数。
"mbps":"12"//限流,此处1mbps = 1MB/s。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}HBase20xsql Reader脚本参数
参数 | 描述 | 是否必选 | 默认值 |
queryServerAddress | HBase20xsql Reader插件需要通过Phoenix轻客户端去连接Phoenix QueryServer,因此,您需要在此处填写对应的QueryServer地址。如果HBase增强版(Lindorm)用户需要透传user、password参数,可以在queryServerAddress后增加对应的可选属性。格式为: | 是 | 无 |
serialization | QueryServer使用的序列化协议。 | 否 | PROTOBUF |
table | 所要读取的表名(大小写敏感)。 | 是 | 无 |
schema | 表所在的schema。 | 否 | 无 |
column | 所配置的表中需要同步的列名集合,使用JSON的数组描述字段信息,空值表示读取所有列。默认值为空值。 | 否 | 全部列 |
splitKey | 读取表时对表进行切分,如果指定splitKey,表示您希望使用splitKey代表的字段进行数据分片,数据同步因此会启动并发任务进行数据同步,提高了数据同步的效能。您可以选择两种不同的切分方式,如果splitPoint为空,默认根据方法一自动切分:
| 是 | 无 |
splitPoints | 根据切分列的最大值和最小值切分时不能保证避免数据热点,因此,建议切分点根据Region的startkey和endkey进行设置,保证每个查询对应单个Region。 | 否 | 无 |
where | 筛选条件,支持对表查询增加过滤条件。HBase20xsql Reader根据指定的column、table、where条件拼接SQL,并根据该SQL进行数据抽取。 | 否 | 无 |
querySql | 在部分业务场景中,where配置项不足以描述所筛选的条件,您可以通过该配置项来自定义筛选SQL。配置该项后,除queryserverAddress参数必须设置外,HBase20xsql Reader会直接忽略column、table、where和splitKey条件的配置,使用该项配置的内容对数据进行筛选。 | 否 | 无 |
HBase11xsql Writer脚本Demo
{
"type": "job",
"version": "1.0",
"configuration": {
"setting": {
"errorLimit": {
"record": "0"
},
"speed": {
"throttle":true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
"concurrent":1, //作业并发数。
"mbps":"1"//限流,此处1mbps = 1MB/s。
}
},
"reader": {
"plugin": "odps",
"parameter": {
"datasource": "",
"table": "",
"column": [],
"partition": ""
}
},
"plugin": "hbase11xsql",
"parameter": {
"table": "目标hbase表名,大小写有关",
"hbaseConfig": {
"hbase.zookeeper.quorum": "目标hbase集群的ZK服务器地址",
"zookeeper.znode.parent": "目标hbase集群的znode"
},
"column": [
"columnName"
],
"batchSize": 256,
"nullMode": "skip"
}
}
}HBase11xsql Writer脚本参数
参数 | 描述 | 是否必选 | 默认值 |
plugin | 插件名字,必须是hbase11xsql。 | 是 | 无 |
table | 要导入的表名,大小写敏感,通常Phoenix表都是大写表名。 | 是 | 无 |
column | 列名,大小写敏感。通常Phoenix的列名都是大写。 说明
| 是 | 无 |
hbaseConfig | HBase集群地址,ZK为必填项,格式为ip1, ip2, ip3。 说明
| 是 | 无 |
batchSize | 批量写入的最大行数。 | 否 | 256 |
nullMode | 读取到的列值为null时,您可以通过以下两种方式进行处理:
| 否 | skip |
