您好,欢迎访问三七文档
什么是HBase?HBase,是HadoopDatabase,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。使用HBase技术可以在廉价的PC服务器上搭建起大规模结构化的存储集群。它底层的文件系统使用HDFS,使用Zookeeper来管理集群的HMaster和各Regionserver之间的通信,监控各Regionserver的状态,存储各Region的入口地址等。何时用HBase?首先想想传统的关系型数据库都有哪些特点,大概的特点有:支持事务,ACID(原子性、一致性、隔离性和持久性)特性;行式存储;SQL语句使用起来比较方便;支持索引、视图等;接下来我们考虑一个场景:我们想要构建一个社交网站,我们可能会选择易于操作的LAMP(Linux、Apache、Mysql、PHP)模型来快速的搭建一个原型。随着用户数的不断增加,每天有越来越多的人开始访问,这时候,共享的数据库服务器压力会越来越大,可以选择增加应用服务器,但因为这些应用服务器共享中央数据库,所以,随着数据库的CPU和I/O负载升高,这种方案势必不可长久。这时候,我们可能会增加从服务器,以便并行读取,将读写分离。这样做是因为考虑到用户访问产生的读次数比写入次数更多,但是如果用户数目增加很快,产生的内容越来越多,导致读写数目相差没那么大,这种方案也就不能长久。接下来的常见做法就是增加缓存,比如使用Memcached。这样,读操作存入到内存中的数据库系统中,但又没办法保证数据一致性,因为用户更新数据到数据库,而数据库不会主动更新缓存中的数据,而且,这种方案只能解决读请求的压力,对于写请求,还是没有解决。所以需要更多的服务器,更快的磁盘,会导致硬件成本快速升高。而且,随着用户的增多,网站功能势必增加,业务功能都会使用sql语句进行查询,而表数据过多会导致join操作变慢,所以会不得不采用一些逆范式的方式来设计数据库,这样导致无法使用存储过程。而且,数据过大时,索引的效果也没那么强了。因为索引也会变得很大。这时候应该怎么办?有些人采用了数据库分区的方式,将数据拆分。但是大规模的拆分将导致大量复制操作,带来大量的I/O损耗。所以这种方式也不一定好。03年,谷歌发表了一片论文叫做《TheGoogleFileSystem》,这个文件系统简称GFS,该文件系统中的数据在节点中冗余存储,即使一台服务器发生故障,也不会影响数据可用性。但是,GFS只适合存储少量非常大的文件,不适合存储数量众多的小文件,因为文件的元信息存储在主节点的内存中,文件越多,主节点压力越大。经过Google的深入研究,在06年,发表了另外一篇重量级论文《BigTable:ADistributedStorageSystemforStructedData》。HBase就是BigTable的开源实现,当然,也建立在HDFS(GFS的开源实现)和Hadoop(MapReduce的开源实现)、Zookeeper(Chubby的开源实现)的基础上。何时用HBase呢?在下面几种情况下,可以考虑使用HBase替代关系数据库:系统需要适应不同种类的数据格式和数据源,不能预先严格定义模式,需要处理大规模数据;不强调数据之间的关系,所要存储的数据是半结构化或非结构化的;数据非常稀疏;想要更好的进行扩展;比如谷歌就将BigTable用来存储网页的索引数据,索引数据就很好的满足了上面的几点要求。与Hive、Pig的区别?HBase是低延迟、非结构化和面向编程的,而Hive是高延迟、结构化和面向分析的;Hive本身不存储和计算数据,它完全依赖与HDFS和MapReduce,Hive中的表是逻辑表;HBase通过组织起节点内所有机器的内存,提供一个超大的内存Hash表,它需要在磁盘和内存组织自己的数据结构,HBase中的表是物理表;如果是全表扫描,就用Hive+Hadoop,如果是索引访问,就用HBase+Hadoop。Hive主要用于静态的结构以及需要经常分析的工作;Pig相比Hive相对轻量,它主要的优势是相对比于直接使用HadoopJavaAPIs可大幅消减代码量;Hive和Pig都可以与HBase组合使用,Hive和Pig还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变得非常简单。HBase的结构1)表、行、列和单元格先做一个简单的总结:最基本的单位是列(column),一列或者多列组成一行(row),并且由唯一的行键(rowkey)来确定存储。一个表中有很多行,每一列可能有多个版本,在每一个单元格(Cell)中存储了不同的值。HBase的行与行之间是有序的,按照rowkey的字典序进行排序,行键是唯一的,在一个表里只出现一次,否则就是在更新同一行,行键可以是任意的字节数组。一行由若干列组成,其中的某些列又可以构成一个列族(columnfamily),一个列族的所有列存储在同一个底层的存储文件里,这个文件称之为HFile。列族需要在创建表的时候就定义好,数量也不宜过多。列族名必须由可打印字符组成,创建表的时候不需要定义好列。对列的引用格式通常为family:qualifier,qualifier也可以是任意的字节数组。同一个列族里qualifier的名称应该唯一,否则就是在更新同一列,列的数量没有限制,可以有数百万个。列值也没有类型和长度限定。HBase会对rowkey的长度做检查,默认应该小于65536。一个可视化的HBase表如下:Timestamp代表时间戳,默认由系统指定,用户也可以显示设置。使用不同的时间戳来区分不同的版本。一个单元格的不同版本的值按照时间戳降序排列在一起,在读取的时候优先取最新的值。用户可以指定每个值能保存的最大版本数,HBase-0.96版本默认的最大版本数为1。HBase的存取模式如下(表,行键,列族,列,时间戳)-值。即一个表中的某一行键的某一列族的某一列的某一个版本的值唯一。行数据的存取操作是原子的,可以读取任意数目的列。目前还不支持跨行事务和跨表事务。同一列族下的数据压缩在一起,访问控制磁盘和内存都在列族层面进行。2)自动分区HBase中扩展和负载均衡的基本单元称作region,region本质上是以行键排序的连续存储空间。如果region过大,系统就会把它们动态拆分,相反的,就把多个region合并,以减少存储文件数量。一个表最开始只有一个region,用户开始向表中插入数据时,系统会检查region大小,确保不会超过配置的最大值,如果超过,会从region中行键的中间值一分为二,将该region分为大小大致相等的两个region。注意,每个region只能由一个regionserver加载,每一台region服务器可以同时加载多个region。下图展示了一个表,该表实际上是由很多regionserver加载的region集合组成的逻辑视图。每台服务器能加载的region数量和每个region的最佳大小取决于单台服务器的有效处理能力。3)HBase存储格式HFile:HBase中KeyValue数据的存储格式。HFile是Hadoop的二进制格式文件。HLog:HBase中WAL(Write-Ahead-Log,预写式日志)文件的存储格式,物理上是Hadoop的SequenceFile。HFile的格式如下图:HFile文件的长度可变,唯一固定的是FileInfo和Trailer。Trailer存储指向其他块的指针,它在持久化数据到文件结束时写入的,写入后,该文件就会变成不可变的数据存储文件。数据块(datablocks)中存储key-values,可以看做是一个MapFile。当block关闭操作时,第一个key会被写入index中,index文件在hfile关闭操作时写入。KeyValue的具体格式如下图:上图中,keytype有四种类型,分别是Put、Delete、DeleteColumn和DeleteFamily。RowLength为2个字节,Row长度不固定,ColumnFamilyLength为2个字节,ColumnFamily长度不固定,ColumnQualifier长度不固定,TimeStamp为4个字节,KeyType为1个字节。之所以不记录ColumnQualifier的长度是因为可以通过其他字段计算得到。4)WAL(预写式日志)regionserver会将数据保存到内存,直到积攒到足够多的数据再将其刷写到磁盘,这样可避免很多小文件。但此时如果发生断电或其他故障,存储在内存中的数据没来得及保存到磁盘,就会出现数据丢失情况。WAL能解决这个问题。每次更新(编辑)都会写入日志,只有日志写入成功后才会告知客户端写入成功,然后服务器按需批量处理内存中的数据。如果服务器崩溃,regionserver会回访日志,使得服务器恢复到服务器崩溃前的状态。下图显示了写入过程:所有的修改都会先保存到WAL,然后再传给MemStore。整个过程是这样的:客户端启动一个操作来修改数据,比如Put。每次修改都封装到一个KeyValue对象实例中,通过RPC调用发送出去。这些调用会发送给含有匹配region的RegionServer;KeyValue实例到达后,它们会被分配到管理对应行HRegion实例,数据被写入WAL,然后被放入实际拥有记录的MemStore中;当MemStore达到一定大小或经历一个特定时间,数据会异步的连续的写入到文件系统中(HFile)。如果写入过程出现问题,WAL能保证数据不丢失,因为WAL日志HLog存储在HDFS上。其他regionserver可以读取日志文件并回放修改,恢复数据。5)HBase系统架构HBase架构包括HBaseClient、Zookeeper、HMaster、HRegionServer、HStore存储几个部分。下面一一叙述。一个大体的架构图如下:a)HBaseClientHBaseClient使用HBase的RPC机制与HMaster和HRegionServer进行通信。对于管理类操作(如建表,删表等),Client和HMaster进行RPC;对于数据读写类操作,Client和HRegionServer进行RPC。b)Zookeeper一个分布式的,开放源码的分布式应用程序协调服务,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。它是Chubby的开源实现。ZookeeperQuorum中除了存储了-ROOT-表的地址和Master的地址,RegionServer也会把自己注册到Zookeeper中,使Master可以随时感知到各个RegionServer的健康状态。当我们尝试去理解hbase系统当前的状态时,需要了解哪些主机加入到集群中了,哪个主机扮演什么角色。更重要的是,哪个主机充当HBase的-root-表服务。HBase客户端需要这些信息来实现读写操作,而Zookeeper正好可以提供这些信息。客户端能够自动化地与Zookeeper进行操作交流以及找到区域服务器(RegionServer)c)HMaster每台HRegionServer都会与HMaster进行通信,HMaster的主要任务就是要告诉每台HRegionServer它要维护哪些HRegion。当一台新的HRegionServer登录到HMaster时,HMaster会告诉它等待分配数据。而当一台HRegion死机时,HMaster会把它负责的HRegion标记为未分配,然后再把它们分配到其他的HRegionServer中。HBase已经解决了HMaster单点故障问题,并且HBase中可以启动多个HMaster,那么它就能够通过Zookeeper来保证系统中总有一个Master在运行。HMaster在功能上主要负责Table和Region的管理工作,具体包括:管理用户对Table的增、删、改、查操作;管理HRegionServer的负载均衡,调整Region分布;在RegionSplit后,负责新Region的分配;在H
本文标题:HBase简介
链接地址:https://www.777doc.com/doc-2875965 .html