一、原理

1.1、采用Put方式向HBase表中插入数据流程:

  会涉及到flush、split、compaction等操作,容易造成节点不稳定,数据导入慢,耗费资源等问题,在海量数据的导入过程极大的消耗了系统性能。

Put
	-> WAL 预写日志
	-> MemStore(内存) ,当达到一定大写Spill到磁盘上:StoreFile(HFile)

hbase的增量bulkload的命令 hbase bulkload命令_hbase的增量bulkload的命令

1.2、对海量数据插入,将数据直接保存为HFile文件,然后加载到HBase表中

1.2.1、Bulkload过程主要包括三部分

  • 1、从数据源(通常是文本文件或其他的数据库)提取数据并上传到HDFS。
  • 2、 生成hfile
  • 3、告诉RegionServers数据的位置并导入数据。 通常需要使用LoadIncrementalHFiles(更为人所熟知是completebulkload工具),将文件在HDFS上的位置传递给它,它就会利用RegionServer将数据导入到相应的区域。

二、实现BulkLoad

2.1、HBASE结合MapReduce批量导入

  BulkLoader利用HBase数据按照HFile格式存储在HDFS的原理,使用MapReduce直接批量生成HFile格式文件后,RegionServers再将HFile文件移动到相应的Region目录下。

hbase的增量bulkload的命令 hbase bulkload命令_hbase_02

1)、Extract,异构数据源数据导入到 HDFS 之上。 2)、Transform,通过用户代码,可以是 MR 或者 Spark 任务将数据转化为 HFile。 3)、Load,HFile 通过 loadIncrementalHFiles 调用将 HFile 放置到 Region 对应的HDFS 目录上,该过程可能涉及到文件切分。

2.2、Hbase结合Spark批量导入

HBase数据库提供批量导入数据至表功能,相关知识点如下:

1、Hbase 中LoadIncrementalHFiles 支持向Hbase 写入HFile 文件 2、写入的HFile 文件要求是排序的(rowKey,列簇,列) 3、关键是绕过Hbase regionServer,直接写入Hbase文件 4、Spark RDD的repartitionAndSortWithinPartitions 方法可以高效地实现分区并排序 5、JAVA util.TreeMap 是红黑树的实现,能很好的实现排序的要求

编写应用开发流程如下: 1、对待写入的数据按Key值构造util.TreeMap 树结构。目的是按Key值构造匹配Hbase 的排序结构 2、转换成RDD,使用repartitionAndSortWithinPartitions算子 对Key值分区并排序 3、调用RDD的saveAsNewAPIHadoopFile 算子,生成HFile文件 4、调用Hbase: LoadIncrementalHFiles 将HFile文件Load 到Hbase 表中

2.2.1、注意

1、生成hfile, rowkey必须有序 2、hase-2.0.2之后,对列也要求有序 3、注意 LoadIncrementalHFiles 的包变化, HFileOutputFormat2· 的包变化

三、问题

3.1、BulkLoad Failed due to no write permission on input files

在使用bulkload加载hfile时候总是报错hbase在hfile目录没有写权限,导致操作失败。

Caused by: org.apache.hadoop.security.AccessControlException: Permission denied: user=hbase, access=WRITE, inode="/apps/hbase/dat
a/data/hbaseCache/chb/10.9.58.117/chb_20180529_93305538/cf1/dd6a800373c14572bfccb59dde4b96c9":12285:hdfs:drwxr-xr-x

解决bulkload 参考下面两篇文章, 按照issuses上介绍, 这个是hbase的版本问题。 https://issues.apache.org/jira/browse/PHOENIX-976 https://issues.apache.org/jira/browse/HBASE-12052(解决方法) 两种解决方案:

  • 1.关闭dfs.permissions
  • 2.在secure env 下运行 我发现我的测试环境就是unsecure env所以总是导致hbase user has no write permission on input files.我暂时选择第一种方法