4.1 概述
4.1.1 关于BigTable
BigTable是谷歌开发的 为解决典型的互联网搜索问题的 分布式存储系统
互联网搜索服务一般分为两步:首先,爬虫持续不断的抓取新页面,每页一行存储到BigTable里,MR运行在整张表上,生成索引;然后,用户发起网络搜索请求时,应用索引在BigTbale里得到网页,然后把搜索结果提交到用户。
4.1.2 HBase简介
1. HBase是高可靠、高性能、面向列、可伸缩的分布式数据库,BigTable的开源实现,用于存储非结构化或半结构化的数据。可处理10亿行几百万列的数据表。
2. HBase与Hadoop生态中其它组件的关系
1)HDFS为HBase提供底层的文件系统支持;
2)MR为HBase提供海量数据处理的计算引擎;
3)Zookeeper为HBase提供协同服务管理;
4)Pig/Hive为HBase提供高层语言支持;
3. 已有HDFS和MR,为什么需要HBase?
HBase更有效地解决实时处理和随机访问问题。HDFS和MR则更适用于离线高延迟批量处理。
4.1.3 HBase与传统数据库对比
1)数据类型:HBase仅支持一种类型,即未经解释的字符串;
2)数据操作:HBase通常只采用单表的主键查询,而不涉及多个表的复杂连接;
3)存储模式:HBase基于列(族)存储;
4)数据索引:HBase只有一个索引-行键;
5)数据维护:HBase不会删除旧数据,而是会存储多个版本(带时间戳)
6)可伸缩性:HBase很好的支持横向扩展,即通过加机器解决问题。
4.2 HBase访问接口
1)Java API是最常规和高效的方式;
2)HBase Shell是最常用的管理操作;
3)Thrift Gateway通过序列化技术扩展了支持的语言,如python等;☆
4)REST Gateway支持了HTTP API访问;
5)Pig和Hive是数仓工具。
上述工具均应系统学习。
4.3 HBase数据模型
4.3.1~4.3.3 HBase简介数据模型
1. 概述:HBase是一个稀疏、多维度、排序的映射表,索引是行键、列族、列限定符、时间戳。
2. 相关概念:
1)表:表仍然由行和列组成,其中列分为若干个列族。
2)行:每个行有一个独一无二的行键进行标识;可以通过单个行键、行键区间、全表扫描等方式进行访问;行键被保存为字节数据,且存储时是排过序的。
3)列族:设计表时就被写死的,通常几十个。
4)列限定符:也就是列,每个列族都有若干个列,而且不用事先定义。
5)单元格:通过行键、列族、列限定符就可以锁定到一个单元格了。
6)时间戳:每个单元格都保存着同一份数据的多个版本,通过时间戳进行标记,时间戳默认desc排序。
3. 数据坐标角度
通过行键、列族、列限定符、时间戳就能索引出独一无二的数据来了,因此也称之为数据的四维坐标。
4. 键值角度
把四维坐标看成一个整体,当作键,索引出的数据叫做值,那么HBase就可以看作键值数据库了。
4.3.4~4.3.5 概念视图与物理视图
概念视图是稀疏的,因为很多[行键,列族,列限定符,时间戳]索引都没有值
但物理视图是紧凑的,因为HBase是基于列存储,每个列族单独存放,有值的才会存放,没有值的,连NULL都没有。
4.3.6 深入理解面向列的存储
1. 面向行存储
数据是一行一行被存储的,以学生信息系统为例,每一行包含了一个学生的全部信息,比如学号、姓名、性别、年龄、专业、班级、手机、邮箱、等等。
增删改:若新来了一个学生,则在该数据库新增加一行;若某个学生退学了,则把改行删除;若某个学生的某个信息(如手机号)发生了改动,则对该信息做对应修改。
查:若想把所有学生的年龄取出来,看一下年龄分布,则注意:此时需要逐行扫描,对每一行,都要扫描学号、姓名、年龄、、、最终找到年龄。
2. 面向列存储
把全部的数据分成若干个列(族),比如联系方式是一个列族(里面包括手机号、邮箱等列限定符),该列族对所有的学生的联系方式进行存储,基本信息是一个列族(里面包括年龄、性别等),该列族存储所有学生的所有基本信息。
增删改:对应的信息不做删除,而是会添加,并用时间戳进行标记。
查:若此时想取出年龄,则不再需要遍历所有学生的所有信息,仅把对应列族的列取出来即可。
注意:尽管是面向列存储,但归根结底每一行是一个学生,这就是行键的作用。
3. 两者的区别
若数据库会频繁进行修改,则适用于行式数据库。若数据库一经存储便不再修改(数仓),但需要做很多查询、分析等,则适用于列式数据库。
(更多的从HBase的物理视图去理解列式数据库)
4.4 HBase的实现原理
4.4.1 HBase的功能组件
1)库函数:负责连接到每个客户端。
2)一个Master服务器:① 负责管理和维护HBase表的分区信息;② 负责维护Region服务器列表;③ 负责不同的Region服务器的负载均衡。
3)若干个Region服务器:存储和维护分配给自己的Region,处理来自客户端的读写请求。
4.4.2 表和Region
1)一个HBase库可以有很多表,每个表的行是排过序的,排序的依据是行键的值的字典序。
2)一个表的行数可能非常之大,无法存储到单台服务器上,因此会根据行键的值进行分区,每个行区间构成一个分区,称为Region。
3)分区机制:① 每个表最初只包含一个region,随着数据不断插入,当行数达到设定的阈值时,会自动等分成两个region;② 不同的region被master分配到不同的region服务器上,一个region服务器可以存储很多个region,但同一个region不会被拆分到多个region服务器上。
4.4.3 Region定位
1. 由下及上
1).META表:维护RegionID和Region服务器的映射关系。
2)-ROOT-表:因为Region数量庞大,所以.META表本身也被拆分成了若干个Region。-ROOT-表记录.META表的Region信息。-ROOT-表只有一个Region。
3)Zookeeper文件:记录了-ROOT-表的位置信息。
2. 由上及下
客户端通过Zookeeper文件找到-ROOT-表的存储位置,然后通过-ROOT-表找到.META表的位置,然后通过.META表找到所需的Region在哪个Region服务器上,然后到该Region服务器读取数据。
4.5 HBase运行机制
4.5.1 HBase的系统架构
HBase系统架构如下图
HBase不直接跟硬件打交道,而是架构在HDFS文件系统之上的。主要由客户端、Zookeeper、Master、Region服务器(核心)四个部分构成。分别简述如下。
1. 客户端
如上图所示,客户端会访问Zookeeper获取文件的存储位置、并进行一些缓存、访问Region服务器读取数据等。
2. Zookeeper服务器
1)把-ROOT文件保存到内存中,供客户端进行三级寻址;
2)在Region服务器集群中选出一个master;
3)监控所有的Region服务器,并实时通知给master。
3. Master
管理着表和Region,包括以下方面:
1)管理客户端对表的增删改查操作,负责不同Region服务器的负载均衡;
2)在Region发生分裂或合并时负责调整;
3)对故障失效的Region服务器上的Region进行迁移。
注意:Master不参与客户端访问HBase服务器上数据的过程。(?)
4. Region服务器
是HBase的核心模块,存储着数据,并响应用户的读写请求。HBase本身不进行数据复制、维护副本等,由HDFS支持。HBase也可以不使用HDFS。
4.5.2 Region服务器的工作原理
如上图所示:① Region集群包括若干个Region服务器,② 一个Region服务器有若干个Region和一个HLog文件,③ 每个Region有若干个Store(一个Store即是一个列族),④ 每个Store有若干个StoreFile(在磁盘中)和一个MemStore(在内存中),⑤ StoreFile对应于HDFS中的HFile。
1. 读写数据
1)写数据:相应的Region服务器先把数据写到MemStore和HLog里;
2)读数据:Region服务器先去MemStore找,如果不在缓存中,再去磁盘的StoreFile里找。
2. 缓存刷新
1)MemStore:系统周期性调用Region.flushcache()把MemStore内容写到StoreFile里,并把相应操作记录到HLog里。
2)HLog:Region服务器每次启动时会检查HLog,确认最后一次Region.flushcache()后是否有新的写入记录,如果有,则写到MemStore中,再刷到StoreFile中。最后删除旧的HLog文件。
3. StoreFile合并
在磁盘中的StoreFile数量达到一个阈值时,系统调用Store.compact()把多个StoreFile合并成一个大文件,以减少查询时间。
4.5.3 Store的工作原理
1)MemStore是排序的内存缓冲区;
2)周期性刷到StoreFile中;
3)StoreFile合并;
4)当单个StoreFile文件大小超过一定阈值(只可能出现在某次合并后)时,重新分裂成两个StoreFile。注意:此时原有的Region分裂成两个,父Region下线,两个新的子Region被Master分配到相应的Region服务器上。
4.5.4 HLog的工作原理
1)预写入:MemStore中的数据对应的日志已被写入磁盘后,才会刷到StoreFile里。
2)Region服务器故障处理:① Zookeeper监测到,并通知给Master,② Matser找到该服务器上的HLog文件,把记录的数据根据所属的Region对象进行拆分,③ 把拆分后的HLog分发到可用的Region服务器上,Region服务器根据HLog完成数据恢复操作
3)为什么一个Region服务器不同的Region共用一个HLog:减少磁盘寻址次数,提高对表的写操作性能。
4.6 HBase应用
4.6.1 性能优化方法
1)行键:行键按字典序存储,把行键设置成时间戳等,可把时间相近得数据存储的也相近
2)InMemory:设置为True,把表放到缓存中
3)Max Version:最大版本数不用设置太高,若只需最新的设置为1就行了
4)Time To Live:设置数据的存储生命周期,到期自动清空
4.6.2 性能监视
自带的Master-status:以Web方式显示监控集群状态
Open TSDB:略
Ambari:创建、管理、监视Hadoop集群
4.6.3 在HBase上构建SQL引擎
目的:易用、减少编码量。
方案:1)Hive、2)Phoenix等
4.6.4 HBase的二级索引
略
4.7 HBase编程实践
4.7.1 HBase Shell
注意HBase终究是数据库,所以HBase Shell的大部分命令都是类似于MySQL语言的操作,包括建表、列出表信息、插数、查数、浏览表、修改列、统计行数、删除数据、删除表、等等。除此之外还有少量的关闭HBase集群、检查集群状态的命令
4.7.2 HBase的Java API
略,回头细学。