之前了解过Yarn,这次再初步了解下 Hbase和Hive。
HBase:
HBase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问。
HBase是一个开源的、分布式的、多版本的、面向列的存储模型。
HBase存储的是松散型数据。
HBase存储的数据从逻辑上来看就像一张很大的表,并且它的数据列可以根据需要动态增加。
单机模式下运行HBase,首先启动ZooKeeper,然后启动HBase Master,最后启动HBase RegionServer
停止HBase时候,首先停止HBase Master,然后停止ZooKeeper。
HBase体系结构:
遵从简单的主从服务器架构,由HRegion服务器群和HBaseMaster服务器构成。
HBaseMaster服务器负责管理所有的HRegion服务器,在其上存储的是从数据到HRegionServer的映射。
HBase逻辑上的表可能会被划分成多个HRegion,然后存储到HRegion Server群中。
HRegion服务器:一台机器上面一般只运行一个HRegion服务器,且每一个区段的HRegion也只会被一个HRegion服务器维护。
注意:ROOT表包含META表所在的区域列表,META表包含所有的用户空间区域列表,以及Region服务器地址。
HBase数据模型:
HBase是介于Map Entry(key & value)和DB Row之间的一种数据存储方式。就点有点类似于现在流行的Memcache,但不仅仅是简单的一个key对应一个 value,你很可能需要存储多个属性的数据结构,但没有传统数据库表中那么多的关联关系,这就是所谓的松散数据。
简单来说,你在HBase中的表创建的可以看做是一张很大的表,而这个表的属性可以根据需求去动态增加,在HBase中没有表与表之间关联查询。你只需要 告诉你的数据存储到Hbase的那个column families 就可以了,不需要指定它的具体类型:char,varchar,int,tinyint,text等等。但是你需要注意HBase中不包含事务此类的功 能。
什么是列存储?
列存储不同于传统的关系型数据库,其数据在表中是按行存储的,
列方式所带来的重要好处之一就是,由于查询中的选择规则是通过列来定义的,因 此整个数据库是自动索引化的。
按列存储每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量,一个字段的数据聚集存储,那就 更容易为这种聚集存储设计更好的压缩/解压算法。
读取一行记录HBase是如何进行工作的,
首先HBase Client端会连接Zookeeper Qurom(从下面的代码也能看出来,例如:HBASE_CONFIG.set("hbase.zookeeper.quorum", "192.168.50.216") )。
通过Zookeeper组件Client能获知哪个Server管理-ROOT- Region。
那么Client就去访问管理-ROOT-的Server,在META中记录了HBase中所有表信息,
(你可以使用 scan '.META.' 命令列出你创建的所有表的详细信息),
从而获取Region分布的信息。
一旦Client获取了这一行的位置信息,比如这一行属于哪个Region,Client将会缓存这个信息并直接访问HRegionServer。久而久之Client缓存的信息渐渐增多,即使不访问.META.表也能知道去访问哪个HRegionServer。
HBase中包含两种基本类型的文件,一种用于存储WAL的log,另一种用于存储具体的数据,这些数据都通过DFS Client和分布式的文件系统HDFS进行交互实现存储。
再来看看HBase的一些内存实现原理:
- HMaster— HBase中仅有一个Master server。
- HRegionServer—负责多个HRegion使之能向client端提供服务,在HBase cluster中会存在多个HRegionServer。
- ServerManager—负责管理Region server信息,如每个Region server的HServerInfo(这个对象包含HServerAddress和startCode),已load Region个数,死亡的Region server列表
- RegionManager—负责将region分配到region server的具体工作,还监视root和meta 这2个系统级的region状态。
- RootScanner—定期扫描root region,以发现没有分配的meta region。
- MetaScanner—定期扫描meta region,以发现没有分配的user region。
HBase中模式设计具体例子: