MaxCompute支持通过专有网络连接方案,访问用户的云HBase。用户完成网络连通和授权,可以创建HBase外部表,通过Hive提供的HBaseStorageHandler读写HBase中的表的数据。使用HBase外部表,可以同步HBase中的数据到MaxCompute进行后续ETL处理,也可以关联HBase外部表进行联邦计算,或将MaxCompute数据输出到HBase表。

前提条件

请确认您已完成如下操作:

使用限制

  • 由于只有华北2(北京)、华东2(上海)、华北3(张家口)、华东1(杭州)四个区域开通了专有网络连接方案(VPC专线方案),只有以上四个区域可以创建HBase外部表,其他区域暂不支持。
  • HBase外部表仅支持HBase标准版,暂不支持HBase增强版(Lindorm)和HBase Serverless版。
  • HBase外部表仅支持HBase2.x版本。
  • HBase外部表暂不支持EMR HBase。

通过在线接口加载数据至HBase

MaxCompute的外部表功能支持您通过Hive提供的HBaseStorageHandler读写HBase中的表,其中写操作是通过HTable.put在线接口实现。

  1. 登录MaxCompute客户端,执行CREATE EXTERNAL TABLE语句创建一个映射HBase中表Schema的外部表。
    建表DDL语句如下:
    --打开外部表VPC支持。
    set odps.sql.external.net.vpc=true;     
    --打开Hive兼容模式。      
    set odps.sql.hive.compatible = true;  
    --创建外部表。        
    CREATE EXTERNAL TABLE IF NOT EXISTS <mc_hbase_external>
    (
      <col1_name> <data_type>,
      <col2_name> <data_type>,
      ......
    )
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'       --处理HBase数据源的Handler。
    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:port>'                           
    TBLPROPERTIES (
    'hbase.table.name'='<hbase_table_name>',
    'hbase.columns.mapping'='<:key,col-family:col-name1,col-family:col-name2,...>',
    'mcfed.zookeeper.session.timeout'='<value>',
    'mcfed.hbase.client.retries.number'='<value>',
    'mcfed.hbase.zookeeper.quorum'='<host1|ip1,host2|ip2...>',
    'mcfed.hbase.zookeeper.property.clientPort'='2181');
    • mc_hbase_external:待创建外部表的名称。
    • col_name:外部表的列名称。
    • 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,...>':待创建外部表Schema映射的HBase的列。
        • RowKey(:key)必须放在最前面。
        • 列格式为col-family:col-name1,col-family:col-name2。一个作业只能写一个HFile文件,即col-family只能有一个。
      • 'odps.external.net.vpc'='true':表明外部表的数据源处于VPC网络。
      • 'odps.vpc.id'='<VPC ID>':VPC网络ID号。详情请参见获取RegionID及VPC ID
      • 'odps.vpc.access.ips'='<VPC ip|host:port,VPC ipBegin-ipEnd:port|network_segment:port>':映射的HBase表所属VPC网络IP、域名或IP网段、端口。例如192.0.2.1-192.0.2.10:9000, 192.0.2.20:70050192.0.2.20/16:2181
        • 对于分布式的数据源,请确认需要访问的前端IP端口以及DataNode的IP端口。HBase外部表包括Zookeeper、HMaster、Region Server的IP和端口(2181、16000、16020)。
        • 由于该字段支持IP地址段,且映射IP会耗费资源,默认一次映射的IP数不能超过2000个。
      • 'odps.vpc.region'='<RegionID>':VPC网络所在的区域ID。详情请参见获取RegionID及VPC ID
    • hbase://VPC ip:port:HBase上配置的Zookeeper Master。
    • TBLPROPERTIES
      • 'hbase.table.name'='<hbase_table_name>':MaxCompute所映射的HBase的表名称。必须提前通过HBase客户端建好,例如hbase(main):001:0> create 'test', 'cf'
      • 'hbase.columns.mapping'='<:key,col-family:col-name1,col-family:col-name2,...>':待创建外部表Schema映射的HBase的列。
        说明 SERDEPROPERTIESTBLPROPERTIES里都需要指定hbase.table.namehbase.columns.mapping,且SERDEPROPERTIESmcfed开头,TBLPROPERTIES没有mcfed,产品后续会改进,只保留其中一个。
      • 'mcfed.zookeeper.session.timeout'='<value>':Zookeeper的超时时间。单位为毫秒,建议设置为30000。
      • 'mcfed.hbase.client.retries.number'='<value>':HBase客户端连接重试次数。
      • 'mcfed.hbase.zookeeper.quorum'='<host1|ip1,host2|ip2...>':HBase的Zookeeper的IP或域名。
      • 'mcfed.hbase.zookeeper.property.clientPort'='2181':HBase的Zookeeper的端口。默认为2181。
        说明 mcfed.zookeepermcfed.hbase开头的配置是Zookeeper的相关配置。
    示例如下:
    set odps.sql.external.net.vpc=true;
    set odps.sql.hive.compatible = true;
    CREATE EXTERNAL TABLE if not exists test_cluster_hbase_external
    (
      id  string,
      cfa string
    )
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ('mcfed.hbase.table.name'='test',
                          'mcfed.hbase.columns.mapping'=':key,cf:a',
                          'odps.external.net.vpc'='true',
                          'odps.vpc.id'='vpc-2zeeopx9atnrkay8nrbol',
                          'odps.vpc.access.ips'='hb-2zef72182rf01aiuv-master1-001.hbase.rds.aliyuncs.com:2181,hb-2zef72182rf01aiuv-master2-001.hbase.rds.aliyuncs.com:2181,hb-2zef72182rf01aiuv-master3-001.hbase.rds.aliyuncs.com:2181,hb-2zef72182rf01aiuv-master1-001.hbase.rds.aliyuncs.com:16000,hb-2zef72182rf01aiuv-master2-001.hbase.rds.aliyuncs.com:16000,hb-2zef72182rf01aiuv-master3-001.hbase.rds.aliyuncs.com:16000,hb-2zef72182rf01aiuv-master1-001.hbase.rds.aliyuncs.com:16020,hb-2zef72182rf01aiuv-master2-001.hbase.rds.aliyuncs.com:16020,hb-2zef72182rf01aiuv-master3-001.hbase.rds.aliyuncs.com:16020',
                          'odps.vpc.region'='cn-beijing')
    location 'hbase://hb-2zef72182rf01aiuv-master1-001.hbase.rds.aliyuncs.com:2181'
    TBLPROPERTIES (
    'hbase.table.name'='test', 
    'hbase.columns.mapping'=':key,cf:a',
    'mcfed.zookeeper.session.timeout'='30000', 
    'mcfed.hbase.client.retries.number'='1',
    'mcfed.hbase.zookeeper.quorum'='hb-2zef72182rf01aiuv-master1-001.hbase.rds.aliyuncs.com,hb-2zef72182rf01aiuv-master2-001.hbase.rds.aliyuncs.com,hb-2zef72182rf01aiuv-master3-001.hbase.rds.aliyuncs.com',
    'mcfed.hbase.zookeeper.property.clientPort'='2181');
  2. 执行INSERT OVERWRITE语句向HBase中的表写入数据。
    命令示例如下:
    INSERT OVERWRITE TABLE test_cluster_hbase_external SELECT '2', 'abc';
  3. 执行SELECT语句验证写入的数据。
    命令示例如下:
    SELECT * FROM cluster_test_hbase_external;