
# 使用BulkLoad工具向HBase中批量导入数据
#### 应用场景
经常面临向HBase中导入大量数据的情景，向HBase中批量加载数据的方式有很多种，最直接方式是调用HBase的API使用put方法插入数据；另外一种是用MapReduce的方式从HDFS上加载数据。但是这两种方式效率都不是很高，因为HBase频繁进行flush、compact、split操作需要消耗较大的CPU和网络资源，并且RegionServer压力也比较大。
本实践基于华为云MapReduce服务，用于指导您创建MRS集群后，使用BulkLoad方式向HBase中批量导入本地数据，在首次数据加载时，能极大地提高写入效率，并降低对Region Server节点的写入压力。
#### 方案架构
Bulkload是HBase提供的一个数据导入工具，它可以将数据批量地导入到HBase表中，直接写入底层数据文件和‌WAL日志，从而显著提升了数据加载的速度和效率。‌
BulkLoad方式调用MapReduce的job直接将数据输出成HBase table内部的存储格式的文件HFile，然后将生成的StoreFiles加载到集群的相应节点。这种方式无需进行flush、compact、split等过程，不占用Region资源，不会产生巨量的写入I/O，所以需要较少的CPU和网络资源。
BulkLoad适合的场景：
- 大量数据一次性加载到HBase。
- 对数据加载到HBase可靠性要求不高，不需要生成WAL文件。
- 使用put加载大量数据到HBase速度变慢，且查询速度变慢时。
- 加载到HBase新生成的单个HFile文件大小接近HDFS block大小。
 
#### 步骤1：创建MRS离线查询集群
1. 进入[购买MRS集群页面](https://console.huaweicloud.com/mrs/?#/clusterCreate/quick)。
2. 选择"快速购买"，填写配置参数。
   表1软件配置 
   | 参数项        | 参数说明                                                                                                                                                                                                                                                                                                                            | 取值                                      |
   |:---|:---|:---|
   | 区域         | 不同区域的云服务产品之间内网互不相通。请就近选择靠近您业务的区域，可减少网络时延，提高访问速度。                                                                                                                                                                                                                                                                                | 华北-北京四                                  |
   | 计费模式       | MRS提供两种计费模式： - 包年/包月  - 按需计费                                                                                                                                       | 按需计费                                    |
   | 集群名称       | 集群名称不允许重复。只能由字母、数字、中划线和下划线组成，并且长度为1～64个字符。                                                                                                                                                                                                                                                                                      | MRS_hbase                               |
   | 集群类型       | 提供几种集群类型： - 分析集群  - 流式集群  - 混合集群  - 自定义   | 自定义                                     |
   | 版本类型       | 提供以下版本类型： - 普通版  - LTS版                                                                                                                 | 普通版                                     |
   | 集群版本       | MRS目前支持的版本。                                                                                                                                                                                                                                                                                                                     | MRS 3.1.0                               |
   | 组件选择       | MRS集群配套的组件，MRS不同版本集群支持的组件版本请参见[MRS组件版本一览表](https://support.huaweicloud.com/productdesc-mrs/mrs_08_0005.html)。                                                                                                                                                                                                                   | HBase查询集群                               |
   | 可用区        | 可用区是使用独立电源和网络资源的物理区域。通过内部网络互联，再以物理方式进行隔离，提高了应用程序的可用性。建议您在不同的可用区下创建集群。                                                                                                                                                                                                                                                           | 可用区1                                    |
   | 企业项目       | 企业项目所在的企业管理控制台以面向企业资源管理为出发点，帮助企业以公司、部门、项目等分级管理方式实现企业云上的人员、资源、权限、财务的管理。                                                                                                                                                                                                                                                          | default                                 |
   | 虚拟私有云      | VPC即虚拟私有云，是通过逻辑方式进行网络隔离，提供安全、隔离的网络环境。                                                                                                                                                                                                                                                                                           | vpc-01                                  |
   | 子网         | 通过子网提供与其他网络隔离的、可以独享的网络资源，以提高网络安全。                                                                                                                                                                                                                                                                                               | subnet-01                               |
   | Kerberos认证 | 当集群开启Kerberos认证时，需要确认是否需要开启Kerberos认证，若确认开启请单击"继续"，若无需开启Kerberos认证请单击"返回"关闭Kerberos认证后再创建集群。购买集群后，不支持修改。                                                                                                                                                                                                                        | 开启                                      |
   | 用户名        | 默认为"root/admin"，root用于远程登录ECS机器，admin用于登录集群管理页面。                                                                                                                                                                                                                                                                                | root/admin                              |
   | 密码         | 设置root用户和admin用户密码。                                                                                                                                                                                                                                                                                                             | 设置密码登录集群管理页面及ECS节点用户的密码，例如：Test!@12345。 |
   | 确认密码       | -                                                                                                                                                                                                                                                                                                                               | 再次输入设置用户密码                              |
   | 通信安全授权     | MRS集群通过管理控制台为用户发放、管理和使用大数据组件，大数据组件部署在用户的VPC内部，MRS管理控制台需要直接访问部署在用户VPC内的大数据组件时需要开通相应的安全组规则，而开通相应的安全组规则需要获取用户授权，此授权过程称为通信安全授权。 若不开启通信安全授权，MRS将无法创建集群。                                                                                                                                                 | 勾选"确认授权"                                |
      
   图1创建HBase查询集群   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001423429716.png "点击放大") 
3. 单击"立即购买"，等待MRS集群创建成功。 ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001167765694.png "点击放大")
   
 
#### 步骤2：将本地数据导入到HDFS中
1. 在本地准备一个学生信息文件"info.txt"，例如内容如下：
   字段信息依次为：学号、姓名、生日、性别、住址
   ```
   20200101245,张xx,20150324,男,City1
   20200101246,李xx,20150202,男,City2
   20200101247,杨xx,20151101,女,City3
   20200101248,陈xx,20150218,男,City4
   20200101249,李xx,20150801,女,City5
   20200101250,王xx,20150315,男,City6
   20200101251,李xx,20151201,男,City7
   20200101252,孙xx,20150916,女,City8
   20200101253,林xx,20150303,男,City9
   ```
   
