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

背景信息

HBase是兼容标准HBase访问协议的分布式数据库,包含HBase标准版、HBase增强版和HBase Serverless版,MaxCompute仅支持访问HBase标准版或HBase增强版集群。

默认情况下,MaxCompute与阿里云HBase服务间的网络不可达,您需要提前通过专有网络连接方案(VPC)建立二者间的网络通路后,才可以创建HBase外部表来关联HBase标准版或增强版集群中的表。

说明 HBase增强版是基于云原生多模数据库Lindorm内核研发的,HBase增强版实例也可以通过Lindorm控制台创建,该场景下创建HBase外部表的操作,请参见Lindorm外部表(云原生多模数据库)。本文仅以通过HBase控制台创建的HBase实例为例进行介绍。

前提条件

创建HBase外部表前,请确认已经满足如下条件:
  • 已创建HBase标准版或增强版集群,并完成环境配置。

    更多购买HBase标准版集群及配置环境信息,请参见HBase标准版快速入门

    更多购买HBase增强版集群及配置环境信息,请参见HBase增强版快速入门

  • 已通过HBase客户端在HBase集群中创建好了表。

    更多创建HBase表信息,请参见使用HBase Shell

    为便于展示使用示例,本文假设已在HBase标准版或增强版集群中创建了表mf_hbase_test_t,建表命令如下。
    --创建HBase表。
    create 'mf_hbase_test_t', 'f'
    --插入数据。其中:1表示RowKey,col_family:col_name表示列,f表示col_family,col1表示col_name,hello表示col_value。
    put 'mf_hbase_test_t', '1', 'f:col1', 'hello'
  • 已创建待关联HBase表的目标MaxCompute项目。

    更多创建MaxCompute项目信息,请参见创建MaxCompute项目

  • 已安装MaxCompute客户端。

    更多安装MaxCompute客户端操作,请参见安装并配置MaxCompute客户端

  • 已基于专有网络连接方案,开通MaxCompute和HBase服务间的网络连接。

    更多专有网络连接方案信息,请参见专有网络连接方案

使用限制

  • 由于只有华北2(北京)、华东2(上海)、华北3(张家口)、华东1(杭州)和华南1(深圳)五个地域开通了专有网络连接方案,只有以上五个地域可以创建HBase外部表,其他地域暂不支持。
  • HBase外部表仅支持访问HBase2.x版本的集群。
  • HBase外部表暂不支持EMR HBase集群。

创建HBase外部表语法

在创建HBase外部表时,您需要在建表DDL语句中指定HBaseStorageHandler,并配置HBase标准版或增强版集群相关信息。建表语句定义如下。

