71. Bulk Loading
71.1. 概述
HBase向表中加载数据,有几种数据加载模式。最直接的方法是在MapReduce任务中使用TableOutputFormat类加载,或者使用普通的APIs客户端。但这些都不是最高效的方式。
bulk load特性使用MapReduce任务将数据转换成HBase的内部数据格式,然后直接加载到集群的存储文件中。相比与普通的HBase API,bulk load使用了更少的CPU和网络资源。
71.2. Bulk Load 局限性
由于BulkLoad是绕过了Write to WAL,Write to MemStore及Flush to disk的过程,因此,由于WAL并不能看到bulk加载的数据,故不能通过WAL来进行一些复制数据的操作——等同于使用了Put.setDurability(SKIP_WAL)。处理方法可以将一个未加工文件或者HFile传输到另一个集群处理。
One way to handle that is to ship the raw files or the HFiles to the other cluster and do the other processing there.
71.3. Bulk Load 架构
HBase进行 bulk load 处理主要包含两步骤.
71.3.1. MapReduce预处理数据
第一步:通过MapReduce任务使用HFileOutputFormat2函数 生成HBase数据文件(StoreFiles),输出数据为HBase的内部数据格式,以便随后装载到集群更高效。
为了函数效率,HFileOutputFormat2必须设置每个一个输出HFile文件匹配一个单独的region。为了做到这一点,输出将被批量装载到HBase的任务,使用Hadoop 的TotalOrderPartitioner 类来分开map输出为分开的键空间区间,对应于表内每个分区(region)的键空间。HFileOutputFormat2 提供了一个便利的函数 configureIncrementalLoad(), 可以基于表当前分区范围自动设置TotalOrderPartitioner。
71.3.2. 数据装载
导入数据准备完成后,使用“importtsv”工具的“importtsv.bulk.output”选项或者通过其他的MapReduce job使用HFileOutputFormat函数导入数据到集群中。此命令行工具循环访问已经处理好的数据,使每一个文件加载到分区中。并且出发对应RegionServer接收HFile数据,将数据移到存储目录并将数据设置对客户端有效。
如果bulk load预处理期间region边界发生变化,或者在预处理和完成步骤中间region边界发生变化,那么completebulkload 功能jaing自动拆分数据文件,生成拥有正确边界的新分片。这个处理过程效率不是很好,所以用户应当尽量减小预处理数据和导入数据的延迟,尽快将数据导入集群,特别是有其他客户端同时装载数据时。
$ hadoop jar hbase-server-VERSION.jar completebulkload [-c /path/to/hbase/config/hbase-site.xml] /user/todd/myoutput mytable
-c : 配置文件选项,如果没有指定CLASSPATH目录(如果zookeeper没有被HBase管理,那么CLASSPATH必须包含zookeeper配置文件路径),那么此选项用来指定hbase参数文件(例如:hbase-site.xml),此外,如果zookeeper没有被HBase管理。
注:如果目标表在HBase中不存在,那么加载数据同时将自动创建表。
71.4. 参考
更多详细功能,请见ImportTsv 与 CompleteBulkLoad介绍.
bulk loading使用参考How-to: Use HBase Bulk Loading, and Why (http://blog.cloudera.com/blog/2013/09/how-to-use-hbase-bulk-loading-and-why/)
71.5. 高级用法
尽管许多案例实现使用的是importtsv 工具可,但高级用户有可能希望编程实现生成数据,或者从另一种格式导入。如果向实现此功能请研究“ImportTsv.java”和JavaDoc文件中的HFileOutputFormat函数。
导入步骤也可以以编程方式实现。更多信息请参考LoadIncrementalHFiles类。