文档首页> MapReduce服务 MRS> 最佳实践> 数据迁移> 使用BulkLoad向HBase中批量导入数据
更新时间:2023-10-19 GMT+08:00
分享

使用BulkLoad向HBase中批量导入数据

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

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

基本内容如下所示:

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

场景描述

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

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

创建MRS离线查询集群

  1. 进入购买MRS集群页面
  2. 选择“快速购买”,填写配置参数。
    表1 表1 软件配置

    参数项

    取值

    区域

    华北-北京四

    计费模式

    按需计费

    集群名称

    MRS_hbase

    版本类型

    普通版

    集群版本

    MRS 3.1.0

    组件选择

    HBase查询集群

    可用区

    可用区1

    企业项目

    default

    虚拟私有云

    vpc-01

    子网

    subnet-01

    Kerberos认证

    开启

    用户名

    root/admin

    密码

    设置密码登录集群管理页面及ECS节点用户的密码,例如:Test!@12345。

    确认密码

    再次输入设置用户密码

    通信安全授权

    勾选“确认授权”

    图1 创建HBase查询集群
  3. 单击“立即购买”,等待MRS集群创建成功。

将本地数据导入到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桶内。

    图2 上传数据文件
  3. 切换回MRS控制台,单击创建好的MRS集群名称,进入“概览”,单击“IAM用户同步”所在行的“单击同步”,等待约5分钟同步完成。
  4. 将数据文件上传HDFS。
    1. 在“文件管理”页签,选择“HDFS文件列表”,进入数据存储目录,如“/tmp/test”。

      “/tmp/test”目录仅为示例,可以是界面上的任何目录,也可以通过“新建”创建新的文件夹。

    2. 单击“导入数据”。
      • OBS路径:选择上面创建好的OBS桶名,找到info.txt文件,单击“是”。
      • HDFS路径:选择HDFS路径,例如“/tmp/test”,单击“是”。
    3. 单击“确定”,等待导入成功,此时数据文件已上传至HDFS。
    图3 导入数据

创建HBase表

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

  2. 下载并安装集群全量客户端,例如在主Master节点上安装,客户端安装目录为“/opt/client”,相关操作可参考安装客户端

    也可直接使用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

生成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. 数据导入集群后,就可以继续基于大数据平台上层应用对数据进行分析处理了。
分享:

    相关文档

    相关产品