我们经常面临向HBase中导入大量数据的情景,向HBase中批量加载数据的方式有很多种,最直接方式是调用HBase的API使用put方法插入数据;另外一种是用MapReduce的方式从HDFS上加载数据。但是这两种方式效率都不是很高,因为HBase频繁进行flush、compact、split操作需要消耗较大的CPU和网络资源,并且RegionServer压力也比较大。
本实践基于华为云MapReduce服务,用于指导您创建MRS集群后,使用BulkLoad方式向HBase中批量导入本地数据,在首次数据加载时,能极大的提高写入效率,并降低对Region Server节点的写入压力。
本案例基本操作流程如下所示:
- 创建MRS离线查询集群。
- 将本地数据导入到HDFS中。
- 创建HBase表。
- 生成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离线查询集群
- 登录华为云MRS控制台,选择“EI企业智能 > MapReduce服务”,单击“购买集群”,选择“快速购买”,填写相关软件配置参数,单击“下一步”。
参数项
取值
区域
华北-北京四
计费模式
按需计费
集群名称
MRS01
集群版本
MRS 3.0.5
组件选择
HBase查询集群
可用区
可用区1
虚拟私有云
vpc-01
子网
subnet-01
企业项目
default
用户名
root/admin
密码
设置密码,例如:Huawei@12345。该密码用于登录集群管理页面及ECS节点。
确认密码
再次输入设置用户密码
通信安全授权
勾选“确认授权”
- 单击“立即购买”,等待约15分钟,MRS集群创建成功。
将本地数据导入到HDFS中
- 在本地准备一个学生信息文件“info.txt”。
例如字段信息依次为:学号、姓名、生日、性别、住址。
20200101245,张晓明,20150324,男,龙岗区 20200101246,李敏林,20150202,男,宝安区 20200101247,杨小刚,20151101,女,龙岗区 20200101248,陈嘉玲,20150218,男,宝安区 20200101249,李明耀,20150801,女,龙岗区 20200101250,王艳艳,20150315,男,南山区 20200101251,李荣中,20151201,男,福田区 20200101252,孙世伟,20150916,女,龙华区 20200101253,林维嘉,20150303,男,福田区
- 登录华为云OBS管理控制台,单击“创建桶”,填写以下参数,单击“立即创建”。
参数项
取值
区域
华北-北京四
数据冗余存储策略
单AZ存储
桶名称
mrs-hbase
存储类别
标准存储
桶策略
私有
默认加密
关闭
归档数据直读
关闭
企业项目
default
标签
-
- 切换回MRS控制台,单击创建好的MRS集群名称,进入“概览”,单击“IAM用户同步”所在行的“单击同步”,等待约5分钟同步完成。
- 将数据文件上传HDFS。
- 在“文件管理”页签,创建“/tmp/test”目录,
- 单击“导入数据”。
- OBS路径:选择上面创建好的OBS桶名,找到txt文件,单击“是”。
- HDFS路径:创建并选择“/tmp/test”,单击“是”。
- 单击“确定”,等待导入成功,此时数据文件已上传至HDFS。
创建HBase表
- 登录MRS集群的FusionInsight Manager页面(如果没有弹性IP,需提前购买弹性IP),新建一个用户hbasetest,绑定用户组supergroup,绑定角色System_administrator。
- 下载并安装集群全量客户端,例如客户端安装目录为“/opt/client”,相关操作可参考安装客户端。
- 为主Master节点绑定一个弹性IP,然后使用root用户登录主Master节点,进入客户端所在目录并认证用户。
cd /opt/client source bigdata_env kinit hbasetest
- 执行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 - 查看表是否创建成功,然后退出HBase Shell命令行界面。
list
生成HFile文件并导入HBase
- 创建自定义导入的模板文件,例如模板文件为“/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>
- 执行如下命令,生成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
- 执行如下命令将HFile导入HBase表。
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/test/hfile student_info
- 命令执行完成后,执行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=福田区 ...
- 数据导入集群后,就可以继续基于大数据平台上层应用对数据进行分析处理了。
好了,本期云小课就介绍到这里,快去体验MapReduce(MRS)更多功能吧!猛戳这里