1.概述
往hbase中批量加载数据的方式有很多种,最直接方式是调用hbase的API用put方法插入数据;另外一种是用MapReduce的方式从hdfs上加载数据,调用TableOutputFormat 类在reduce中直接生成put对象写入HBase(这种方式可以看作多线程的调用hbase API方式);但是这两种方式效率都不是很高。
Bulk Load 方式调用MapReduce的job直接将数据输出成hbase table内部的存储格式的文件HFile,然后将生成的StoreFiles 加载集群的相应节点。这种方式相对于直接调用hbase API来说可以耗费更少的CPU和网络IO,而且不占用region资源,增添负载,在首次数据加载时,能极大的提高写入效率,并降低对HBase节点的写入压力。
2.写入流程对比
2.1 Hbase API方式数据导入流程
了解调用Hbase API方式导入流程之前,我们先来看一张hbase的架构图。
图1 Hbase架构图
Region Server 管理一系列的region,每个region又由多个Store组成;
每个Store对应hbase的一个列族(Column Family),每个Store又由MemStore和StoreFile两部分组成;
MemStore是sorted Memory Buffer,MemStore满之后会flush到StoreFile中,每个StoreFile对应一个实际的HFile文件。
HLog记录每个RegionServer的数据操作日志,防止RegionServer突然宕机导致MemStore中的数据丢失,如果regionServer突然宕机,HLog将对丢失的数据进行恢复;HLog中的数据会定期滚动更新,删除已经持久化到StoreFile的旧文件。
下面看调用HBase API往Hbase中插入数据的流程。
图2 hbase的写流程
-client端写入操作数据传到Region Server中,默认首先会写入到WAL(Write Ahead Log)中,也就是HLog中,然后才将数据写入到对应region的memStore中,memStore满了之后,flush到HFile中。当然,可以在程序端禁掉写WAL;
-当StoreFile数量达到一定的阈值,会触发compact合并操作,将多个storeFile合并成一个大的StoreFile,单个StoreFile过大超过阈值之后会触发region的split操作,并将大的StoreFile一分为二。
图3 StoreFile Compact和Split过程
综上,调用Hbase的API方式写入效率不算高,hbase会频繁的进行flush、compact、split操作,并且region Server压力也比较大。
2.2 bulkLoad方式数据导入流程
图4 bulk loading架构图
Bulk loading 方式数据导入大致可分为三部分:
-数据导入到hdfs;
-调用mapreduce生成HFile文件;
-将HFile文件加载到不同的region中。
在这里需要注意,第一步需要在bulk Loading程序执行之前提前准备好,因为mapreduce只能读取HDFS上的数据;如果原始数据在hdfs上占用100G大小的空间,那么hdfs上的预留的空间大小要大于200G,因为数据要首先生成hfile放在临时目录下,最终还要加载到hbase里。
3 适用场景对比说明
bulk loading方式也有局限性,它在初次大规模加载的时候效率很高,增量加载的时候效率会大打折扣,hbase中如果已经有很多数据,往region导入新的hfile会触发大量的compact和split操作。
如果考虑到增量导数据,并且数据是存在hadoop集群之外的,可以考虑用多线程直接调用Hbase API的方式。
笔者在一次客户现场的测试中曾经纠结过选择哪种方式导数据,最后通过对比还是选择了多线程导hbase API的方式,后来分析当时的场景确实不太适合bulkload的方式。
客户提供了一些400K左右的小文件,共700000个,300G,平均分成两份分别放在两个hadoop集群之外的服务器上。通过nfs客户端传到hdfs上速度不到10M/s,由于bulkload调用mapreduce,每个文件启动一个map,所以bulkload的速度也特别慢。于是我开始尝试用多线程调用hbase API的方式导数据,每个测试服务器启动12个线程循环遍历数据文件列表往hbase中压数据,hbase表提前进行了预分区,所以不会在某个region上出现写数据的热点;最后测试结果很出人意料,测试服务器的带宽都压满了,每个导数据的客户端输出平均为100M/S(采用千兆环境),整个Hbase的入库速率为200M/S,300G数据用时30分钟。
集群的IO监控如上图所示,11:54启动的数据导入作业。
参考文献:
http://hbase.apache.org/book.html#arch.bulk.load
http://blog.csdn.net/kirayuan/article/details/6371635
http://shitouer.cn/2013/02/hbase-hfile-bulk-load/
http://hbase.apache.org/book.html#arch.bulk.load.limitations
http://blog.cloudera.com/blog/2013/09/how-to-use-hbase-bulk-loading-and-why/
http://blog.chinaunix.net/uid-7747097-id-3137563.html
http://itindex.net/detail/49632-hbase-%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98
---------------------
作者:大明湖里有蛤蟆
来源:CSDN
原文:https://blog.csdn.net/chaolovejia/article/details/46357001
版权声明:本文为博主原创文章,转载请附上博文链接!