2. 登录对象存储服务OBS控制台，单击"并行文件系统 \> 创建并行文件系统"，填写以下参数，单击"立即创建"。
   表2并行文件系统参数 
   | 参数项      | 取值        |
   |:---|:---|
   | 区域       | 华北-北京四    |
   | 文件系统名称   | mrs-hbase |
   | 数据冗余存储策略 | 单AZ存储     |
   | 策略       | 私有        |
   | 归档数据直读   | 关闭        |
   | 企业项目     | default   |
   | 标签       | -         |
      
   等待桶创建好，单击桶名称，选择"文件 \> 上传文件"，将数据文件上传至OBS并行文件系统内。
   
3. 切换回MRS控制台，单击创建好的MRS集群名称，进入"概览"，单击"IAM用户同步"所在行的"单击同步"，等待约5分钟同步完成。
4. 将数据文件上传HDFS。
   1. 在"文件管理"页签，选择"HDFS文件列表"，进入数据存储目录，如"/tmp/test"。 "/tmp/test"目录仅为示例，可以是界面上的任何目录，也可以通过"新建"创建新的文件夹。
      
   
   2. 单击"导入数据"。
      - OBS路径：选择上面创建好的OBS并行文件系统名，找到info.txt文件，单击"是"。
      
      - HDFS路径：选择HDFS路径，例如"/tmp/test"，单击"是"。
       
   
   3. 单击"确定"，等待导入成功，此时数据文件已上传至HDFS。
   
   
   图2导入数据   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001424299400.png "点击放大") 
 
#### 步骤3：创建HBase表
1. 登录集群的FusionInsight Manager页面（如果没有弹性IP，需提前购买弹性IP），新建一个用户hbasetest，绑定用户组supergroup，绑定角色System_administrator。 ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001162009855.png "点击放大")
   
2. 下载并安装集群全量客户端，例如在主Master节点上安装，客户端安装目录为"/opt/client"，相关操作可参考[安装客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_24212.html)。
   也可直接使用Master节点中自带的集群客户端，安装目录为"/opt/Bigdata/client"。
   
3. 为主Master节点绑定一个弹性IP，然后使用**root** 用户登录主Master节点，并进入客户端所在目录并认证用户。
   **cd /opt/client**
   **source bigdata_env**
   **kinit hbasetest**
   
4. 执行**hbase shell** 进入HBase Shell命令行界面。
   需要根据导入数据，规划HBase数据表的表名、rowkey、列族、列，考虑好row key分配在创建表时进行预分割。
   执行以下命令创建表"student_info"。
   **create 'student_info', {NAME =\> 'base',COMPRESSION =\> 'SNAPPY', DATA_BLOCK_ENCODING =\> 'FAST_DIFF'},SPLITS =\> \['1','2','3','4','5','6','7','8'\]**
   - NAME =\> 'base'：HBase表列族名称。
   
   - COMPRESSION：压缩方式
   
   - DATA_BLOCK_ENCODING：编码算法
   
   - SPLITS：预分region
    
