会涉及到flush、split、compaction
等操作,容易造成节点不稳定,数据导入慢,耗费资源等问题,在海量数据的导入过程极大的消耗了系统性能。
Put
-> WAL 预写日志
-> MemStore(内存) ,当达到一定大写Spill到磁盘上:StoreFile(HFile)
- 1、从数据源(通常是文本文件或其他的数据库)提取数据并上传到HDFS。
- 2、 生成hfile
- 3、告诉RegionServers数据的位置并导入数据。 通常需要使用LoadIncrementalHFiles(更为人所熟知是
completebulkload
工具),将文件在HDFS上的位置传递给它,它就会利用RegionServer将数据导入到相应的区域。
BulkLoader利用HBase数据按照HFile格式存储在HDFS的原理,使用MapReduce直接批量生成HFile格式文件后,RegionServers
再将HFile
文件移动到相应的Region目录下。
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 表中
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.
我暂时选择第一种方法