教程:在 Azure HDInsight 中使用 Apache HBase

本教程演示如何在 Azure HDInsight 中创建 Apache HBase 群集、创建 HBase 表以及使用 Apache Hive 查询表。 有关 HBase 的一般信息,请参阅 HDInsight HBase 概述

本教程介绍如何执行下列操作:

  • 创建 Apache HBase 群集
  • 创建 HBase 表和插入数据
  • 使用 Apache Hive 查询 Apache HBase
  • 通过 Curl 使用 HBase REST API
  • 检查群集状态

先决条件

创建 Apache HBase 群集

以下过程使用 Azure 资源管理器模板创建 HBase 群集。 该模板还创建相关的默认 Azure 存储帐户。 若要了解该过程与其他群集创建方法中使用的参数,请参阅 在 HDInsight 中创建基于 Linux 的 Hadoop 群集

  1. 选择下面的图像即可在 Azure 门户中打开该模板。 该模板位于 Azure 快速启动模板中。

    Deploy to Azure

  2. 在“自定义部署”对话框中输入以下值:

    属性 说明
    订阅 选择用于创建群集的 Azure 订阅。
    资源组 创建 Azure 资源管理组,或使用现有的组。
    位置 指定资源组的位置。
    ClusterName 输入 HBase 群集的名称。
    群集登录名和密码 默认登录名为“admin”。
    SSH 用户名和密码 默认用户名为“sshuser”。

    其他参数是可选的。

    每个群集都有一个 Azure 存储帐户依赖项。 删除群集后,数据保留在存储帐户中。 群集的默认存储帐户名为群集名称后接“store”。 该名称已在模板 variables 节中硬编码。

  3. 选择“我同意上述条款和条件”,然后选择“购买” 。 创建群集大约需要 20 分钟时间。

备注

在删除 HBase 群集后,可以通过使用相同的默认 Blob 容器创建另一个 HBase 群集。 新群集将选取已在原始群集中创建的 HBase 表。 为了避免不一致,建议在删除群集之前先禁用 HBase 表。

创建表和插入数据

可以使用 SSH 连接到 HBase 群集,并使用 Apache HBase Shell 来创建 HBase 表以及插入和查询数据。

对大多数用户而言,数据以表格形式显示:

HDInsight HBase 表格数据

在 HBase(Cloud BigTable 的一种实现)中,相同的数据看起来类似于:

HDInsight HBase BigTable 数据

使用 HBase shell

  1. 使用 ssh 命令连接到 HBase 群集。 编辑以下命令,将 CLUSTERNAME 替换为群集的名称,然后输入该命令:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.cn
    
  2. 使用 hbase shell 命令来启动 HBase 交互式 shell。 在 SSH 连接中输入以下命令。

    hbase shell
    
  3. 使用 create 命令,创建包含双列系列的 HBase 表。 表名和列名区分大小写。 输入以下命令:

    create 'Contacts', 'Personal', 'Office'
    
  4. 使用 list 命令,列出 HBase 中的所有表。 输入以下命令:

    list
    
  5. 使用 put 命令,将指定列中的值插入特定表中的指定行。 输入以下命令:

    put 'Contacts', '1000', 'Personal:Name', 'John Dole'
    put 'Contacts', '1000', 'Personal:Phone', '1-425-000-0001'
    put 'Contacts', '1000', 'Office:Phone', '1-425-000-0002'
    put 'Contacts', '1000', 'Office:Address', '1111 San Gabriel Dr.'
    
  6. 使用 scan 命令扫描并返回 Contacts 表数据。 输入以下命令:

    scan 'Contacts'
    

    HDInsight Hadoop HBase shell

  7. 使用 get 命令提取某个行的内容。 输入以下命令:

    get 'Contacts', '1000'
    

    看到的结果与使用 scan 命令的结果类似,因为只有一个行。

    有关 HBase 表架构的详细信息,请参阅 Apache HBase 架构设计简介。 有关 HBase 命令的详细信息,请参阅 Apache HBase 参考指南

  8. 使用 exit 命令来停止 HBase 交互式 shell。 输入以下命令:

    exit
    

在联系人 HBase 表中批量加载数据

HBase 提供了多种方法用于将数据载入表中。 有关详细信息,请参阅 批量加载

可在公共 Blob 容器 wasb://hbasecontacts@hditutorialdata.blob.core.chinacloudapi.cn/contacts.txt 中找到示例数据文件。 该数据文件的内容为:

