Hbase Bulkload
前言
Apache HBase 是目前大数据系统中应用最为广泛的分布式数据库之一。我们经常面临向 HBase 中导入大量数据的情景,通常会选择使用标准的客户端 API 对 HBase 进行直接的操作,或者在MapReduce作业中使用 TableOutputFormat 作为输出。实际上,借助 HBase 的 Bulk Load 特性可以更加便捷、快速地向HBase数据库中导入数据。
MapReduce 在写入 HBase 时常采用 TableOutputFormat 方式,直接写入 HBase,但该方式在大量数据写入时效率比较低下(频繁进行 flush、split、compat等I/O操作),并对 HBase 节点稳定性造成影响( RegionServer 无响应)。
HBase的数据实际上是以特定格式存储在 HDFS 上的,因而 Bulk Load 就是先将数据按照HBase的内部数据格式生成持久化的 HFile 文件,然后复制到合适的位置并通知 RegionServer ,即完成巨量数据的入库。在生成 HFile 时无需占用 Region 资源,降低了 HBase 节点的写入压力,在大量数据写入时能极大地提高写入效率。
Bulk Load 简介
使用 Bulk Load 特性将数据导入 HBase 通常需要分为三个阶段:
从数据源中提取数据
通常需要导入的外部数据都是存储在其它的关系型数据库或一些文本文件中,我们需要将数据提取出来并放置于 HDFS 中。借助 Sqoop 这一工具可以解决大多数关系型数据库向 HDFS 迁移数据的问题.
通过 MapReduce 任务生成 HFile
在进行数据导入时,需要对数据进行预处理,如过滤无效数据、数据格式转换等。通常按照不同的导入要求,需要编写不同的 Mapper;Reducer 由 HBase 负责处理。为了按照 HBase 内部存储格式生成数据,一个重要的类是 HFileOutputFormat2
(HBase 1.0.0以前版本使用 HFileOutputFormat
)。为了更有效地导入数据, 每一个输出的 HFile 要恰好适应一个 Region。为了确保这一点, 需要使用 TotalOrderPartitioner
类将 map 的输出切分为 key 互不相交的部分。HFileOutputFormat2
类中的 configureIncrementalLoad()
方法会依据当前表中的 Region 边界自动设置 TotalOrderPartitioner
。
完成数据导入
一旦数据准备好,就可以使用 completebulkload
工具将生成的 HFile 导入HBase 集群中。completebulkload
是一个命令行工具,对生成的 HFile 文件迭代进行处理,对每一个 HFile, 确定所属的 region, 然后联系对应的 RegionServer, 将数据移动至相应的存储路径。
如果在准备数据过程中,或者在使用 completebulkload
导入数据过程中, region 的边界发生了改变(split), completebulkload
工具会按照新的边界自动切分数据文件。这个过程可能会对性能造成影响。
除了使用 completebulkload
工具外,也可以在程序中完成, LoadIncrementalHFiles
类提供了相应的方法