大数据技术原理与应用学习笔记(四)
本系列历史文章
大数据技术原理与应用学习笔记(一)
大数据技术原理与应用学习笔记(二)
大数据技术原理与应用学习笔记(三)
分布式数据库HBase——BigTable的开源实现
HBase简介
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表 。
HBase与传统关系型数据库区别
数据类型: 字符串
数据操作: 只采用单表主键查询
存储模式: 基于列存储(关系数据库采用基于行存储)
数据索引: 只有一个索引——行键
数据维护: 仍会保留旧版本(关系数据库中不会)
可伸缩性: 非常好
HBase和BigTable的底层技术对应关系
如表所示
项目 | BigTable | HBase |
---|---|---|
文件存储系统 | GFS | HDFS |
海量数据处理 | MapReduce | Hadoop MapReduce |
协同服务管理 | Chubby | ZooKeeper |
HBase数据模型
相关概念
HBase数据模型的相关概念如下:
- 表:HBase采用表来组织数据,由行、列构成,列划分为若干列族。
- 行键:每行由行键标识,3种方式访问, 通过单个行键访问、通过一个行键的区间访问、全表扫描。
- 列族:基本的访问控制单元,访问控制、磁盘和内存的使用统计都在列族层面进行。
- 列限定符:列族里的数据通过列限定符定位,没有数据类型,视为字节数组byte[]。
- 单元格:通过行加列确定,存储数据。
- 时间戳:保存多版本数据时利用时间戳索引。
数据坐标
在HBase中,数据定位可视为“四维坐标”,即[“行键”,“列族”,“列限定符”,“时间戳”]。
概念视图与物理视图
在HBase的概念视图中,HBase中的每个表都是由许多行组成的,而在物理层,数据都是基于列的存储方式。
面向行存储: 优点是每次插入数据时都把其各项信息添加入数据库,缺点是分析特性时大部分都是以列为特征分析,因此不得不扫描全部行,影响性能。
面向列存储: 优点是每列存储的内容相似或相同,因此可获得很高的压缩率。
HBase原理
HBase的功能组件
库函数:链接到每个客户端;
一个Master主服务器,负责管理和维护HBase表的分区信息;
多个Region服务器,负责存储维护分配给自己的Region。
Master服务器的功能:
- 分区信息维护和管理。
- 维护了一个Region Server列表
- 整个集群中有哪些Region工作
- 负责对Region进行分配
- 负载平衡。
而客户端并不依赖于Master获得Region的位置信息,而是可以直接与Region Server存取。
Region服务器:
初始一个表中一个Region,随着Region增大至一个阈值时,等分成两个Region(默认100-200MB,现在可达到1-2GB),由Master将其分配到不同Region Server,同一个Region不会再拆分,一个Region Server包含多个Region(一般为10-1000个)。
Region的定位:
HBase中采用了三层结构来保存Region的位置信息,如图所示:
各层次的名称和作用如表所示:
层次 | 名称 | 作用 |
---|---|---|
第一层 | ZooKeeper文件 | 记录了-ROOT-表的位置信息 |
第二层 | -ROOT-表 | 记录了.META.表只能有一个Region。通过-ROOT-表就可以访问.META.表中的数据 |
第三层 | .META.表 | 记录了用户数据表的Region位置信息,.META.表可以有多个Region,保存了HBase中所有用户数据表的Region位置信息 |
有关寻址的计算:
例:设.META.表一行在内存占1KB,每个Region128MB,则:
一个-ROOT-表寻址 128MB/1KB = 217 个.META.表的Region。
一个.META.表寻址 128MB/1KB = 217 个Region。
共寻址234个Region。
注:为了加速寻址,客户端会缓存位置信息,同时采用惰性机制1解决缓存失效问题。
HBase的运行机制
系统架构
HBase的系统架构如图所示:
客户端: 为了加快访问速度,包含了了访问HBase的接口。对于管理类操作,客户端与Master进行RPC;对于读写类操作,客户端会与Region服务器进行RPC。
ZooKeeper 服务器: 实现协同管理服务,提供管家功能2。大量用于分布式系统,提供配置维护,域名服务,分布式同步服务。
Master(主服务器): 主服务器主要负责表和Region的管理工作。
- 管理用户对表的增加、删除、修改、查询等操作。
- 实现不同Region服务器之间的负载均衡。
- 在Region分裂或合并,负责重新调整Region的分布。
- 对发生故障失效的Region服务器上的Region进行迁移。
Region 服务器:
Region服务器是HBase中最核心的模块。
一个Region Server包含10~100个Region,共用一个HLog。一个Region对应多个Store,一个Store包含一个MemStore(在内存中的缓存,用来保存更新数据)和若干的StoreFile(通过HDFS的HFile实现)。其工作原理如下:
读写数据过程: 先写入MemStore和HLog,当操作写入HLog后,commit()才会将其返回给客户端。RegionServer访问 MemStore,若不在,才回到HDFS的HFile中找。
缓存刷新过程: 系统周期性将MemStore中内容刷到StoreFile中,清空缓存,在HLog中添加标记,每次刷新生成一个新StoreFile,每个Region Server启动都会检查HLog,确认最近一次刷新后是否还有更新,若有,则先写入Memstore,再刷到StoreFile,最后删除旧HLog,启动服务。
StoreFile的合并: 当StoreFile数量达到一定阈值时才合并,当再次达到一定阈值又会执行Region的分裂。
HLog的工作原理
用户更新数据必须首先记入日志才能写入MemStore缓存,并直到MemStore缓存内容对应的日志记入磁盘后,该缓存内容才会被刷入到磁盘。
ZooKeeper监控每个Region Server状态,当某个Region Server故障时:
- ZooKeeper通知Master
- Master处理故障Region Server的HLog,拆分给其每个Region目录下,并将其分配给可用的Region Server ,并将HLog一并发送。
- 新Region Server接收到HLog后重新做一遍日志记录中的各种操作,把日志记录中的数据写入MemStore中,刷新到StoreFile中。
HBase性能优化方案
时间靠近的数据存在一起,按照降序排列。
- 用时间戳做行键
提升读写性能 - 设置HColumnDescriptor.setInMemory = true,把相关的表放到Region Server的缓存中
节省存储空间 - 设置HColumnDescriptor.setMaxVersions = 1,最大版本数为1,只保存最新版本
TimeToLive参数:设置过期自动删除
HBase检测性能的工具
- Master-status(自带)
- Ganglia
- OpenTSDB
- Ambari(Hadoop)
而且可用SQL语句查HBase;
- SQL语句的优点:易用,减少编码量
Hive和Phonenix;
- Hive与HBase接口互相通信实现访问
- Phonenix构建在Apache HBase之上的SQL中间层
HBase的二级索引;
- 原生的HBase只支持3种方式查询行
- 新方式通过建立主表和索引表提高性能
Hase编程实践
HBase的编程实践请参考厦大数据库博客:HBase2.2.2安装和编程实践指南