提出问题
在实际生产中,一般先有了海量数据,需要将 海量数据 导入 到表中。
如果通过 hbase api的方式 或者 shell 客户端方式 导入 海量数据,可能耗时会比较严重或者占用HBase集群资源较多(如磁盘IO、HBase Handler数等)。
解决
使用HBase BulkLoad 的方式来进行海量数据批量写入到HBase
BulkLoad的使用场景
大量数据一次性加载到HBase。(首次将原始数据载入HBase)
对数据加载到HBase可靠性要求不高,不需要生成WAL文件。
使用put加载大量数据到HBase速度变慢,且查询速度变慢时。
加载到HBase新生成的单个HFile文件大小接近HDFS block大小。
数据需要源于其他位置:需要将其他业务库的数据合并到HBase中,可以从源系统中将数据定期批量加载到HBase中。
要定期加载新数据,使用BulkLoad并按照自己的理想时间间隔分批次导入数据。注意如果频繁导入大量HFile可能会导致更频繁地发生大型压缩,从而对性能产生负面影响。
BulkLoad 原理
HBase的存储机制
先复习 HBase的存储机制:HBase存储数据其底层使用的是HDFS来作为存储介质,HBase的每一张表对应的HDFS目录上的一个文件夹,文件夹名以HBase表进行命名(如果没有使用命名空间,则默认在default目录下),在表文件夹下存放在若干个Region命名的文件夹,Region文件夹中的每个列簇也是用文件夹进行存储的,每个列簇中存储就是实际的数据,以HFile的形式存在。
路径格式如下:
/hbase/data/default/<tbl_name>/<region_id>/<cf>/<hfile_id>
实现原理
按照HBase存储数据按照HFile格式存储在HDFS的原理,使用MapReduce直接生成HFile格式的数据文件,然后在通过RegionServer将HFile数据文件移动到相应的Region上去。
流程如下图所示:
三个过程:
- Transform阶段:使用MapReduce将HDFS上的数据生成HBase的底层HFile数据。
- Load阶段:根据生成的目标HFile,利用HBase提供的BulkLoad工具将HFile Load到HBase的region中。
- 加载完数据后原来生成的HFile文件将会被移除(也就是load的过程其实就是文件剪切的过程,此过程类似于hive的load的过程)
注意:在bulkLoading执行之前要提前把数据导入到hdfs上,因为mapreduce只能读取HDFS上的数据;如果原始数据在hdfs上占用100G大小的空间,那么hdfs上的预留的空间大小要大于200G,因为数据要首先生成hfile也是放在hdfs临时目录下。
案例
见下面链接
参考:
https://blog.csdn.net/godlovedaniel/article/details/104904471
https://www.cnblogs.com/smartloli/p/9501887.html
https://cloud.tencent.com/developer/article/1887283
