• 沒有找到結果。

离线数据迁移-使用 BulkLoad 向 HBase 中批量导入数据

我们经常面临向HBase中导入大量数据的情景,向HBase中批量加载数据的方式有很多

的方式从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. 登录华为云控制台,选择“大数据 > MapReduce服务”,单击“购买集群”,选 择“快速购买”,填写软件配置参数,单击“下一步”。

2-13 表 1 软件配置

参数项 取值

区域 华北-北京四

计费模式 按需计费

集群名称 MRS_hbase

集群版本 MRS 3.1.0

组件选择 HBase查询集群

可用区 可用区1

虚拟私有云 vpc-01

子网 subnet-01

企业项目 default

参数项 取值

用户名 root/admin

密码 设置密码登录集群管理页面及ECS节点

用户的密码,例如:Test!@12345。

确认密码 再次输入设置用户密码

通信安全授权 勾选“确认授权”

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控制台,单击“创建桶”,填写以下参数,单击“立即创 建”。

2-14 桶参数

参数项 取值

区域 华北-北京四

数据冗余存储策略 单AZ存储

桶名称 mrs-hbase

默认存储类别 标准存储

桶策略 私有

默认加密 关闭

归档数据直读 关闭

企业项目 default

标签

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

3. 切换回MRS控制台,单击创建好的MRS集群名称,进入“概览”,单击“IAM用 户同步”所在行的“单击同步”,等待约5分钟同步完成。

4. 将数据文件上传HDFS。

a. 在“文件管理”页签,选择“HDFS文件列表”,进入数据存储目录,如

“/tmp/test”。

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

b. 单击“导入数据”。

OBS路径:选择上面创建好的OBS桶名,找到info.txt文件,单击

“是”。

HDFS路径:创建并选择“/tmp/test”,单击“是”。

c. 单击“确定”,等待导入成功,此时数据文件已上传至HDFS。

创建 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命令行界面。

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

MapReduce服务(MapReduce Service,简称MRS)提供企业级大数据集群云服务,

里面包含HDFS、Hive、Spark等组件,适用于企业海量数据分析。

其中Hive提供类SQL查询语言,帮助用户对大规模的数据进行提取、转换和加载,即 通常所称的ETL(Extraction,Transformation,and Loading)操作。对庞大的数据集 查询需要耗费大量的时间去处理,在许多场景下,可以通过建立Hive分区方法减少每