您的位置:首页 > 其它

HBASE---数据存储实践

2016-03-13 13:48 225 查看
HBASE(来自Hadoop database)是一个很好的BigTable的实现,能够存储上百亿行和百万列的数据,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。
HBASE的基本架构组成如下:



HBASE使用zookeeper作为协调服务,每个时刻只有一个HMaster在运行,HMaster来负责维护表和元数据(包括region),而不负责具体的数据读写。这样一旦HMaster失效,导致所有的元数据无法被修改,region切分、负载均衡等无法进行;但还可以进行正常的数据读写,提供服务;一旦Zookeeper感知不到HMaster,就会选举出一个新的HMaster,这样解决了单点故障的问题。
一 个 HBASE实例包括多个HRegionServer,HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。



每个Table包含多个Region,每个Region里面包含一个memStore(内存)和多个StoreFile(HDFS文件)

Hbase写数据的典型流程是:
1) 、Client发起了一个HTable.put(Put)请求给HRegionServer

2) 、HRegionServer会将请求定位到某个具体的HRegion上面
3) 、决定是否写WAL log。WAL(Write Ahead Log)文件是一个标准的Hadoop SequenceFile,文件中存储了HLogKey,这些Keys包含了和实际数据对应的序列号,主要用于崩溃恢复。在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中,HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)
4)、Put数据保存到MemStore中,同时检查MemStore状态,如果满了,则触发Flush to Disk请求。
e) HRegionServer处理Flush to Disk的请求,将数据写成HFile文件并存到HDFS上,并且存储最后写入的数据序列号,这样就可以知道哪些数据已经存入了永久存储的HDFS中。
当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
Hbase读数据的典型流程是:
1、Client会通过内部缓存的相关的-ROOT-中的信息和.META.中的信息直接连接与请求数据匹配的HRegionserver;

2、然后直接定位到该服务器上与客户请求对应的region,客户请求首先会查询该region在内存中的缓存——memstore(memstore是是一个按key排序的树形结构的缓冲区);

3、如果在memstore中查到结果则直接将结果返回给client;

4、在memstore中没有查到匹配的数据,接下来会读已持久化的storefile文件中的数据。storefile也是按key排序的树形结构的文件——并且是特别为范围查询或block查询优化过的;另外hbase读取磁盘文件是按其基本I/O单元(即 hbase block)读数据的。具体就是过程就是:

如果在BlockCache中能查到要造的数据则这届返回结果,否则就读去相应的storefile文件中读取一block的数据,如果还没有读到要查的数据,就将该数据block放到HRegion Server的blockcache中,然后接着读下一block块儿的数据,一直到这样循环的block数据直到找到要请求的数据并返回结果;如果将该region中的数据都没有查到要找的数据,最后接直接返回null,表示没有找的匹配的数据。当然blockcache会在其大小大于一的阀值(heapsize * hfile.block.cache.size
* 0.85)后启动基于LRU算法的淘汰机制,将最老最不常用的block删除。
HBASE里面有几个基本的概念:
RowKey,Column Family,Timestamp,Cell,网上有很多介绍,不说了。
关于安装和使用,前面已经说过了。
这里说说HBASE的设计的时候的几个注意的地方:
1.虽然hbase表号称可容纳百万列,在实际应用中,请尽量构建“高而瘦”(即行记录很多,列较少)的表,同时需要对列的数量进行测试,以避免过度影响读写性能。
2.默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。
3.不要在一张表里定义太多的 column family 。目前Hbase并不能很好的处理超过2~3个column family的表。因为某个column family在flush的时候,它邻近的column family也会因关联效应被触发flush,最终导致系统产生更多的I/O。所以, 根据官方的建议,一个 HBase 表中创建一个列族即可。
4.列族的名称不宜过长
5.合理运用缓存
6.合理进行压缩
7,设置TTL,如果你在同一单元上有多个时间版本,早于设定TTL的版本会被删除。
8,使用时间版本,HBase在默认情况下每个单元维护三个时间版本。这个属性是可以设置的。如果你只需要一个版本,推荐你在设置表时只维护一个版本。这样系统就不会保留更新单元的多个时间版本。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: