我们经常面临向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分区方法减少每