本文介绍如何通过MaxCompute创建Lindorm外部表并映射Lindorm数据源。
功能介绍
Lindorm是面向物联网、互联网、车联网等设计和优化的云原生多模超融合数据库,支持宽表、时序、文本、对象、流、空间等多种数据的统一访问和融合处理,并兼容SQL、HBase/Cassandra/S3、TSDB、HDFS、Solr、Kafka等多种标准接口,是阿里巴巴核心业务提供支撑的数据库之一。
在MaxCompute与阿里云Lindorm服务间的网络处于连通状态时,MaxCompute支持通过创建外部表来关联Lindorm表。使用Lindorm外部表,可以实现如下功能:
-
将Lindorm表中的数据同步到MaxCompute执行后续ETL处理
-
关联其他Lindorm表实现联邦计算
-
将MaxCompute数据输出到Lindorm表
适用范围
-
地域限制:目前支持地域包括华北2(北京)、华东2(上海)、华北3(张家口)、华东1(杭州)、华南1(深圳)、中国香港、华东 2 金融云(可用区F)、日本(东京)、新加坡、马来西亚(吉隆坡)、印度尼西亚(雅加达)、德国(法兰克福)、美国(硅谷)、美国(弗吉尼亚)。
-
Lindorm外部表不支持cluster属性。
注意事项
读取Lindorm源表数据时,如果源表中的列数小于外表DDL中的列数,系统会将缺少的列值补充为NULL。反之(大于时),会丢弃超出的列数据。
创建Lindorm外部表
语法结构
在创建Lindorm外部表时,需要在建表DDL语句中指定HBaseStorageHandler,并配置Lindorm实例相关信息。
建表时,表名和字段名大小写不敏感。在查询表或字段时,无需区分大小写,且不支持强制转换大小写。建表语句定义如下:
-- 打开Hive兼容模式。
SET odps.sql.hive.compatible = true;
-- 配置odps.sql.hbase.version参数,切换HBase版本为lindorm。
SET odps.sql.hbase.version=lindorm;
-- 创建Lindorm外部表。
CREATE EXTERNAL TABLE if NOT EXISTS <mc_lindorm_external>
(
<col_name1> <data_type>,
<col_name2> <data_type>,
......
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' --处理Lindorm数据源的Handler
WITH SERDEPROPERTIES(
'hbase.columns.mapping'='<:key,col-family:col-name1,col-family:col-name2,...>')
TBLPROPERTIES(
--hbase.table.name和mcfed.hbase.zookeeper.quorum必须配置。
'hbase.table.name'='',
'hbase.zookeeper.quorum'='',
--配置hbase.client.username和hbase.client.password参数。
'hbase.client.username'='****','hbase.client.password'='****',
--hbase.zookeeper.property.clientPort、mcfed.zookeeper.session.timeout和hbase.client.retries.number为可选参数。
--hbase.zookeeper.property.clientPort的默认值为30020。
['hbase.zookeeper.property.clientPort'='{30020}',]
['mcfed.zookeeper.session.timeout'='{{VALUE}}',]
['hbase.client.retries.number'='{{VALUE}}',]
'networklink'='{{NETWORKLINK_NAME}}'
);
参数说明
-
mc_lindorm_external:必填。待创建Lindorm外部表的名称。
-
col_name:必填。Lindorm外部表的列名称。
-
data_type:必填。列的数据类型。
-
with serdeproperties:
-
'hbase.columns.mapping'='<:key,col-family:col-name1,col-family:col-name2,...>':必填。Lindorm外部表与Lindorm实例中表的列映射关系,详情请参见HBaseIntegration-ColumnMapping。
-
RowKey(
:key1[,:key2,:keyn])必须放在最前面。 -
列格式为
col-family:col-name1,col-family:col-name2。一个作业中col-family只能有一个。
-
-
-
tblproperties:
-
'hbase.table.name'='<namespace:lindorm_table_name>':必填。MaxCompute所关联的Lindorm实例中的Namespace和表的名称,如果Namespace不填,会自动匹配到default的Namespace上。必须提前通过Lindorm控制台建好。
-
'hbase.zookeeper.quorum'='<VPC ip1|host1:port,VPC ip2|host2:port...>':必填。Lindorm的Zookeeper的IP或域名。即Lindorm实例的Java API访问地址。
-
hbase.client.username:必填。
-
登录Lindorm控制台,在左上角选择地域。
-
在实例列表页面,单击目标实例名称,进入该实例详情页。
-
在左侧导航栏,选择数据库连接。
-
在宽表引擎页签下,获取默认用户名。
-
-
hbase.client.password:必填。
-
登录Lindorm控制台,在左上角选择地域。
-
在实例列表页面,单击目标实例名称,进入该实例详情页。
-
在左侧导航栏,选择数据库连接。
-
在宽表引擎页签下,获取默认初始密码。
-
-
'hbase.zookeeper.property.clientPort'='{2181|30020}':可选。Lindorm的Zookeeper端口。Lindorm的默认Zookeeper端口为30020。
-
'mcfed.zookeeper.session.timeout'='<value>':可选。Zookeeper的超时时间。单位为毫秒,建议设置为30000。
-
'hbase.client.retries.number'='<value>':可选。Lindorm控制台连接重试次数。
-
'networklink'='<networklink_name>':必选。Lindorm实例所在VPC的MaxCompute网络链接。
说明mcfed.zookeeper和hbase开头的配置是Zookeeper的相关配置。
-
使用示例
-
已开通Lindorm服务并创建Lindorm实例。
-
已下载并配置Lindorm Shell。详情请参见通过Lindorm Shell访问宽表引擎。
-
网络连接
-
已基于专有网络连接方案,开通MaxCompute和Lindorm服务间的网络连接。更多专有网络连接方案信息,请参见网络开通流程。
-
网络打通时,MaxCompute侧仅打通到所填VPC ID的网络连接,如需跨Region访问或者访问该Region的其他VPC,请根据访问VPC方案(专线直连),打通专线直连方案所填写的VPC和其他VPC之间的网络。
-
-
使用Lindorm Shell创建Lindorm表并插入数据
-
创建
lindorm_test表CREATE 'lindorm_test','f'; -
向表
lindorm_test插入数据put 'lindorm_test', '1122', 'f:col1', 'hello'; put 'lindorm_test', '1122', 'f:col2', 'hbase'; -
查询表
lindorm_test数据scan 'lindorm_test';返回结果如图:

-
-
创建MaxCompute外部表并映射Lindorm数据源
-
在MaxCompute客户端创建MaxCompute的Lindorm外部表
lindorm_test_ext。SET odps.sql.hive.compatible = true; SET odps.sql.hbase.version=lindorm; CREATE EXTERNAL TABLE lindorm_test_ext ( row_key INT, col1 STRING, col2 STRING ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( 'hbase.columns.mapping'=':key,f:col1,f:col2') TBLPROPERTIES ( 'hbase.table.name'='lindorm_test', 'hbase.zookeeper.quorum'='ld-2z****-proxy-lindorm.lindorm.rds.aliyuncs.com:30020', 'hbase.client.username'='<user_name>', 'hbase.client.password'='***', 'networklink'='<your network link name>'); -
查询外部表
lindorm_test_ext数据SET odps.sql.hive.compatible = true; SET odps.sql.hbase.version=lindorm; SELECT * FROM lindorm_test_ext; -- 查询结果如下: +------------+------------+----------+ | key | col1 | col2 | +------------+------------+----------+ | 1122 | hello | hbase | +------------+------------+----------+ -
向外部表
lindorm_test_ext插入数据SET odps.sql.hive.compatible = true; SET odps.sql.hbase.version = lindorm; INSERT OVERWRITE TABLE lindorm_test_ext SELECT '1123', 'lindorm', 'mftestinsert'; -
查询外部表
lindorm_test_ext数据SET odps.sql.hive.compatible = true; SET odps.sql.hbase.version=lindorm; SELECT * FROM lindorm_test_ext; -- 查询结果如下: +------------+------------+-------------+ | key | col1 | col2 | +------------+------------+-------------+ | 1122 | hello | hbase | | 1123 | lindorm | mftestinsert| +------------+------------+-------------+ -
使用
scan语句查询Lindorm表lindorm_test数据。scan 'lindorm_test';查询结果如下:

-