8396    Calvin Raji      230-555-0191    230-555-0191    5415 San Gabriel Dr.
16600   Karen Wu         646-555-0113    230-555-0192    9265 La Paz
4324    Karl Xie         508-555-0163    230-555-0193    4912 La Vuelta
16891   Jonn Jackson     674-555-0110    230-555-0194    40 Ellis St.
3273    Miguel Miller    397-555-0155    230-555-0195    6696 Anchor Drive
3588    Osa Agbonile     592-555-0152    230-555-0196    1873 Lion Circle
10272   Julia Lee        870-555-0110    230-555-0197    3148 Rose Street
4868    Jose Hayes       599-555-0171    230-555-0198    793 Crawford Street
4761    Caleb Alexander  670-555-0141    230-555-0199    4775 Kentucky Dr.
16443   Terry Chander    998-555-0171    230-555-0200    771 Northridge Drive

可以选择创建一个文本文件并将该文件上传到自己的存储帐户。 有关说明,请参阅在 HDInsight 中为 Apache Hadoop 作业上传数据

此过程会使用你在上一过程中创建的 Contacts HBase 表。

  1. 通过打开的 ssh 连接运行以下命令,将数据文件转换成 StoreFiles 并将其存储在 Dimporttsv.bulk.output 指定的相对路径。

    hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns="HBASE_ROW_KEY,Personal:Name,Personal:Phone,Office:Phone,Office:Address" -Dimporttsv.bulk.output="/example/data/storeDataFileOutput" Contacts wasb://hbasecontacts@hditutorialdata.blob.core.chinacloudapi.cn/contacts.txt
    
  2. 运行以下命令,将数据从 /example/data/storeDataFileOutput 上传到 HBase 表:

    hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /example/data/storeDataFileOutput Contacts
    
  3. 可以打开 HBase shell,并使用 scan 命令来列出表内容。

使用 Apache Hive 查询 Apache HBase

可以使用 Apache Hive 查询 HBase 表中的数据。 本部分将创建要映射到 HBase 表的 Hive 表,并使用该表来查询 HBase 表中的数据。

  1. 从打开的 SSH 连接,使用以下命令启动 Beeline:

    beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http' -n admin
    

    有关 Beeline 的详细信息,请参阅通过 Beeline 将 Hive 与 HDInsight 中的 Hadoop 配合使用

  2. 运行以下 HiveQL 脚本,创建映射到 HBase 表的 Hive 表。 确保在运行以下语句前,已使用 HBase shell 创建了本文中前面引用的示例表。

    CREATE EXTERNAL TABLE hbasecontacts(rowkey STRING, name STRING, homephone STRING, officephone STRING, officeaddress STRING)
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ('hbase.columns.mapping' = ':key,Personal:Name,Personal:Phone,Office:Phone,Office:Address')
    TBLPROPERTIES ('hbase.table.name' = 'Contacts');
    
  3. 运行以下 HiveQL 脚本,以查询 HBase 表中的数据:

    SELECT count(rowkey) AS rk_count FROM hbasecontacts;
    
  4. 若要退出 Beeline,请使用 !exit

  5. 若要退出 SSH 连接,请使用 exit

单独的 Hive 和 Hbase 群集

无需从 HBase 群集执行访问 HBase 数据的 Hive 查询。 如果已完成以下步骤,Hive 随附的任何群集(包括 Spark、Hadoop、HBase 或 Interactive Query)都可以用于查询 HBase 数据:

  1. 两个群集必须附加到同一虚拟网络和子网
  2. /usr/hdp/$(hdp-select --version)/hbase/conf/hbase-site.xml 从 HBase 群集头节点复制到 Hive 群集头节点

安全群集

还可以使用启用了 ESP 的 HBase 从 Hive 查询 HBase 数据:

  1. 遵循多群集模式时,两个群集都必须启用 ESP。
  2. 要允许 Hive 查询 HBase 数据,请确保 hive 用户有权通过 Hbase Apache Ranger 插件访问 HBase 数据
  3. 使用启用了 ESP 的单独群集时,必须将 HBase 群集头节点中 /etc/hosts 的内容追加到 Hive 群集头节点的 /etc/hosts

备注

缩放任一群集后,必须再次追加 /etc/hosts

通过 Curl 使用 HBase REST API

