1、Hbase介绍
1.一、对Hbase的认识
- HBase做为面向列的数据库运行在HDFS之上,HDFS缺少随机读写操做,HBase正是为此而出现。
- HBase参考 Google 的 Bigtable 实现,以键值对的形式存储。项目的目标就是快速在主机内数十亿行数据中定位所需的数据并访问它。
- HBase是创建在HDFS之上的分布式面向列的数据库;属于KV结构数据(V能够随便存,结构化数据和非结构化数据均可以),原生不支持标准SQL。
- HBase能够提供快速随机访问海量结构化数据。
- 它利用了Hadoop的文件系统(HDFS)提供的容错能力。
- Hive 和 Hbase都是做用在hdfs之上的。
- Hive :适合统计分析。Hive 执行的是mapreduce任务,延迟高。
- Hbase:适合大数据量查询,不适合统计分析。Hbase是键值对存储,能够快速返回数据。
1.二、Hbase数据单元
- RowKey:是Byte array,是表中每条记录的“主键”,按照字典顺序排序,惟一,方便快速查找,Rowkey的设计很是重要;
- Column Family:列族,拥有一个名称(string),包含一个或者多个相关列;
- Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加;
- Version Number:版本号,类型为Long,默认值是系统时间戳Timestamp,可由用户自定义;用于标记同一份数据的不一样版本。
- Value(Cell):具体的值,Byte array;
- 总之,在一个HBase:
- 表是行的集合。
- 行是列族的集合。
- 列族是列的集合。
- 列是键值对的集合。
- 建表时:指定表的列族,列本身插入数据时动态建立

1.三、Hbase物理存储结构
- 每一个column family存储在HDFS上的一个单独文件中,空值不会被保存;
-
Key 和 Version number在每一个 column family中均有一份;web
-
HBase 为每一个值维护了多级索引,即:<key, column family, column name, timestamp>;算法
-
在物理层面上,表格的数据是经过StoreFile来存储的,每一个StoreFile至关于一个可序列化的Map,Map的key和value都是可解释型字符数组;sql
-
Column Family是一组Column的组合,在HBase中,Schema的定义主要为Column Family的定义,同大多数nosql数据库同样,HBase也是支持自由定义Schema,可是前提要先定义出具体的Column Family,而在随后的column定义则没有任何约束;其次,HBase的访问权限控制,磁盘及内存统计等功能都是基于Column Family层面完成的;数据库
-
HBase提供基于Cell的版本管理功能,版本号默认经过timestamp来标识,而且呈倒序排列;数组
2、Hbase原理分析
HBase采用Master/Slave(主仆结构)架构搭建集群,它隶属于Hadoop生态系统,由如下类型节点组成:缓存
- HMaster节点
- HRegionServer节点
- ZooKeeper集群
- 而在底层,它将数据存储于HDFS中,于是涉及到HDFS的NameNode、DataNode等
整体结构以下:架构

2.一、Client
- 使用HBase RPC机制与HMaster和HRegionServer进行通讯;
- Client与HMaster进行通讯进行管理类操做;
- Client与HRegionServer进行数据读写类操做;
2.二、HMaster
HMaster没有单点问题,HBase中能够启动多个HMaster,经过Zookeeper保证总有一个Master在运行。
HMaster主要负责Table和Region的管理工做:负载均衡
- 管理用户对表的增删改查操做DDL;
- 管理HRegionServer的负载均衡,调整Region分布;
- Region Split后,负责新Region的分布;
- 在HRegionServer停机后,负责失效HRegionServer上Region 的迁移;
2.三、HRegionServer
HBase中最核心的模块;nosql
- 维护region,处理对这些region的IO请求;
- Regionserver负责切分在运行过程当中变得过大的region;
- 一个HRegionServer包括多个HRegion和一个Hlog
HRegion介绍分布式
HBase使用RowKey将表水平切割成多个HRegion,从HMaster的角度,每一个HRegion都纪录了它的StartKey和EndKey(第一个HRegion的StartKey为空,最后一个HRegion的EndKey为空),因为RowKey是排序的,于是Client能够经过HMaster快速的定位每一个RowKey在哪一个HRegion中。(通俗理解:就是经过StartKey和Endkey将rowkey按照顺序存储)

查看web UI

HregionServer详解

- HRegionServer通常和DataNode在同一台机器上运行,实现数据的本地性。
- HRegionServer内部管理了一系列HRegion对象,每一个HRegion对应了Table中的一个Region。
- 一个Table能够有一个或多个Region,他们能够在一个相同的HRegionServer上,也能够分布在不一样的HRegionServer上,一个HRegionServer能够有多个HRegion,他们分别属于不一样的Table。
- HRegion由多个Store(HStore)构成,每一个HStore对应了一个Table在这个HRegion中的一个Column Family,即每一个Column Family就是一个集中的存储单元,于是最好将具备相近IO特性的Column存储在一个Column Family,以实现高效读取。
- 每一个HRegionServer中都会有一个HLog对象。HLog是一个实现Write Ahead Log的类,每次用户操做写入Memstore的同时,也会写一份数据到HLog文件,HLog文件按期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。
- 引入HLog缘由:
- 灾难恢复。在分布式系统环境中,没法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种状况。
- 一个HStore由一个MemStore 和0个或多个StoreFile组成。
- MemStore:
- 是一个写缓存(In Memory Sorted Buffer),全部数据的写在完成WAL日志写后,会写入MemStore中,由MemStore根据必定的算法将数据Flush到底层HDFS文件中(HFile),一般每一个HRegion中的每一个 Column Family有一个本身的MemStore。
- StoreFile:
- 用于存储HBase的数据(Cell/KeyValue)。在HFile中的数据是按RowKey、Column Family、Column排序,对相同的Cell(即这三个值都同样),则按timestamp倒序排列。

2.四、Zookeeper
- ZooKeeper为HBase集群提供协调服务,它管理着HMaster和HRegionServer的状态(available/alive等),而且保证集群中只有一个HMaster,会在它们宕机时通知给其余HMaster,从而能够实现HMaster之间的故障转移;
- 实时监控HRegionServer的上线和下线信息,并实时通知给HMaster;
- 存储HBase的Meta Table(hbase:meta)的位置,Meta Table表存储了集群中全部用户HRegion的位置信息,且不能split;
- Zookeeper的引入使得Master再也不是单点故障;
在zookeeper的节点中: /hbasae/master:来表示Active的HMaster; 若是当前Active的HMaster宕机,则该节点消失,于是其余HMaster获得通知,而将自身转换成Active的HMaster,在变为Active的HMaster以前,它会建立在/hbase/back-masters/下建立本身的Ephemeral节点;