在MaxCompute与阿里云Lindorm服务间的网络处于连通状态时,MaxCompute支持您通过创建外部表来关联Lindorm表。使用Lindorm外部表,可以将Lindorm表中的数据同步到MaxCompute进行后续ETL处理,也可以关联Lindorm表进行联邦计算,或将MaxCompute数据输出到Lindorm表中。本文为您介绍如何通过MaxCompute创建Lindorm外部表并映射Lindorm数据源。

背景信息

Lindorm是面向物联网、互联网、车联网等设计和优化的云原生多模超融合数据库,支持宽表、时序、文本、对象、流、空间等多种数据的统一访问和融合处理,并兼容SQL、HBase/Cassandra/S3、TSDB、HDFS、Solr、Kafka等多种标准接口和无缝集成三方生态工具,是日志、监控、账单、广告、社交、出行、风控等场景首选数据库,也是为阿里巴巴核心业务提供支撑的数据库之一。更多Lindorm信息请参见Lindorm产品概述

前提条件

创建Lindorm外部表前,请确认已经满足如下条件:

使用限制

由于只有华北2(北京)、华东2(上海)、华北3(张家口)、华东1(杭州)、华南1(深圳)、 中国(香港)、新加坡和德国(法兰克福)八个地域开通了专线直连访问VPC方案,只有以上八个地域可以创建Lindorm外部表,其他地域暂不支持。

创建Lindorm外部表语法

在创建Lindorm外部表时,您需要在建表DDL语句中指定HBaseStorageHandler,并配置Lindorm集群相关信息。建表时,表名和字段名大小写不敏感。在查询表或字段时,无需区分大小写,且不支持强制转换大小写。建表语句定义如下。
--打开外部表VPC支持。
set odps.sql.external.net.vpc=true;
--打开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>
(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
--处理Lindorm数据源的Handler。
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties (
                      'hbase.columns.mapping'='<:key,col-family:col-name1,col-family:col-name2,...>',
                      'odps.external.net.vpc'='<true>',
                      'odps.vpc.id'='<VPC ID>',
                      'odps.vpc.region'='<RegionID>')
tblproperties (
--hbase.table.name和mcfed.hbase.zookeeper.quorum必须配置。
'hbase.table.name'='<namespace:lindorm_table_name>',
'hbase.zookeeper.quorum'='<VPC ip1|host1:port,VPC ip2|host2:port...>',
--配置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>']);
  • 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集群中表的列映射关系。
      • RowKey(:key)必须放在最前面。
      • 列格式为col-family:col-name1,col-family:col-name2。一个作业中col-family只能有一个。
    • 'odps.external.net.vpc'='true':必填。固定取值为true,表明Lindorm外部表的数据源处于VPC网络。
    • 'odps.vpc.id'='<VPC ID>':VPC实例ID。您可以登录Lindorm控制台,在集群列表页面单击目标集群名称后,在左侧导航栏单击数据库连接,即可在连接信息处获取VPC ID。
    • 'odps.vpc.region'='<RegionID>':VPC网络所属地域ID。获取方法请参见获取RegionID及VPC ID
  • hbase://VPC ip|host:port:必填。Lindorm上配置的Zookeeper Master。Lindorm集群的Java API访问地址。indorm集群的Java API访问地址。也可以为关联的Lindorm表所属VPC网络IP、IP网段、端口。例如192.0.2.1-192.0.2.10:9000, 192.0.2.20:70050192.0.2.20/16:2181。您可以登录Lindorm控制台,在集群列表页面单击目标集群名称后,在左侧导航栏单击数据库连接,即可在连接信息处获取。
    • 对于分布式的数据源,请确认需要访问的前端IP端口以及DataNode的IP端口。Lindorm外部表需要填写Zookeeper、HMaster、Region Server的IP和端口(2181/30020、16000、16020)。Lindorm的默认Zookeeper端口为30020。
    • 由于该字段支持IP地址段,且映射IP会耗费资源,默认一次映射的IP数不能超过2000个。
  • tblproperties
    • 'hbase.table.name'='<namespace:lindorm_table_name>':必填。MaxCompute所关联的Lindorm集群中的Namespace和表的名称,如果Namespace不填,会自动匹配到defualt的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控制台连接重试次数。
    说明 mcfed.zookeeperhbase开头的配置是Zookeeper的相关配置。

使用示例

  1. 使用Lindorm Shell创建Lindorm表并插入数据。
    1. 创建mf_lindorm_test_t表。
      create 'mf_lindorm_test_t','f';
    2. 向表mf_lindorm_test_t插入数据。
      put 'mf_lindorm_test_t', '1122', 'f:col1', 'hello';
      put 'mf_lindorm_test_t', '1122', 'f:col2', 'hbase';
    3. 查询表mf_lindorm_test_t数据。
      scan 'mf_lindorm_test_t';
      查询结果如下图所示:查询数据
  2. 创建MaxCompute外部表并映射Lindorm数据源。
    1. 配置环境信息并创建MaxCompute的Lindorm外部表mf_lindorm_test_t_ext
      set odps.sql.external.net.vpc=true;
      set odps.sql.hive.compatible = true;
      set odps.sql.hbase.version=lindorm;
      CREATE EXTERNAL TABLE mf_lindorm_test_t_ext
      (
      key  int,
      col1 string,
      col2 string
      )
      STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
      WITH SERDEPROPERTIES (
      'hbase.columns.mapping'=':key,f:col1,f:col2',
      'odps.external.net.vpc'='true',
      'odps.vpc.id'='vpc-2z****',
      'odps.vpc.region'='cn-beijing')
      TBLPROPERTIES (
      'hbase.table.name'='mf_lindorm_test_t',
      'hbase.zookeeper.quorum'='ld-2z****-proxy-lindorm.lindorm.rds.aliyuncs.com:30020',
      "hbase.client.username"="root",
      "hbase.client.password"="root");
    2. 查询外部表mf_lindorm_test_t_ext数据。
      select * from mf_lindorm_test_t_ext;
      查询结果如下:
      +------------+------------+----------+
      | key        | col1       | col2     |
      +------------+------------+----------+
      | 1122       | hello      | hbase    |  
      +------------+------------+----------+
    3. 向外部表mf_lindorm_test_t_ext插入数据。
      执行INSERT OVERWRITE语句向已创建的外部表写入数据。
      INSERT OVERWRITE TABLE mf_lindorm_test_t_ext SELECT '1123', 'lindorm', 'mftestinsert';
    4. 再次查询外部表mf_lindorm_test_t_ext数据。
      select * from mf_lindorm_test_t_ext;
      查询结果如下:
      +------------+------------+-------------+
      | key        | col1       | col2        |
      +------------+------------+-------------+
      | 1122       | hello      | hbase       | 
      | 1123       | lindorm    | mftestinsert|   
      +------------+------------+-------------+
    5. 使用scan语句查询Lindorm表mf_lindorm_test_t数据。
      scan 'mf_lindorm_test_t';
      查询结果如下:查询结果