5. 执行如下命令，查看表是否创建成功，然后退出HBase Shell命令行界面。 **list**
   
 
#### 步骤4：生成HFile文件并导入HBase
1. 创建自定义导入的模板文件，例如模板文件为"/opt/configuration_index.xml"（模板文件样例可从"客户端安装目录/HBase/hbase/conf/index_import.xml.template"获取）。 **vi /opt/configuration_index.xml**
   例如本案例中，模板文件如下：
   ```
   <?xml version="1.0" encoding="UTF-8"?>
   <configuration>
   <!--column_num要和数据文件中的列的数量对应：5列 -->
    <import column_num="5" id="first">
     <columns>
      <column type="string" index="1">P_ID</column>
      <column type="string" index="2">P_NAME</column>
      <column type="string" index="3">P_BIRTH</column>
      <column type="string" index="4">P_GENDER</column>
      <column type="string" index="5">P_DISTRICT</column>
     </columns>
   <!--reverse(P_BIRTH)：反转出生年月避免热点 -->
   <!--substring(P_NAME,0,1)：截取姓 -->
   <!--substring(P_ID,0,6)：截身学号前六位 -->
      <rowkey>
       reverse(P_BIRTH)+'_'+substring(P_NAME,0,1)+'_'+substring(P_ID,0,6)
      </rowkey>
     <qualifiers>
     <!--family的指定要和表的列族名称对应。 -->
      <normal family="base">
       <qualifier column="P_ID">H_ID</qualifier>
       <qualifier column="P_NAME">H_NAME</qualifier>
       <qualifier column="P_BIRTH">H_BIRTH</qualifier>
       <qualifier column="P_GENDER">H_GENDER</qualifier>
       <qualifier column="P_DISTRICT">H_DISTRICT</qualifier>
      </normal>
     </qualifiers>
    </import>
   </configuration>
   ```
   
2. 执行如下命令，生成HFile文件。 **hbase com.huawei.hadoop.hbase.tools.bulkload.ImportData -Dimport.separator=',' -Dimport.hfile.output=/tmp/test/hfile /opt/configuration_index.xml student_info /tmp/test/info.txt**
   - -Dimport.separator：分隔符。
   
   - -Dimport.hfile.output：执行结果输出路径。
   
   - /opt/configuration_index.xml：指向自定义的模板文件。
   
   - student_info：要操作的HBase表名。
   
   - /tmp/test/info.txt：指的是要批量上传的HDFS数据目录。
   
   - com.huawei.hadoop.hbase.tools.bulkload.IndexImportData：导入时创建二级索引使用IndexImportData；如果不创建二级索引，使用ImportData
   
   
   等待MapReduce任务执行成功，执行如下命令，输出路径下生成HFile文件。
   **hdfs dfs -ls /tmp/test/hfile**
   ```
   Found 2 items
   -rw-r--r--   3 hbasetest hadoop          0 2021-05-14 11:39 /tmp/test/hfile/_SUCCESS
   drwxr-xr-x   - hbasetest hadoop          0 2021-05-14 11:39 /tmp/test/hfile/base
   ```
   
3. 执行如下命令将HFile导入HBase表。 **hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/test/hfile student_info**
   
4. 进入HBase Shell命令行界面，查看表内容。 **hbase shell**
   **scan 'student_info', {FORMATTER =\> 'toString'}**
   ```
   ROW                                               COLUMN+CELL
    10115102_杨_202001                    column=base:H_BIRTH, timestamp=2021-05-14T15:28:56.755, value=20151101
    10115102_杨_202001                    column=base:H_DISTRICT, timestamp=2021-05-14T15:28:56.755, value=City3
    10115102_杨_202001                    column=base:H_GENDER, timestamp=2021-05-14T15:28:56.755, value=女
    10115102_杨_202001                    column=base:H_ID, timestamp=2021-05-14T15:28:56.755, value=20200101247
    10115102_杨_202001                    column=base:H_NAME, timestamp=2021-05-14T15:28:56.755, value=杨xx 
    10215102_李_202001                    column=base:H_BIRTH, timestamp=2021-05-14T15:28:56.755, value=20151201
    10215102_李_202001                    column=base:H_DISTRICT, timestamp=2021-05-14T15:28:56.755, value=City7
   ...
   ```
   
5. 数据导入集群后，就可以继续基于大数据平台上层应用对数据进行分析处理了。
 
