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

前提条件

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

Hive通过内表访问HBase

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

  1. 进入Hive命令行。
    1. 使用SSH方式登录到集群主节点,详情请参见登录集群
    2. 执行以下命令,进入Hive命令行。
      hive
      返回信息如下所示时,表示进入Hive命令行。
      Logging initialized using configuration in file:/etc/ecm/hive-conf-2.3.5-2.0.3/hive-log4j2.properties Async: true
      Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
  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. 进入HBase命令行。
    1. 使用SSH方式登录到集群主节点,详情请参见登录集群
    2. 执行以下命令,进入HBase命令行。
      hbase shell
      返回信息如下所示时,表示进入HBase命令行。Hbase
  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. 进入HBase命令行。
    1. 使用SSH方式登录到集群主节点,详情请参见登录集群
    2. 执行以下命令,进入HBase命令行。
      hbase shell
      返回信息如下所示时,表示进入HBase命令行。Hbase
  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. 进入Hive命令行。
    1. 使用SSH方式登录到集群主节点,详情请参见登录集群
    2. 执行以下命令,进入Hive命令行。
      hive
      返回信息如下所示时,表示进入Hive命令行。
      Logging initialized using configuration in file:/etc/ecm/hive-conf-2.3.5-2.0.3/hive-log4j2.properties Async: true
      Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
  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的数据。