2 回答
TA贡献1775条经验 获得超8个赞
一、通常向HBase批量导入数据有三种常用方式
1、使用HBase提供的TableOutputFormat,原理是通过一个Mapreduce作业将数据导入HBase
2、还有一种方式就是使用HBase原生Client API(put)
3、前两种方式因为须要频繁的与数据所存储的RegionServer通信。一次性入库大量数据时,特别占用资源,所以都不是很有效。因为HBase在HDFS中是以HFile文件结构存储的,所以高效便捷的方法就是直接生成HFile文件然后使用Bulk Load方法,即HBase提供的HFileOutputFormat类。
二、Bulk Load基本原理
Bulk Load处理由两个主要步骤组成:
1、生成HFile文件
Bulk Load的第一步会执行一个Mapreduce作业,其中使用到了HFileOutputFormat输出HBase数据文件:StoreFile。
HFileOutputFormat的作用在于使得输出的HFile文件能够适应单个region。使用TotalOrderPartitioner类将map输出结果分区到各个不同的key区间中,每一个key区间都相应着HBase表的region。
2、导入HBase表
第二步使用completebulkload工具将第一步的结果文件依次交给负责文件相应region的RegionServer,并将文件move到region在HDFS上的存储文件夹中。一旦完毕。将数据开放给clients。
假设在bulk load准备导入或在准备导入与完毕导入的临界点上发现region的边界已经改变,completebulkload工具会自己主动split数据文件到新的边界上。可是这个过程并非最佳实践,所以用户在使用时须要最小化准备导入与导入集群间的延时,特别是当其它client在同一时候使用其它工具向同一张表导入数据。
Bulk Load常遇到的一个ERROR:”java.io.IOException: Retry attempted 10 times without completing, bailing out”
错误解析:
我们使用的Hbase1.0.2版本下,如果Hfile文件 跨越多个region,bulkload会自动地将Hfile文件split,但是对于每次retry只会将指定的Hfile文件split一次。但是在hbase-site.xml配置文件里有个参数hbase.bulkload.retries.number控制了hbase对一个hfile最多plit多少次。这个参数默认是10,如果某个hfile跨越的region数超过10个就会报上述Exception。
解决方案:
将hbase.bulkload.retries.number这个参数设置为更大的值,比如目标表的region数量或者将这个参数设置成0,0表示不断重试直到成功。设置之后问题解决。
TA贡献1810条经验 获得超4个赞
1HBase的定义
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。
适合于存储大表数据(表的规模可以达到数十亿行以及数百万列),并且对大表数据的读、写访问可以达到实时级别。利用Hadoop HDFS(Hadoop Distributed File System)作为其文件存储系统,提供实时读写的数据库系统;利用ZooKeeper作为协同服务。
2HBase的架构
3HBase的适用场景
HBase适合具有如下需求的应用:
o海量数据(TB、PB)
o高吞吐量
o需要在海量数据中实现高效的随机读取
o需要很好的性能伸缩能力
o能够同时处理结构化和非结构化的数据
o不需要完全拥有传统关系型数据库所具备的ACID特性
4成功应用场景案例
项目背景
某银行仅支持查询最近一年的账户历史交易情况,超过一年的查询需要特殊申请,由专人进行人工查询
原因:
o传统数据库无法存储海量数据。
o大数据量下查询性能急剧下降。
HBase的优势
o海量数据(TB、PB):可由查询一年变为十年或更多
o高效随机读取:查询超过一年的数据与查询最近数据同样高效
- 2 回答
- 0 关注
- 406 浏览
添加回答
举报
