使用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和网络资源。
- 大量数据一次性加载到HBase。
- 对数据加载到HBase可靠性要求不高,不需要生成WAL文件。
- 使用put加载大量数据到HBase速度变慢,且查询速度变慢时。
- 加载到HBase新生成的单个HFile文件大小接近HDFS block大小。
步骤1:创建MRS离线查询集群
- 进入购买MRS集群页面。
- 选择“快速购买”,填写配置参数。
表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查询集群
- 单击“立即购买”,等待MRS集群创建成功。
步骤2:将本地数据导入到HDFS中
- 在本地准备一个学生信息文件“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
- 登录对象存储服务OBS控制台,单击“并行文件系统 > 创建并行文件系统”,填写以下参数,单击“立即创建”。
表2 并行文件系统参数 参数项
取值
区域
华北-北京四
文件系统名称
mrs-hbase
数据冗余存储策略
单AZ存储
策略
私有
归档数据直读
关闭
企业项目
default
标签
-
等待桶创建好,单击桶名称,选择“文件 > 上传文件”,将数据文件上传至OBS并行文件系统内。
- 切换回MRS控制台,单击创建好的MRS集群名称,进入“概览”,单击“IAM用户同步”所在行的“单击同步”,等待约5分钟同步完成。
- 将数据文件上传HDFS。
- 在“文件管理”页签,选择“HDFS文件列表”,进入数据存储目录,如“/tmp/test”。
“/tmp/test”目录仅为示例,可以是界面上的任何目录,也可以通过“新建”创建新的文件夹。
- 单击“导入数据”。
- OBS路径:选择上面创建好的OBS并行文件系统名,找到info.txt文件,单击“是”。
- HDFS路径:选择HDFS路径,例如“/tmp/test”,单击“是”。
- 单击“确定”,等待导入成功,此时数据文件已上传至HDFS。
图2 导入数据
- 在“文件管理”页签,选择“HDFS文件列表”,进入数据存储目录,如“/tmp/test”。
步骤3:创建HBase表
- 登录集群的FusionInsight Manager页面(如果没有弹性IP,需提前购买弹性IP),新建一个用户hbasetest,绑定用户组supergroup,绑定角色System_administrator。
- 下载并安装集群全量客户端,例如在主Master节点上安装,客户端安装目录为“/opt/client”,相关操作可参考安装客户端。
也可直接使用Master节点中自带的集群客户端,安装目录为“/opt/Bigdata/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命令行界面。
步骤4:生成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命令行界面,查看表内容。
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 ...
- 数据导入集群后,就可以继续基于大数据平台上层应用对数据进行分析处理了。