文档首页/ MapReduce服务 MRS/ 最佳实践/ 数据迁移/ 使用BulkLoad工具向HBase中批量导入数据
更新时间:2024-11-12 GMT+08:00

使用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集群页面
  2. 选择“快速购买”,填写配置参数。
    表1 软件配置

    参数项

    参数说明

    取值

    区域

    不同区域的云服务产品之间内网互不相通。请就近选择靠近您业务的区域,可减少网络时延,提高访问速度。

    中国-香港

    计费模式

    MRS提供两种计费模式:
    • 包年/包月
    • 按需计费

    选择“按需计费”时,可能需要冻结一定的保证金。详细内容,请参见计费说明

    按需计费

    集群名称

    集群名称不允许重复。只能由字母、数字、中划线和下划线组成,并且长度为1~64个字符。

    MRS_hbase

    集群类型

    提供几种集群类型:
    • 分析集群
    • 流式集群
    • 混合集群
    • 自定义

    自定义

    版本类型

    提供以下版本类型:

    • 普通版
    • LTS版

    普通版

    集群版本

    MRS目前支持的版本。

    MRS 3.1.0

    组件选择

    MRS集群配套的组件,MRS不同版本集群支持的组件版本请参见MRS组件版本一览表

    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查询集群
  3. 单击“立即购买”,等待MRS集群创建成功。

步骤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 导入数据

步骤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

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