Hive访问EMR HBase数据

在阿里云E-MapReduce(EMR)中,Hive支持通过内部表和外部表两种方式来访问和处理存储在HBase中的数据。本文通过示例为您介绍,如何使用EMR上的Hive处理EMR HBase数据。

前提条件

  • 已创建选择了Hive、HBase和Zookeeper服务的自定义集群(Custom),详情请参见创建集群

  • 已登录集群,详情请参见登录集群

Hive通过内表访问HBase

如果HBase中没有已经创建好的表,则可以在Hive中创建表,Hive会自动把表结构和数据写入到HBase中。本示例是在Hive中新建表访问HBase。

  1. 执行以下命令,进入Hive命令行。

    hive
  2. 在Hive中创建并查询表数据。
    1. 执行以下命令,在Hive中创建HBase表。
      create table hive_hbase_table(key int, value string)
      stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
      with serdeproperties("hbase.columns.mapping" = ":key,cf1:val")
      tblproperties("hbase.table.name" = "hive_hbase_table", "hbase.mapred.output.outputtable" = "hive_hbase_table");
      说明 表的存储方式是HBaseStorageHandler,可以存储和读取HBase数据。
    2. 执行以下命令,向表中插入数据。
      insert into hive_hbase_table values(212,'bab');
    3. 执行以下命令,查看表数据。
      select * from hive_hbase_table;
      返回信息如下。
      OK
      212 bab
      Time taken: 0.337 seconds, Fetched: 1 row(s)
  3. 退出Hive命令行后,执行以下命令,进入HBase命令行。

    hbase shell
  4. 执行以下命令,查看是否已经通过Hive在HBase中创建了表。

    describe 'hive_hbase_table'

    返回信息如下。describe

    说明

    查看表已存在,说明Hive已经在HBase中创建了表。

  5. 执行以下命令,在HBase中查看Hive写的数据是否已存在。

    scan 'hive_hbase_table'

    返回信息如下。

    ROW                                           COLUMN+CELL                                                                                                                          
     212                                          column=cf1:val, timestamp=****, value=bab                                                                                   
    1 row(s) in 0.2320 seconds
    说明

    查看数据已存在,并且与在Hive中插入的数据一致,说明Hive已经成功访问了HBase的数据。

Hive通过外表访问HBase

如果已经在HBase中创建了表,想通过Hive访问,则可以使用Hive外表的方式与HBase中的表建立映射关系,进而通过Hive访问HBase中已经存在的表。

  1. 退出Hive命令行后,执行以下命令,进入HBase命令行。

    hbase shell
  2. 在HBase中创建并查询表数据。
    1. 执行以下命令,在HBase中创建表。
      create 'hbase_table','f'
    2. 执行以下命令,向表中插入数据。
      put 'hbase_table','1122','f:col1','hello'
    3. 执行以下命令,查看表数据。
      scan 'hbase_table'
      返回信息如下。
      ROW                                                COLUMN+CELL
       1122                                              column=f:col1, timestamp=1627027165760, value=hello
      1 row(s) in 0.0170 seconds
  3. 退出HBase命令行后,执行以下命令,进入Hive命令行。

    hive
  4. 执行以下命令,在Hive中创建外表,并与HBase中的表建立映射关系。
    create external table hbase_table(key int,col1 string,col2 string)
    stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    with serdeproperties("hbase.columns.mapping" = "f:col1,f:col2")
    tblproperties("hbase.table.name" = "hbase_table", "hbase.mapred.output.outputtable" = "hbase_table");
  5. 执行以下命令,在Hive中查看hbase_table数据。

    select * from hbase_table;

    返回信息如下。

    1122  hello NULL
    说明

    查看数据已存在,并且与在HBase中插入的数据一致,说明Hive已经成功访问了HBase的数据。

EMR HBase开启Kerberos

如果EMR HBase开启了Kerberos,Hive关联HBase表并进行查询时,则需要设置Kerberos相关参数,设置方式有以下两种:

  • Hive命令行设置

    set hbase.security.authentication=kerberos;
    set hbase.master.kerberos.principal=hbase/_HOST@EMR.${CLUSTER_ID}.COM;
    set hbase.regionserver.kerberos.principal=hbase/_HOST@EMR.${CLUSTER_ID}.COM;
    set hbase.zookeeper.quorum=master-1-1;
  • 环境变量设置

    env HIVE_OPTS="-hiveconf hbase.security.authentication=kerberos -hiveconf hbase.master.kerberos.principal=hbase/_HOST@EMR.${CLUSTER_ID}.COM -hiveconf hbase.regionserver.kerberos.principal=hbase/_HOST@EMR.${CLUSTER_ID}.COM -hiveconf hbase.zookeeper.quorum=master-1-1" hive
说明

${CLUSTER_ID}获取方式,可以登录集群节点,执行hostname命令,命令返回值中'.'后以'c-'开头到结尾的字符串转换为大写即可。

相关文档

如需访问云数据库HBase的数据,详情请参见Hive访问云HBase数据