厦门大学数据库实验室NoSQL系列学习之 列族数据库HBase架构介绍 报告人:谢荣东 指导老师:林子雨 2015年7月10日
目录 遇到的问题 1、列族数据库简介 2、Hbase架构简介 3、总结
列族数据库 Part 1
基本概念 列族数据库 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 行式数据库 数据以行相关的存储体系架构进行空间分配 适合与小批量的数据处理,常用于联机事务型数据处理 列式数据库 以列相关存储架构进行数据存储的数据库 适合与批量数据处理和即席查询 EmpId Lastname Firstname Salary 1 Smith Joe 40000 2 Jones Mary 50000 3 Johnson Cathy 44000 数据格式: 1,Smith,Joe,40000;2,Jones,Mary,50000;3,Johnson,Cathy,44000; 数据格式: 1,2,3;Smith,Jones,Johnson;Joe,Mary,Cathy;40000,50000,44000;
HBase架构简介 Part 2
HBase介绍 历史回顾 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“BigTable:一个结构化数据的分布式存储系统”。 HBase – Hadoop Database,具有高可靠性、高性能、面向列、可伸缩等特点,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBASE是存储 基于HDFS 实时随机读写 HBase介绍 HBase定位 2018/11/10 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HBASE是存储 基于HDFS 实时随机读写 仿照Bigtable的论文制造 实时随机读写补充HDFS的不足 HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。 此外,Pig和Hive还为HBase提供了高层上图描述了Hadoop EcoSystem中的各层系统,其中HBase位于结构化存储层,Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。 语言支持,使得在HBase上进行数据统计处理变的非常简单。 Sqoop则为HBase提供了方便的RDBMS数据导入功能,使得传统数据库数据向HBase中迁移变的非常方便。
HBase介绍 HBase特性 线性扩展 行操作的强一致性,是CP系统 自动分表 支持MapReduce 2018/11/10 HBase介绍 HBase特性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 线性扩展 行操作的强一致性,是CP系统 自动分表 支持MapReduce Java,Thrift,REST-ful接口 从一开始就知道hbase是CAP中的CP系统,即hbase是强一致性的.我原来一直以为hbase的强一致性是因为底层的HDFS写入时,必须所有副本都写入成功才能返回.最近才想明白,hbase之所以是CP系统,实际和底层HDFS无关,它是CP系统,是因为对每一个region同时只有一台region server为它服务,对一个region所有的操作请求,都由这一台region server来响应,自然是强一致性的.在这台region server fail的时候,它管理的region failover到其他region server时,需要根据WAL log来redo,这时候进行redo的region应该是unavailable的,所以hbase降低了可用性,提高了一致性.设想一下,如果redo的region能够响应请求,那么可用性提高了,则必然返回不一致的数据(因为redo可能还没完成),那么hbase就降低一致性来提高可用性了. C(Consistency):一致性 A:(Availability):可用性 P(Tolerance of Network Partition):分区容忍性
Table Region ColumnFamily Row Column Version Value CELL Hbase数据模型 数据模型 2018/11/10 Hbase数据模型 数据模型 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Table Region ColumnFamily Row Column Version Value 表 表是在schema声明的时候定义的。 Region 表的一段 Column Family 在Hbase是column family一些列的集合。一个column family所有列成员是有着相同的前缀。比如,列courses:history 和 courses:math都是 column family:courses的成员.冒号(:)是column family的分隔符,用来区分前缀和列名。column 前缀必须是可打印的字符,剩下的部分(称为qualify),可以又任意字节数组组成。column family必须在表建立的时候声明。column就不需要了,随时可以新建。 在物理上,一个的column family成员在文件系统上都是存储在一起。因为存储优化都是针对column family级别的,这就意味着,一个colimn family的所有成员的是用相同的方式访问的。 Cells A {row, column, version} 元组就是一个Hbase中的一个 cell。Cell的内容是不可分割的字节数组。 尽管在概念视图里,表可以被看成是一个稀疏的行的集合。但在物理上,它的是区分column family 存储的。新的columns可以不经过声明直接加入一个column. 值得注意的是在上面的概念视图中空白cell在物理上是不存储的,因为根本没有必要存储。因此若一个请求为要获取t8时间的contents:html,他的结果就是空。相似的,若请求为获取t9时间的anchor:my.look.ca,结果也是空。但是,如果不指明时间,将会返回最新时间的行,每个最新的都会返回。 行 row key是不可分割的字节数组。行是按字典排序由低到高存储在表中的。一个空的数组是用来标识表空间的起始或者结尾。 版本 一个 {row, column, version} 元组是Hbase中的一个cell .但是有可能会有很多的cell的row和column是相同的,可以使用version来区分不同的cell. rows和column key是用字节数组表示的,version则是用一个长整型表示。这个long的值使用 java.util.Date.getTime() 或者 System.currentTimeMillis()产生的。 在Hbase中,版本是按倒序排列的,因此当读取这个文件的时候,最先找到的是最近的版本。 CELL
HBase架构设计 总体结构 Master RegionServer HDFS ZooKeeper Region之上的操作 2018/11/10 HBase架构设计 总体结构 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Master Region之上的操作 Put/Get不经过Master RegionServer Region之下的操作 HDFS HFile HLog ZooKeeper 状态信息 HMaster HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行,HMaster在功能上主要负责Table和Region的管理工作: 1. 管理用户对Table的增、删、改、查操作 2. 管理HRegionServer的负载均衡,调整Region分布 3. 在Region Split后,负责新Region的分配 4. 在HRegionServer停机后,负责失效HRegionServer 上的Regions迁移 HRegionServer HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。 Client HBase Client使用HBase的RPC机制与HMaster和HRegionServer进行通信,对于管理类操作,Client与HMaster进行RPC;对于数据读写类操作,Client与HRegionServer进行RPC Zookeeper [root-region-server, rs, unassigned, table, master, shutdown] Zookeeper Quorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的单点问题,见下文描述, Watcher
HBase架构设计 RegionServer结构 2018/11/10 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。 Store 一个Store包含了一个MemStore和若干个StoreFile(HFile).一个Store可以定位到一个column family中的一个region. MemStore MemStores是Store中的内存Store,可以进行修改操作。修改的内容是KeyValues。当flush的是,现有的memstore会生成快照,然后清空。在执行快照的时候,Hbase会继续接收修改操作,保存在memstore外面,直到快照完成。 HRegionServer HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。 HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。下图描述了Compaction和Split的过程: 在理解了上述HStore的基本原理后,还必须了解一下HLog的功能,因为上述的HStore在系统正常工作的前提下是没有问题的,但是在分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
HBase基本操作 与RDBMS的区别 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HBase 数据类型:HBase只有简单的字符类型,所有的类型都是交由用户自己处理,它只保存字符串。而关系数据库有丰富的类型和存储方式。 RDBMS 数据类型:关系数据库有丰富的类型和存储方式。 数据操作:HBase只有很简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系 数据操作:通常有各式各样的函数和连接操作。
HBase基本操作 与RDBMS的区别 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HBase 存储模式: HBase是基于列存储的,每个列族都由几个文件保存,不同的列族的文件时分离的 RDBMS 存储模式:基于表格结构和行模式保存的 数据维护: HBase的更新操作不应该叫更新,它实际上是插入了新的数据 数据维护:传统数据库是替换修改 可伸缩性: Hbase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻松增加或减少硬件的数量,并且对错误的兼容性比较高。 可伸缩性:通常需要增加中间层才能实现类似的功能
2018/11/10 HBase基本操作 创建表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 创建表:“create 'blog_user','userInfo'”
2018/11/10 Hbase基本操作 插入数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 插入数据:“ put‘blog_user’,‘www.aboutyun.com’,‘userInfo:user_Name’,‘aboutyun’” 上面我们看到了 1所示是什么,我们在传统数据块里面根本没有,这是nosql所特有的,是一个rowkey,是系统自带的,也是nosql中一条记录的唯一标识。但是这个唯一标识,有跟我们的传统数据库是有所差别的。如图1所示,“记录1”便是rowkey. 2所示是我们插入的列user_Name,这也是最难以理解的地方,列竟然可以插入。并且其“value”为3即'aboutyun'
Hbase基本操作 插入数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 我们会看到 1为rowkey,插入数据’www.aboutyun.com‘, 2为列族下面列的名字user_Name 3我们并没有在设计的添加这个列族,所以这个是系统自带的,这个是记录的操作时间,以时间戳的形式放到hbase里面。 4是我们插入的user_Name的值
Hbase基本操作 插入数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 再插入列Password:“put'blog_user','www.aboutyun.com','userInfo:user_Password','aboutyun'” 到这里,我们看到两行记录,传统数据块认为这是两行数据,对于nosql,这是一条记录。
Hbase基本操作 删除数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 删除单元格数据 delete 'blog_user','www.aboutyun.com','userInfo:user_Password'
总结 Part 3
总结 总结 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 列式数据库从一开始就是面向大数据环境下数据仓库的数据分析而产生 优点: 极高的装载速度 适合大量的数据而不是小数据 实时加载数据仅限于增加 高效的压缩率,不仅节省储存空间也节省计算内存和CPU 非常适合做聚合操作 缺点: 不适合扫描小量数据 不适合随机的更新 不适合做含有删除和更新的实时操作 现有的列族数据库: BigTable、Hbase、Cassandra、HadoopDB、GreenPlum、PNUTS
遇到的问题 Thanks.