赞
踩
BigTable是一个分布式存储系统,BigTable起初用于解决典型的互联网搜索问题。
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。
图:Hadoop生态系统中HBase与其他部分的关系
关系数据库已经流行很多年,并且Hadoop已经有了HDFS和MapReduce,为什么需要HBase?
HBase与传统的关系数据库的区别主要体现在以下几个方面:
HBase适合具有如下需求的应用:
HBase作为一个高可靠性、高性能、面向列、可伸缩的分布式数据库,提供海量数据存储功能,用来解决关系型数据库在海量数据时的局限性。
图: HBase在FusionInsight中的位置
图:表示例
如上图:该单元格有2个时间戳ts1和ts2,每个时间戳对应一个数据版本。
HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此,可以视为一个“四维坐标”,即[行键, 列族, 列限定符, 时间戳]。
图:数据表示法示例
图:HBase数据的概念视图
图:HBase数据的物理视图
图:夯实数据库和列式数据库示意图
行存储:数据按行存储在底层文件系统中。通常,每一行会被分配固定的空间。
列存储:数据以列为单位,存储在底层文件系统中。
图:KeyValue存储模型
KeyValue具有特性的结构。Key部分被用来快速检索一条数据记录,Value部分用来存储实际的用户数据信息。
KeyValue作为承载用户数据的基本单元,需要保存一些对自身的描述信息。例如,时间戳,类型等等。那么势必会有一定的结构化空间开销。
支持动态增加列,容易适应数据类型和结构的变化。以块为单元操作数据,列间、表间并无关联关系。
KeyValue型数据库数据分区方式–按Key值连续范围分区。如下图:
数据按照RowKey的范围(按RowKey的字典顺序),划分为一个个的子区间。每一个子区间都是一个分布式存储的基本单元。
HBase的底层数据以KeyValue的形式存在,KeyValue具有特定的格式。
KeyValue中拥有时间戳、类型等关键信息。
同一个Key值可以关联多个Value,每一个KeyValue都拥有一个Qualifier标识。
即使是Key值相同,Qualifier也相同的多个KeyValue,也可能有多个,此时使用时间戳来区分,这就是同一条数据记录的多版本。
HBase的实现包括三个主要的功能组件:
主服务器Master负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡。
Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求。
客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据。
客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小。
图:Region的来源
图:Region分类
图:列族
ColumnFamily是Region的一个物理存储单元。同一个Region下面的多个ColumnFamily,位于不同的路径下面。
ColumnFamily信息是表级别的配置。也就是说,同一个表的多个Region,都拥有相同的ColumnFamily信息。(例如,都有两个ColumnFamily,且不同Region的同一个ColumnFamily配置信息相同)。
开始只有一个Region,后来不断分裂Region拆分操作非常快,接近瞬间,因为拆分之后的Region读取的仍然是原存储文件,直到“合并”过程把存储文件异步地写到独立的文件之后,才会读取新文件。
每个Region默认大小是100MB到200MB(2006年以前的硬件配置)
同一个Region不会被分拆到多个Region服务器.
每个Region服务器存储10-1000个Region.
元数据表
又名.META.表,存储了Region和Region服务器的映射关系.用来帮助Client定位到具体的Region。
当HBase表很大时,元数据也会被切分为多个Regina,Region的元数据信息保存在Zookeeper中。
根数据表,又名-ROOT-表,记录所有元数据的具体位置。
-ROOT-表只有唯一一个Region,名字是在程序中被写死的。
Zookeeper文件记录了-ROOT-表的位置。
图:HBase的三层结构
HBase的三层结构中各层次的名称和作用:
为了加快访问速度,.META.表的全部Region都会被保存在内存中。
假设.META.表的每行(一个映射条目)在内存中大约占用1KB,并且每个Region限制为128MB,那么,上面的三层结构可以保存的用户数据表的Region数目的计算方法是:
-ROOT-表能够寻址的.META.表的Region个数)×(每个.META.表的 Region可以寻址的用户数据表的Region个数)
一个-ROOT-表最多只能有一个Region,也就是最多只能有128MB,按照每行(一个映射条目)占用1KB内存计算,128MB空间可以容纳128MB/1KB=2的17次方 行。
行,也就是说,一个-ROOT-表可以寻址2的17次方个.META.表的Region。
同理,每个.META.表的 Region可以寻址的用户数据表的Region个数是128MB/1KB=2的17次方。
最终,三层结构可以保存的Region数目是(128MB/1KB) × (128MB/1KB) = 2的34次方个Region。
客户端访问数据时的“三级寻址”:
分布式锁的服务:
多个HMaster进程都会尝试着去Zookeeper中写入一个对应的节点,该结点只能被一个HMaster进程创建成功,创建成功的HMaster进程就是Active。
事件监听机制:
主HMaster进程宕掉之后,备HMaster在监听对应的Zookeeper节点。主HMaster进程宕掉之后,该节点会被删除,其他的备HMaste就可以收到响应的消息。
微型数据库角色:
Zookeeper中存放了Region Server的地址,此时,可以将它理解成一个微型数据库。
图:HBase系统架构图
各组件功能:
客户端
客户端包含访问HBase的接口,同时在缓存中维护着已经访问过的Region位置信息,用来加快后续数据访问过程。
Zookeeper服务器
Zookeeper可以帮助选举出一个Master作为集群的总管,并保证在任何时刻总有唯一一个Master在运行,这就避免了Master的“单点失效”问题 。
Zookeeper是一个很好的集群管理工具,被大量用于分布式计算,提供配置维护、域名服务、分布式同步、组服务等。
Master(HMaster)
主服务器Master主要负责表和Region的管理工作:
– 管理用户对表的增加、删除、修改、查询等操作。
– 实现不同Region服务器之间的负载均衡。
– 在Region分裂或合并后,负责重新调整Region的分布。
– 对发生故障失效的Region服务器上的Region进行迁移。
-HMaster进程负责所有Region的转移操作:
HMaster进程有主备角色。集群可以配置两个HMaster角色,集群启动时,这些HMaster角色通过竞争获得主HMaster角色。主HMaster只能有一个,备HMaster进程在集群运行期间处于休眠状态,不干涉任何集群事务。
RegionServer:
Region服务器是HBase中最核心的模块,是HBase的数据服务进程负责处理用户的数据的读写请求。
Region由RegionServer管理。所有用户数据的读写请求,都是和RegionServer上的Region进行交互。
Region可以在RegionServer之间迁移。
###RegionServer的架构:
图:HBase的RegionServer架构
Store:一个Region由一个或多个Store组成。每个Store对应图中的一个Column Family。
MemStore:一个Store包含一个MemStore,MemStore缓存客户端向Region插入的数据。
StoreFile:MemStore的数据Flush到HDFS后成为StoreFile。
Hfile:Hfile定义了StoreFile在文件系统中的存储格式,它是当前HBase系统汇总StoreFile的具体实现。
Hlog:HLog日志保证了当RegionServer故障的情况下用户写入的数据不丢失。
RegionServer的多个Region共享一个相同的Hlog。
图:Region服务器向HDFS文件系统中读写数据
(1)用户读写数据过程:
(2)缓存的刷新:
(3)StoreFile的合并(Compaction):
图:StoreFile的合并和分裂过程
##HLog工作原理:
Zookeeper会实时监测每个Region服务器的状态,当某个Region服务器发生故障时,Zookeeper会通知Master。
Master首先会处理该故障Region服务器上面遗留的HLog文件,这个遗留的HLog文件中包含了来自多个Region对象的日志记录。
系统会根据每条日志记录所属的Region对象对HLog数据进行拆分,分别放到相应Region对象的目录下,然后,再将失效的Region重新分配到可用的Region服务器中,并把与该Region对象相关的HLog日志记录也发送给相应的Region服务器。
Region服务器领取到分配给自己的Region对象以及与之相关的HLog日志记录以后,会重新做一遍日志记录中的各种操作,把日志记录中的数据写入到MemStore缓存中,然后,刷新到磁盘的StoreFile文件中,完成数据恢复。
共用日志优点:提高对表的写操作性能;
缺点:恢复时需要分拆日志。
(1)客户端发起写数据请求。
(2)定位Regoin。定位到需要写到的RegionServer,Region,Rowkey。
(3)数据分组:整个数据分组,涉及到两步。
“分篮子”操作:
根据mete表找到标的Region信息,此时也得到了对应的RegionServer信息。
根据rowkey,将数据写到指定的region中。
每个RegionServer上的数据会一起发送。发送数据中,都是已经按照Region分好组了。
(4)往RegionServer发送请求。
(5)Region写数据流程。
既然是Write-Ahead-Log,为何先写内存再写WAL?
先写内存的原因:HBase提供了一个MVCC机制,来保障些数据阶段的数据可见性。写写MemStore再写WAL,是为了一些特殊场景下,内存中的数据能够更及时的可将。如果先写WAL失败的话,MemStore助攻的数据会被回滚。
(6)Flush。
以下多个场景,会触发Memstore的Flush操作:
(7)Compaction。
Compaction的目的,是为了减少同一个Region中的同一个ColumnFamily下面的小文件(HFile)数目,从而提升读取的性能。
Compaction分为Minor、Major两类:
图:Compaction操作示例
(8)Region Split。
(1)客户端发起读数据请求:
(2)定位Region。定位到该数据所在的RegionServer,Region,Rowkey。
(3)OpenScanner:OpenScanner过程中,会创建两种不同的Scanner来读取Hfile、MemStore的数据。
(4)Next:
(5)Filter允许在Scan过程或只能怪,设定一定的过滤条件。符合条件的用户数据才返回。当前包含的一些典型的Filter有:
使用Filter时,可能会扫描大量的用户数据,才可以找到所期望的满足条件的数据。因此,一些场景下性能是不可预估的。
(6)BloomFilter:
行键(Row Key)
行键是按照字典序存储,因此,设计行键时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。 举个例子:如果最近写入HBase表中的数据是最可能被访问的,可以考虑将时间戳作为行键的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE - timestamp作为行键,这样能保证新写入的数据在读取时可以被快速命中。
InMemory
创建表的时候,可以通过HColumnDescriptor.setInMemory(true)将表放到Region服务器的缓存中,保证在读取的时候被cache命中。
Max Version
创建表的时候,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1)。
Time TO Live:
创建表的时候,可以通过HColumnDescriptor.setTimeToLive(int timeToLive)设置表中数据的存储生命期,过期数据将自动被删除,例如如果只需要存储最近两天的数据,那么可以设置setTimeToLive(2 24 60 * 60)。
HBase Master默认基于Web的UI服务端口为60010,HBase region服务器默认基于Web的UI服务端口为60030.如果master运行在名为master.foo.com的主机中,mater的主页地址就是http://master.foo.com:60010,用户可以通过Web浏览器输入这个地址查看该页面可以查看HBase集群的当前状态。
Ganglia是UC Berkeley发起的一个开源集群监视项目,用于监控系统性能。
OpenTSDB可以从大规模的集群(包括集群中的网络设备、操作系统、应用程序)中获取相应的metrics并进行存储、索引以及服务,从而使得这些数据更容易让人理解,如web化,图形化等。
Ambari 的作用就是创建、管理、监视 Hadoop 的集群。
NoSQL区别于关系型数据库的一点就是NoSQL不使用SQL作为查询语言,至于为何在NoSQL数据存储HBase上提供SQL接口,有如下原因:
减少编码。使用诸如SQL这样更高层次的语言来编写,减少了编写的代码量。
方案: 1.Hive整合HBase 2.Phoenix
1.Hive整合HBase
Hive与HBase的整合功能从Hive0.6.0版本已经开始出现,利用两者对外的API接口互相通信,通信主要依靠hive_hbase-handler.jar工具包(Hive Storage Handlers)。由于HBase有一次比较大的版本变动,所以并不是每个版本的Hive都能和现有的HBase版本进行整合,所以在使用过程中特别注意的就是两者版本的一致性。
2.Phoenix
Phoenix由Salesforce.com开源,是构建在Apache HBase之上的一个SQL中间层,可以让开发者在HBase上执行SQL查询。
HBase只有一个针对行健的索引 访问HBase表中的行,只有三种方式:
使用其他产品为HBase行健提供索引功能:
原理:采用HBase0.92版本之后引入的Coprocessor特性。
Coprocessor(协处理器)提供了两个实现:endpoint和observer,endpoint相当于关系型数据库的存储过程,而observer则相当于触发器。
observer允许我们在记录put前后做一些处理,因此,而我们可以在插入数据时同步写入索引表。
优点: 非侵入性:引擎构建在HBase之上,既没有对HBase进行任何改动,也不需要上层应用做任何妥协。
缺点:每插入一条数据需要向索引表插入数据,即耗时是双倍的,对HBase的集群的压力也是双倍的。
图:二级索引示意图
###Hindex:
Hindex 是华为公司开发的纯 Java 编写的HBase二级索引,兼容 Apache HBase 0.94.8。当前的特性如下:
图:HBase+Redis二级索引
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
图:HBase+Solr
二级索引为HBase提供了按照某些列的值进行索引的能力。
HBase文件存储模块(HBase FileStream,简称HFS)是HBase的独立模块,它作为对HBase与HDFS接口的封装,应用在FusionInsight的上层应用,为上层应用提供文件的存储、读取、删除等功能。
HFS的出现解决了需要在HDFS中存储海量小文件,同时也要存储一些大文件的混合的场景。简单来说,就是在HBase表中,需要存放大量的小文件(10MB以下),同时又需要存放一些比较大的文件(10MB以上。)
MOB数据(即100KB到10MB大小的数据)直接以HFile的格式存储在文件系统上(例如HDFS文件系统),然后把这个文件的地址信息及大小信息作为value存储在普通HBase的store上,通过攻击集中管理这些文件。这样就可以大大降低HBase的compation和split频率,提升性能。
坚持原创技术分享,您的支持将鼓励我继续创作!
打赏
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。