所在的位置: mysql >> mysql市场 >> HadoopDataBase学习笔记

HadoopDataBase学习笔记

一、简介

Hbase:全名HadoopDataBase,是一种开源的,可伸缩的,严格一致性(并非最终一致性)的分布式存储系统。具有最理想化的写和极好的读性能。它支持可插拔的压缩算法(用户可以根据其列族中的数据特性合理选择其压缩算法),充分利用了磁盘空间。

类似于Google的BigTable,其分布式计算采用MapReduce,通过MapReduce完成大块的数据加载和全表扫描操作等。文件存储系统采用HDFS,通过Zookeeper来完成状态管理协同服务。不过BigTable只支持一级索引,Hbase不仅支持一级索引,还支持二级索引。

需要指出的是:很多人都认为Hbase是面向列的数据库,其实不是。从典型的关系型数据库概念上来说Hbase并不是面向列的数据库。但是充分利用了磁盘上列式存储格式的特性。Hbase跟传统的Columnardatabases还是有区别的。Columnardatabases擅长的是实时数据的分析访问,而Hbase在基于key的单值访问和范围扫描上比较突出。不过我们经常谈及到的Hbase是面向列的存储系统,其实是因为Hbase是以列族的模式进行存储的。

二、Hbase基本结构

1)架构图

从上图中可以看出,Hbase内部的核心结构由以下几大块组成:HMaster,HRegionServer,HLog,HRegion等。而Hbase依赖的外部系统有Zookeeper,HDFS等。

1)HMaster(类似于HDFS中NameNode,MapReduce中的JobTrackers)是用来管理HRegionServer的。它负责监控集群中HRegionServer的状态信息变化。主要功能点如下:

1、管理HRegionServer的负载均衡,调整Region分布。这个通过HMaster的后台线程LoadBalancer来完成。LoadBalancer会定期将Region进行移动,以使各个HRegionServer达到Load均衡。

2、在RegionSplit后,负载新Region的分配。

3、HRegionServer的FailOver处理,当某一个HRegionServer出问题后,HMaster负责将其Region进行转移。

4、CatalogJanitor。CatalogJanitor会定期检查和清理.Meta.表。

在一个HBase集群中会存在多个HMaster,不过zookeeper的MasterElection机制会保证只有一个HMaster在运行。当运行的HMaster出问题后,其他的HMaster就会立刻补上。

2)从图中可以看出,Hbase客户端是只与zookeeper和HRegionServer打交道。并不会跟HMaster交互。所以如果HMaster出问题了,Hbase集群在短时间内还是可以对外提供可靠服务的。但是,因为HMaster掌控了HRegionServer的一些功能,如:HRegionServer的FailOver操作,Region切分等,HMaster长时间不可用还是会出问题的。

3)上面所提及的Catelog表有两个:-Root-和.Meta.表。-Root-表中存储了.Meta.表的位置。即.Meta.表的Regionkey。.Meta.表存储了所有Region的位置及每个Region所包含的RowKey的范围。-Root-表的存储位置记录在zookeeper中,.Meta.表的存储位置记录在-Root-表中。

4)当客户端发起一个查询数据的请求后,首先,客户端会先连接上zookeeper集群,获取-Root-表的存放在哪一个HRegionServer上。接着找到对应的HRegionServer后,就能够获取到-Root-表中对应的.Meta.表的位置。最后客户端根据.Meta.表存储的HRegion的位置到相应的HRegionServer中取对应的Hregion中的数据信息。经过一次查询后,访问Catalog表的过程就会被缓存起来,下次客户端就可以直接到相应的HRegion上获取数据。

5)Hbase已经无缝集成了HDFS,其中所有的数据最终都会通过DFS客户端API持久化到HDFS中。

6)一个Hbase集群中有许多个HRegionServer(类似于HDFS中的DataNode,MapReduce中的TaskTrackers),由一个HMaster进行管理。每个HRegionServer拥有一个WAL(writeAheadLog,日志文件,用作数据恢复)和多个HRegion(可以简单认为是用来存储一个表中的某些行)。一个HRegion拥有多个Store(存储一个ColumnFamily)。一个Store又由一个MemStore(持有对该Store的所有修改于内存中)和0至多个StoreFiles(HFile,数据存储的地方)组成。详细图如下:

2)基本元素

1、RowKey

行标示,类似于传统数据库表中的行号。Rowkeys具有不变性。除非该行别删除或者被重新插入了新的数据。Hbase中支持基于RowKey的单行查询和范围扫描。在Hbase的Auto-Sharding中,也是基于RowKey进行自动切分的。

2、ColumnFamily

在Hbase中最基本的单元就是列。而列族是由一个或者列组成。一般在使用时,尽量将经常访问的列作为一个列族。因为Hbase是面向列族的存储,也就是说一个列族中的所有列是存储在一起的。即上图中的一个Store存储一个列族。

不过有一点需要注意的是在一个表中列族被限定不能超过十个。

3、TimeStamp

Hbase中支持时间戳的概念。即允许Cell存储多个版本值。版本之间通过时间戳来区分。也就是说可能存在某一列的某一行有多个值。一般默认是3,且最近版本在最上面。Hbase中有一个TTL(TimeToLive)的配置,这个是基于列族维度的。一旦过期,列族就会自动删除所有行。

4、HRegionServer

HRegionServer是负责服务和管理Region的。类似于我们所说的主从服务器,HMaster就是主服务器,HRegionServer就是从服务器。当用户执行CRUD等操作时,都需要通过HRegionServer定位到相应的Region上进行操作。

5、WAL

WAL全名是WriteAheadLog,类似于mysql中的BinaryLog,WAL记录了该HRegionServer上所有数据的变更。一旦这个HRegionServer死翘翘了,导致数据丢失后,WAL就是救命稻草。可以通过WAL进行数据恢复。所以在平时WAL是没什么用的,只是为了不可预知的灾难做准备。当然,WAL起作用的前提是保证变更日志已经记录到了WAL中。

WAL的实现类是HLog。因为在一个HRegionServer中持有一个WAL,所以对于该HRegionServer上的所有Region来说,WAL是全局,共享的。当HRegion实例创建的时候,在HRegionServer实例中的HLog就会被当做HRegion构造函数的参数传递到HRegion。当HRegion接收到一个变更操作时,HRegion就能直接通过HLog将变更日志追加(append()方法)到共享WAL中。当然基于性能考虑,HBase还提供了一个setWriteToWAL(false)方法。一旦用户调用了此方法。变更日志就不会追加到WAL中。默认是需要写入的,除非用户自己保证数据不会丢失。

HLog还有一个重要的特性就是:跟踪变更。在HLog类中有一个原子类型的变量,HLog会读取StoreFiles中最大的sequencenumber(HLog中每一条变更日志都有一个number号,因为对于一个HRegionServer中的所有HRegion是共享HLog的,所以会将变更日志顺序写入WAL,StoreFiles中也持有该number),并存放到变量中。这样HLog就知道已经已经存储到哪一个位置了。

WAL还有两个比较重要的类,一个是LogSyncer,另一个是LogRoller。

1、在创建表时,有一个参数设置:DeferredLogFlush,默认是false,表示log一旦更新就立即同步到filesystem。如果设置为true,则HRegionServer会缓存那些变更,并由后台任务LogSyncer定时将变更信息同步到filesystem。

2、WAL是有容量限制的,LogRoller是一个后台线程,会定时滚动logfile,用户可以设定这个间隔时间(hbase.regionserver.logroll.period,默认是一小时)。当检查到某个logfile文件中的所有sequencenumber均小于那个最大的sequencenumber时,就会将此logfile移到.oldLog目录。

如下是WAL的文件结构,目前WAL采用的是Hadoop的SequenceFile,其存储记录格式是key/value键值对的形式。其中Key保存了HLogkey的实例,HLogKey包含数据所属的表名及RegionName,timeStamp,sequenceNumber等信息。Value保存了WALEdit实例,WALEdit包含客户端每一次发来的变更信息。

6、Region

在Hbase中实现可扩展性和负载均衡的基本单元是Region。Region存储着连续的RowKey的数据。刚开始时,一个表就只有一个Region,当一个表随着数据增多而不断变大时,如果达到指定的大小后就会根据Rowkey自动一分为二成两个Region。每个Region中保存着一个。随着表的继续增大,每个Region又会自动split成更多的Region。每个Region只会由一个HRegionServer服务。这就是所谓的Hbase的AutoSharding特性。当然,Region除了会spilt外,也可能进行合并以减少Region数目(这就是Hbase的


转载请注明:http://www.aierlanlan.com/rzdk/2694.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了