--打开外部表VPC支持。
set odps.sql.external.net.vpc=true;     
--打开Hive兼容模式。      
set odps.sql.hive.compatible = true;  
--仅当HBase集群为增强版时,除上述2个SET参数外,还必须配置odps.sql.hbase.version参数,切换HBase版本为lindorm。
set odps.sql.hbase.version=lindorm;
--创建HBase外部表。        
create external table if not exists <mc_hbase_external>
(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
--处理HBase数据源的Handler。
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'       
with serdeproperties ('mcfed.hbase.table.name'='<hbase_table_name>',
                      'mcfed.hbase.columns.mapping'='<:key,col-family:col-name1,col-family:col-name2,...>',
                      'odps.external.net.vpc'='<true>',
                      'odps.vpc.id'='<VPC ID>',
                      'odps.vpc.access.ips'='<VPC ip|host:port,VPC ipBegin-ipEnd:port|network_segment:port>',
                      'odps.vpc.region'='<RegionID>')
location '<hbase://VPC ip|host:port>'                           
tblproperties (
--hbase.table.name、hbase.columns.mapping和mcfed.hbase.zookeeper.quorum必须配置。
'hbase.table.name'='<hbase_table_name>',
'hbase.columns.mapping'='<:key,col-family:col-name1,col-family:col-name2,...>',
'mcfed.hbase.zookeeper.quorum'='<VPC ip1|host1:port,VPC ip2|host2:port...>',
--仅当HBase集群为增强版时,还必须配置mcfed.hbase.client.username和mcfed.hbase.client.password参数。
'mcfed.hbase.client.username'='****',
'mcfed.hbase.client.password'='****',
--mcfed.hbase.zookeeper.property.clientPort、mcfed.zookeeper.session.timeout和mcfed.hbase.client.retries.number为可选参数。
--当HBase集群为标准版时,mcfed.hbase.zookeeper.property.clientPort的默认值为2181。
--当HBase集群为增强版时,mcfed.hbase.zookeeper.property.clientPort的默认值为30020。
['mcfed.hbase.zookeeper.property.clientPort'='{2181|30020}',]
['mcfed.zookeeper.session.timeout'='<value>',]
['mcfed.hbase.client.retries.number'='<value>']);
  • mc_hbase_external:必填。待创建HBase外部表的名称。
  • col_name:必填。HBase外部表的列名称。
  • data_type:必填。列的数据类型。
  • with serdeproperties
    • 'mcfed.hbase.table.name'='<hbase_table_name>':MaxCompute所关联的HBase集群中的表的名称。
    • 'mcfed.hbase.columns.mapping'='<:key,col-family:col-name1,col-family:col-name2,...>':必填。HBase外部表与HBase集群中表的列映射关系。
      • RowKey(:key)必须放在最前面。
      • 列格式为col-family:col-name1,col-family:col-name2。一个作业中col-family只能有一个。
    • 'odps.external.net.vpc'='true':必填。固定取值为true,表明HBase外部表的数据源处于VPC网络。
    • 'odps.vpc.id'='<VPC ID>':VPC实例ID。您可以登录HBase管理控制台,在集群列表页面单击目标集群名称后,在左侧导航栏单击数据库连接,即可在连接信息处获取VPC ID。
    • 'odps.vpc.access.ips'='<VPC ip|host:port,VPC ipBegin-ipEnd:port|network_segment:port>':必填。Zookeeper连接地址(HBase标准版)或HBase集群的Java API访问地址(HBase增强版)。也可以为关联的HBase表所属VPC网络IP、IP网段、端口。例如192.0.2.1-192.0.2.10:9000, 192.0.2.20:70050192.0.2.20/16:2181。您可以登录HBase管理控制台,在集群列表页面单击目标集群名称后,在左侧导航栏单击数据库连接,即可在连接信息处获取。
      • 对于分布式的数据源,请确认需要访问的前端IP端口以及DataNode的IP端口。HBase外部表需要填写Zookeeper、HMaster、Region Server的IP和端口(2181/30020、16000、16020)。HBase标准版的默认Zookeeper端口为2181。HBase增强版的默认Zookeeper端口为30020。
      • 由于该字段支持IP地址段,且映射IP会耗费资源,默认一次映射的IP数不能超过2000个。
    • 'odps.vpc.region'='<RegionID>':VPC网络所属地域ID。获取方法请参见获取RegionID及VPC ID
  • hbase://VPC ip|host:port:必填。HBase上配置的Zookeeper Master。即Zookeeper连接地址(HBase标准版)或HBase集群的Java API访问地址(HBase增强版)。
  • tblproperties
    • 'hbase.table.name'='<hbase_table_name>':必填。MaxCompute所关联的HBase集群中的表的名称。必须提前通过HBase客户端建好。
    • 'hbase.columns.mapping'='<:key,col-family:col-name1,col-family:col-name2,...>':必填。HBase外部表与HBase集群中表的列映射关系。
      说明 with serdepropertiestblproperties里都需要指定hbase.table.namehbase.columns.mapping。但SERDEPROPERTIESmcfed开头,tblproperties没有mcfed,产品后续会改进,只保留其中一个。
    • 'mcfed.hbase.zookeeper.quorum'='<VPC ip1|host1:port,VPC ip2|host2:port...>':必填。HBase的Zookeeper的IP或域名。即Zookeeper连接地址(HBase标准版)或HBase集群的Java API访问地址(HBase增强版)。
    • mcfed.hbase.client.username:必填。仅当HBase集群为增强版时,需要配置该参数。您可以登录HBase管理控制台,在集群列表页面单击目标集群名称后,在左侧导航栏单击数据库连接,即可通过连接信息处的默认用户名获取。
    • mcfed.hbase.client.password:必填。仅当HBase集群为增强版时,需要配置该参数。您可以登录HBase管理控制台,在集群列表页面单击目标集群名称后,在左侧导航栏单击数据库连接,即可通过连接信息处的默认密码获取。
    • 'mcfed.hbase.zookeeper.property.clientPort'='{2181|30020}':可选。HBase的Zookeeper端口。HBase标准版的默认Zookeeper端口为2181。HBase增强版的默认Zookeeper端口为30020。
    • 'mcfed.zookeeper.session.timeout'='<value>':可选。Zookeeper的超时时间。单位为毫秒,建议设置为30000。
    • 'mcfed.hbase.client.retries.number'='<value>':可选。HBase客户端连接重试次数。
    说明 mcfed.zookeepermcfed.hbase开头的配置是Zookeeper的相关配置。

使用示例

  1. 登录MaxCompute客户端,执行CREATE EXTERNAL TABLE语句创建HBase外部表。
    命令示例如下。
    • HBase标准版
      set odps.sql.external.net.vpc=true;      
      set odps.sql.hive.compatible = true;
      create external table if not exists mf_hbase_test_t_ext
      (
        key  int,
        col1 string,
        col2 string
      )
      stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'       
      with serdeproperties ('mcfed.hbase.table.name'='mf_hbase_test_t',
                            'mcfed.hbase.columns.mapping'=':key,f:col1,f:col2',
                            'odps.external.net.vpc'='true',
                            'odps.vpc.id'='vpc-2zee****',
                            'odps.vpc.access.ips'='hb-2zef****-master1-001.hbase.rds.aliyuncs.com:2181,hb-2zef****-master2-001.hbase.rds.aliyuncs.com:2181,hb-2zef****-master3-001.hbase.rds.aliyuncs.com:2181,hb-2zef****-master1-001.hbase.rds.aliyuncs.com:16000,hb-2zef****-master2-001.hbase.rds.aliyuncs.com:16000,hb-2zef****-master3-001.hbase.rds.aliyuncs.com:16000,hb-2zef****-master1-001.hbase.rds.aliyuncs.com:16020,hb-2zef****-master2-001.hbase.rds.aliyuncs.com:16020,hb-2zef****-master3-001.hbase.rds.aliyuncs.com:16020',
                            'odps.vpc.region'='cn-beijing')
      location 'hbase://hb-2zef****-master1-001.hbase.rds.aliyuncs.com:2181'                           
      tblproperties (
      'hbase.table.name'='mf_hbase_test_t',
      'hbase.columns.mapping'=':key,f:col1,f:col2',
      'mcfed.hbase.zookeeper.quorum'='hb-2zef****-master1-001.hbase.rds.aliyuncs.com,hb-2zef****-master2-001.hbase.rds.aliyuncs.com,hb-2zef****-master3-001.hbase.rds.aliyuncs.com',
      'mcfed.hbase.zookeeper.property.clientPort'='2181');
    • HBase增强版
      set odps.sql.external.net.vpc=true;       
      set odps.sql.hive.compatible = true; 
      set odps.sql.hbase.version=lindorm;  
      CREATE EXTERNAL TABLE mf_hbase_test_t_ext
      (
        key  int,
        col1 string,
        col2 string
      )
      stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
      with serdeproperties ('mcfed.hbase.table.name'='mf_hbase_test_t',
                            'mcfed.hbase.columns.mapping'=':key,f:col1,f:col2',
                            'odps.external.net.vpc'='true',
                            'odps.vpc.id'='vpc-2zen****',
                            'odps.vpc.access.ips'='ld-2ze9****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020',
                            'odps.vpc.region'='cn-beijing')
      location 'hbase://ld-2ze9****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020'
      tblproperties (
      'hbase.table.name'='mf_hbase_test_t',
      'hbase.columns.mapping'=':key,f:col1,f:col2',
      'mcfed.hbase.zookeeper.quorum'='ld-2ze9****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020',
      "mcfed.hbase.client.username"="root",
      "mcfed.hbase.client.password"="root");
  2. 执行select命令查看关联结果,确保关联成功。
    命令示例如下。
    select * from mf_hbase_test_t_ext;
    返回结果如下。
    +------+------------+------------+
    | key  | col1       | col2       |
    +------+------------+------------+
    | 1    | hello      | NULL       |
    +------+------------+------------+
  3. 执行INSERT OVERWRITE语句向HBase中的表写入数据。
    命令示例如下。
    INSERT OVERWRITE TABLE mf_hbase_test_t_ext SELECT '2', 'hbase', 'mftestinsert';
  4. 执行SELECT语句验证写入的数据。
    命令示例如下。
    select * from mf_hbase_test_t_ext;
    返回结果如下。
    +------+------------+--------------------+
    | key  | col1       | col2               |
    +------+------------+--------------------+
    | 1    | hello      | NULL               |
    | 2    | hbase      | mftestinsert       |
    +------+------------+--------------------+