REST API 通过 基本身份验证进行保护。 始终应该使用安全 HTTP (HTTPS) 来发出请求,确保安全地将凭据发送到服务器。

  1. 要在 HDInsight 群集中启用 HBase REST API,请将以下自定义启动脚本添加到“脚本操作”部分。 可在创建群集时或创建群集后添加启动脚本。 对于“节点类型”,选择“区域服务器”以确保脚本仅在 HBase 区域服务器中执行 。

    #! /bin/bash
    
    THIS_MACHINE=`hostname`
    
    if [[ $THIS_MACHINE != wn* ]]
    then
        printf 'Script to be executed only on worker nodes'
        exit 0
    fi
    
    RESULT=`pgrep -f RESTServer`
    if [[ -z $RESULT ]]
    then
        echo "Applying mitigation; starting REST Server"
        sudo python /usr/lib/python2.7/dist-packages/hdinsight_hbrest/HbaseRestAgent.py
    else
        echo "Rest server already running"
        exit 0
    fi
    
  2. 为便于使用,请设置环境变量。 将 MYPASSWORD 替换为群集登录密码,以编辑下面的命令。 将 MYCLUSTERNAME 替换为 HBase 群集的名称。 然后,输入相应的命令。

    export password='MYPASSWORD'
    export clustername=MYCLUSTERNAME
    
  3. 使用以下命令列出现有的 HBase 表:

    curl -u admin:$password \
    -G https://$clustername.azurehdinsight.cn/hbaserest/
    
  4. 使用以下命令创建包含两个列系列的新 HBase 表:

    curl -u admin:$password \
    -X PUT "https://$clustername.azurehdinsight.cn/hbaserest/Contacts1/schema" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d "{\"@name\":\"Contact1\",\"ColumnSchema\":[{\"name\":\"Personal\"},{\"name\":\"Office\"}]}" \
    -v
    

    架构以 JSON 格式提供。

  5. 使用以下命令插入一些数据:

    curl -u admin:$password \
    -X PUT "https://$clustername.azurehdinsight.cn/hbaserest/Contacts1/false-row-key" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d "{\"Row\":[{\"key\":\"MTAwMA==\",\"Cell\": [{\"column\":\"UGVyc29uYWw6TmFtZQ==\", \"$\":\"Sm9obiBEb2xl\"}]}]}" \
    -v
    

    对 -d 开关中指定的值进行 Base64 编码。 在示例中:

    • MTAwMA==:1000

    • UGVyc29uYWw6TmFtZQ==:Personal:Name

    • Sm9obiBEb2xl:John Dole

      false-row-key 允许插入多个(批处理)值。

  6. 使用以下命令获取行:

    curl -u admin:$password \
    GET "https://$clustername.azurehdinsight.cn/hbaserest/Contacts1/1000" \
    -H "Accept: application/json" \
    -v
    

有关 HBase Rest 的详细信息,请参阅 Apache HBase 参考指南

备注

Thrift 不受 HDInsight 中的 HBase 支持。

使用 Curl 或者与 WebHCat 进行任何其他形式的 REST 通信时,必须提供 HDInsight 群集管理员用户名和密码对请求进行身份验证。 此外,还必须使用群集名称作为用来向服务器发送请求的统一资源标识符 (URI) 的一部分:

   curl -u <UserName>:<Password> \
   -G https://<ClusterName>.azurehdinsight.cn/templeton/v1/status

应会收到类似于以下响应的响应:

   {"status":"ok","version":"v1"}

检查群集状态

HDInsight 中的 HBase 随附了一个 Web UI 用于监视群集。 使用该 Web UI 可以请求有关区域的统计或信息。

访问 HBase Master UI

  1. 登录到 Ambari Web UI(网址是 https://CLUSTERNAME.azurehdinsight.cn,其中,CLUSTERNAME 是 HBase 群集的名称)。

  2. 从左侧菜单中选择“HBase”。

  3. 选择页面顶部的“快速链接”,指向活动的 Zookeeper 节点链接,然后选择“HBase Master UI”。 该 UI 会在另一个浏览器标签页中打开:

    HDInsight HBase HMaster UI

    HBase Master UI 包含以下部分:

    • 区域服务器
    • 备份主机
    • 任务
    • 软件属性

重新创建群集

在删除 HBase 群集后,可以通过使用相同的默认 Blob 容器创建另一个 HBase 群集。 新群集将选取已在原始群集中创建的 HBase 表。 不过,为了避免不一致,建议在删除群集之前先禁用 HBase 表。

可以使用 HBase 命令 disable 'Contacts'

清理资源

如果不打算继续使用此应用程序,请使用以下步骤删除创建的 HBase 群集:

  1. 登录 Azure 门户
  2. 在顶部的“搜索”框中,键入 HDInsight
  3. 选择“服务”下的“HDInsight 群集” 。
  4. 在显示的 HDInsight 群集列表中,单击为本教程创建的群集旁边的“...”。
  5. 单击 “删除” 。 单击 “是”

后续步骤

本教程介绍了如何创建 Apache HBase 群集、如何创建表以及如何从 HBase shell 查看这些表中的数据。 此外,学习了如何对 HBase 表中的数据使用 Hive 查询,以及如何使用 HBase C# REST API 创建 HBase 表并从该表中检索数据。 若要了解更多信息,请参阅以下文章: