【云小课】EI第19课 MRS离线数据迁移-使用BulkLoad向HBase中批量导入数据

我们经常面临向HBase中导入大量数据的情景,HBase中批量加载数据的方式有很多种,最直接方式是调用HBaseAPI使用put方法插入数据;另外一种是用MapReduce的方式从HDFS上加载数据。但是这两种方式效率都不是很高,因为HBase频繁进行flushcompactsplit操作需要消耗较大的CPU和网络资源,并且RegionServer压力也比较大。

本实践基于华为云MapReduce服务,用于指导您创建MRS集群后,使用BulkLoad方式向HBase中批量导入本地数据,在首次数据加载时,能极大的提高写入效率,并降低对Region Server节点的写入压力。

云小课logo.png

本案例基本操作流程如下所示:

  1. 创建MRS离线查询集群。
  2. 将本地数据导入到HDFS中。
  3. 创建HBase表。
  4. 生成HFile文件并导入HBase

场景描述

BulkLoad方式调用MapReducejob直接将数据输出成HBase table内部的存储格式的文件HFile,然后将生成的StoreFiles加载到集群的相应节点。这种方式无需进行flushcompactsplit等过程,不占用Region资源,不会产生巨量的写入I/O,所以需要较少的 CPU 和网络资源。

BulkLoad适合的场景:

  • 大量数据一次性加载到HBase
  • 对数据加载到HBase可靠性要求不高,不需要生成WAL文件。
  • 使用put加载大量数据到HBase速度变慢,且查询速度变慢时。
  • 加载到HBase新生成的单个HFile文件大小接近HDFS block大小。

创建MRS离线查询集群

  1. 登录华为云MRS控制台,选择“EI企业智能 > MapReduce服务”,单击“购买集群”,选择“快速购买”,填写相关软件配置参数,单击“下一步”。

    参数项

    取值

    区域

    华北-北京四

    计费模式

    按需计费

    集群名称

    MRS01

    集群版本

    MRS 3.0.5

    组件选择

    HBase查询集群

    可用区

    可用区1

    虚拟私有云

    vpc-01

    子网

    subnet-01

    企业项目

    default

    用户名

    root/admin

    密码

    设置密码,例如:Huawei@12345。该密码用于登录集群管理页面及ECS节点。

    确认密码

    再次输入设置用户密码

    通信安全授权

    勾选“确认授权”

  2. 单击“立即购买”,等待约15分钟,MRS集群创建成功。


将本地数据导入到HDFS中

  1. 在本地准备一个学生信息文件“info.txt”。

    例如字段信息依次为:学号、姓名、生日、性别、住址。

    20200101245,张晓明,20150324,男,龙岗区
    20200101246,李敏林,20150202,男,宝安区
    20200101247,杨小刚,20151101,女,龙岗区
    20200101248,陈嘉玲,20150218,男,宝安区
    20200101249,李明耀,20150801,女,龙岗区
    20200101250,王艳艳,20150315,男,南山区
    20200101251,李荣中,20151201,男,福田区
    20200101252,孙世伟,20150916,女,龙华区
    20200101253,林维嘉,20150303,男,福田区
  2. 登录华为云OBS管理控制台,单击“创建桶”,填写以下参数,单击“立即创建”。

    参数项

    取值

    区域

    华北-北京四

    数据冗余存储策略

    AZ存储

    桶名称

    mrs-hbase

    存储类别

    标准存储

    桶策略

    私有

    默认加密

    关闭

    归档数据直读

    关闭

    企业项目

    default

    标签

    -

    等待桶创建好,单击桶名称,选择“对象 > 上传对象”,将数据文件上传至OBS桶内。

    image009.png

  3. 切换回MRS控制台,单击创建好的MRS集群名称,进入“概览”,单击“IAM用户同步”所在行的“单击同步”,等待约5分钟同步完成。
  4. 将数据文件上传HDFS
    1. 在“文件管理”页签,创建“/tmp/test”目录,
    2. 单击“导入数据”。
      • OBS路径:选择上面创建好的OBS桶名,找到txt文件,单击“是”。
      • HDFS路径:创建并选择“/tmp/test”,单击“是”。
    3. 单击“确定”,等待导入成功,此时数据文件已上传至HDFS

      image011.png

创建HBase表

  1. 登录MRS集群的FusionInsight Manager页面(如果没有弹性IP,需提前购买弹性IP),新建一个用户hbasetest,绑定用户组supergroup,绑定角色System_administrator

    image013.png

  2. 下载并安装集群全量客户端,例如客户端安装目录为“/opt/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

生成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。

  3. 等待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
  4. 执行如下命令将HFile导入HBase表。
    hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/test/hfile student_info
  5. 命令执行完成后,执行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=龙岗区
     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=杨小刚 
     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=福田区
    ...
  6. 数据导入集群后,就可以继续基于大数据平台上层应用对数据进行分析处理了。

20200805-112140(eSpace).png好了,本期云小课就介绍到这里,快去体验MapReduce(MRS)更多功能吧!猛戳这里

(完)