Hive支持通过内表或外表两种方式访问E-MapReduce(简称EMR)HBase数据。本文通过示例为您介绍,如何使用EMR上的Hive处理EMR HBase数据。

前提条件

  • 已创建Hadoop集群,并且选择了HBase和Zookeeper服务,详情请参见创建集群
  • 已登录集群,详情请参见登录集群

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=1624513121062, 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;
    返回信息如下。
    OK
    1122  hello NULL
    Time taken: 2.201 seconds, Fetched: 1 row(s)
    说明 查看数据已存在,并且与在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-'开头到结尾的字符串转换为大写即可。