HBase学习笔记

一、HBase简介

  HBase 是基于hadoop的开源数据库,它以Google的BigTable为原型,设计并实习了具有高可靠度、高性能、列存储、可伸缩、实时读写的数据库,用于存储粗颗粒的结构化数据。

  HBase 以行和列存储数据,每个表由行和列组成,每个列属于一个列族。在表中,列的定义为:<family>:<qualifier>(<列族>:<限定符>)。列族和限定符的概念有点类似与表中的一级列标题和二级列标题。由行和列确定的存储单元叫做元素(cell),每个元素保存着多个不同的版本,以时间戳来标识。HBase在磁盘上按照列族来存储。

  行键是数据行在表中的唯一标识,作为检索记录的主键。在HBase 表中有三种方式访问表中的行:给出行键,给出行键的范围,全文检索。

  时间戳对应每次数据操作所关联的时间,可以系统自动生成,也可以由用户显示赋值。HBase提供两种方式的数据回收方式:一是对于每个元素,只存储指定个数的最新副本,二是保存最近一段时间的所有副本。

  元素由行键、列(<family>:<qualifier>)和时间戳唯一确定,元素中的数据按照字节码存储,没有类型之分。

二、HBse的物理模型

   HBase 是按照列存储的系数行/列矩阵。表中的空值不被存储。

  HBase 在行的方向上将表分成多个Region,每个Region包含一定范围(根据行键进行划分)的数据。每个表最初只有一个Region,随着表中的数据慢慢变大,超过某个阀值的时候,表被拆分成两个Region 。所以一段时间后,一个表会被拆分从多个Region。Region 是HBase 分布式存储和负载均衡的最小单位。一张表的所有Region 会被分布在不同的Region服务器上,但一个Region 内的数据之存在一个服务器上。物理上所有的数据全部存储在HDFS 上。通常一台计算机运行一个HRegionServer,没一个HRegionServer可以管理多个Region 实例(HRegion)。

  同一个Region 中不同的列族的数据被存成不同的Store,每一个store又是由一个MemStore和零或多个StoreFile组成。StoreFile又是以Hfile的形式被存储在HDFS 上。当增加新的数据时,会首先存入MemStore,当超过一定的阀值时,HRegionServer 服务器会启动一个单独的线程将MemStore中的内容刷新到磁盘,形成新的StoreFIle。当StoreFIle 的数量增长到一定阀值后,就会合并成一个StoreFile  。StoreFile 在合并的过程中会变成更大的StoreFile ,当单个StoreFile 的大小超过某个阀值的时候,会把当前的Region 分割成两个Region,并由HMaster 分配到相应的Region 服务器上。

三、HBase 怎么实现分布式的写入、存储和读取

  HBase 由Region 服务器(HRgeionServer )和主服务器(HMaster)组成。HRgeionServer除了前面说的管理多个Region实例之外,他还维护着一个HLog,他是一个预写式日志(WAL,write-ahead log),用来做灾难备份的。由于每个Region 服务器只维护一个HLog ,所以这个服务器上的各个Region 的日志是混合的。这样是为了不断追加多个文件,同写多个文件而言,可以减少硬盘寻址次数,提高对表的写性能。但如果一个Region服务器挂掉,那么为了恢复他,需要将Region 上的Log 进行拆分,然后分发给其他Region服务器进行回复。

  HMaster,HBase每个时刻只有一个HMaster在运行,他将Region 分配给HRegionServer,协调Region服务器的负载并维护集群状态。Hmaster不会对外提供服务,而是由HRegionServer负责所有的读写请求。如果HRegionServer发生故障,HMaster 会通过ZooKeeper感知到,并处理Log文件,将失效的Region进行重新分配。

  当用户提出对于数据的操作请求时,先链接相关的HRegionServer 服务器,然后向Region提交变更,提交的数据会首先提交到WAL  和MemStore中。那么问题来了,用户怎么知道自己要查询的数据在哪个Region上,并且在哪个HRegionServer 上呢?这里就要用到元数据表的概念。用户的Regions数据被存储.META.表中,随着Region的增多,.META.表中的数据会增大,并分裂成多个Regions,为了定位.META.表中各个Regions的位置,吧.META.表中所有的Regions 的元素据保存在-ROOT-表中,最后由ZooKeeper记录-ROOT-表中的位置信息。

  所以当用户访问数据时,应该首先访问ZooKeeper获得-ROOT-的位置,进一步获取.META.的位置,最后根据.META.表中的信息确定用户数据存放的位置。-Root-表永远不会被分割。这样,最到三次跳转就可以定位到任意一个Region。不过客户端会把查询过的信息缓存起来,且缓存不会主动失效。如果客户端根据缓存不能访问到数据,那么则询问只有i相关.META.表的Region服务器,如果还失效,则访问-ROOT-服务器,还失败,则访问ZooKeeper 。需要6次网络来回,才能定位到正确的Region。

四、如何配置HBase

  如果之前已经配置好了Hadoop的环境,那么HBase的配置就是比较简单的。无论那种模式(单机模式、伪分布式还是分布式模式)基本上都要配置两个文件:{HBase_HOME}/conf/hbase-env.sh和{HBase_HOME}/conf/hbase-site.xml。

  修改hbase-env.sh文件。单击模式:将JAVA_HOME设置为java的安装的根目录

             伪分布式模式:将JAVA_HOME设置为java的安装的根目录、添加HBASE_CLASSPATH={hadoop_home}/conf

             分布式模式:将JAVA_HOME设置为java的安装的根目录、添加HBASE_CLASSPATH={hadoop_home}/conf、添加HBASE_MANAGES_ZK并              将值设置为true。

  修改hbase-site.xml文件:单机模式:设置hbase的目录,制定为本地的一个地址

              伪分布式模式:设置hbase的目录,将其指向localhost,并制定HBase在HDFS上的存储路径。将hbase.cluster.dirtributed设置为true.

              完全分布式模式:设置hbase的目录,将其指向集群中的NameNode,并制定HBase在HDFS上的存储路径。将hbase.cluster.dirtributed设              置为true.将hbase.zookeeper.quorum设置为所有Zookeeper检点的主机名或Ip地址(逗号隔开),默认为localhost。属性                       hbase.zookeeper.property.dataDir表示zookeeper的目录,默认为/tmp。

  除此之外,在完全分布式模式下,需要将hosts文件配置好。

五、HBase的基本shell操作和基本API 的使用

  这一部分将会专门去看技术手册,后面会补上,下面介绍一下HBase 如何利用MapRedeuce实现大量数据的并行处理

六、HBase 如何利用MapRedeuce实现大量数据的并行处理

  HBase集成了MapReduce框架,用于对大量数据进行并行处理。

   1、InputFormat类,HBase 实现了TableInputFormatBase类,提供了了对表数据的大部分操作,其子类TableInputFormat提供了完整的实现,用于处理表数据并生成键值对。他将Region分成split,然后将Region按行键分成<key,value>对,key对应行键,value对应该行的数据。

  2.Mapper和Reducer类。HBase 实现了TableMapper和TableReduce类,其中TableMaper没有实现具体功能,只是将key,value的类型限制为ImmutableByteWritable和Result。IdentidyTableMapper和IdentidyTableReduce则是傻瓜念书类的具体实现。

  3.OutPutFormat,HBase实现的TableOutPutFormat将输出的<key,value>对写到具体的HBase的表中,该类不会对WAL 进行操作。

 

posted @ 2015-03-08 21:38  起啥名都被占用  阅读(455)  评论(0编辑  收藏  举报