HBase目录
一、安装HBase
HBase安装地址:HBase安装
二、了解NoSQL
2.1 概念
- NoSQL:not only SQL,非关系型数据库
- NoSQL是一个通用术语
- 指不遵循传统RDBMS模型的数据库
- 数据是非关系的,且不使用SQL作为主要查询语言
- 解决数据库的可伸缩性和可用性问题
- 不针对原子性和一致性问题
2.2 对比RDBMS
2.3 NoSQL与大数据
- NoSQL与大数据相关性较高,但是NoSQL != 大数据
- NoSQLchanpin是为了帮助解决大数据 存储问题,但是大数据不仅仅包含数据存储问题
- 通常大数据场景采用列存储数据库(e.HBase)
三、HBase概述
- HBase是一个领先的NoSQL数据库
- 是一个面向列存储的NoSQL数据库
- 是一个分布式Hash Map,底层数据是key-value格式
- 基于Google Big Table论文
- 使用HDFS作为存储并利用其可靠性
- HBase特点
- 数据访问速度快,响应时间约2~20毫秒
- 支持随机读写,每个节点20k~100k+ ops/s
- 可扩展性,可扩展20000+节点
- 高并发
四、HBase架构原理
HBase也是 Master/slaves架构,由一个HMaster,多个 HResgionServer组成。
4.1 HBase架构及相关功能
- Client:客户端,包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息;可以是 HBase Shell、 Java API客户端、 RestAPI等;
- ZooKeeper:HBase通过 ZooKeeper来做 HMaster的高可用、 HRegionServer的监控、元数据的入口以及集群配置的维护等工作;
- HMaster
- 监控 HRegionServer,处理 HRegionServer故障转移,当某个HRegionServer挂掉时,ZooKeeper会将分配在该HRegionServer上的 HRegion分配到其他HRegionServer上进行管理;
- HRegion分裂后,负责新的HRegion的分配;
- 处理元数据的变更,比如对表的添加,修改,删除等操作;
- 在空闲时间进行数据的负载均衡,主要就是在HRegionServer间迁移HRegion,达到负载均衡;
- 通过 ZooKeeper发布自己的位置给客户端;
- HRegionServer:HRegionServer直接负责用户的读写请求,是真正的“干活”的节点;
- 负责和底层HDFS的交互,存储数据到HDFS,HBase是依托于HDFS的 NoSQL数据库,数 据会存储在 HDFS上;
- 处理分配给它的 HRegion;
- 刷新缓存到 HDFS;
- 维护HLog(HLog是一个容错机制)
- 处理来自客户端的读写请求。HRegionServer是实际管理数据的,所以客户端的读写请求最终都要由HRegionServer来处理;
- 负责处理 HRegion变大后的拆分;
- 负责 StoreFile的合并工作;
- HDFS:HDFS为 HBase提供最终的底层数据存储服务,同时为 HBase提供高可用HLog存储在 HDFS)的支持,具体功能概括如下:
- 提供元数据和表数据的底层分布式存储服务;
- 数据多副本,保证的高可靠和高可用性;
- HRegion :HRegion可以看成是表的横向切分, HBase表的分片, HBase每个表都会根据RowKey值被切分成不同的HRegion分散存储在HRegionServer中,在一个HRegionServer中可以有多个不同的HRegion;值得注意的是,一个 HRegion只能在一个 HRegionServer上 ,不能跨多个HRegionServer;
- Write Ahead Logs:也叫预写日志上,在 HBase中为HLog HLog存储在HDFS;当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据在写入内存之前会先写在一个叫做Write Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。 需要注意的是,HLog是每一个RegionServer对应一个;
- Store:每一个Region内部,又分为多个Store,一个Store对应表中的一个列族。也就是说一个Store存储了对应表该列族下的部分数据;
- MemStore:顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,HRegsionServer会在内存中存储键值对;
- HFile:这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以HFile的形式存储在 HDFS的。文件内容是二进制;
4.2 HBase数据存储结构
HBase是稀疏的,稀疏主要是针对HBase列的灵活性,在列族中你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的 。HBase底层存储的数据是KeyValue格式的数据。这一块内容在hbase shell插入数据部分有详细的解释。 HBase逻辑上也可以看成一个二维表格,可以添加行,可以动态添加列。
- RowKey
- 决定一行数据,按行检索数据,相当于一级索引;
- 按照字典顺序排序的,说明数据是有序的;
- 只能存储64k的字节数据,RowKey越短越好
- Column Family(列族)
- 列族是HBase对表在纵向上的优化;
- 列族在在物理存储上对应于HDFS上的 一个目录; HBase表中的每个列,都归属于某个列族。列族是表的 schema的一部分 (而列不是 ),必须在使用表之前定义 (也就是创建表时定义 ).列名都以列族作为前缀;
- 每一个列族对应一个Store,也对应 HDFS一个目录,类似于 Hive分区操作一样, HBase相当于按列族进行了分区;
- cell(单元格)
- cell由行和列的坐标交叉决定;
- 单元格是有版本的;
- cell的内容是未解析的字节数组;
- cell由{row key, column( = +), version} 唯一确定的单元;
- cell中的数据是没有类型的,全部是字节码形式存贮;
- Time Stamp(时间戳)
- 在HBase每个cell存储单元对同一份数据可以有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面;
- 时间戳的类型是 64位整型,一般由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳;
4.3 HBase原理
a.元数据存储
HBase中有一个系统表 hbase:meta存储 HBase元数据信息,可以在HBase Web UI查看到相关信息,如下图:
该表记录保存了每个表的Region地址,还有一些其他信息,例如Region的名字,对应表的名字,开始行键,结束行键 ,服务器的信息。 hbase:meta表中每一行对应一个单一的Region。数据如下图:
PS:如果有写错或者写的不好的地方,欢迎各位大佬在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!
原创作者:wsjslient |