概述
文章目录
- 1. HBase简介
- 1.1 HBase是什么?
- 1.2 列式存储与行式存储
- 2. HBase表格结构
- 3. HBase物理存储结构
- 4. HBase系统架构
- 4.1 重要文件
- 4.2 架构
- 4.3 Region定位
- Reference
1. HBase简介
1.1 HBase是什么?
HBase,即Hadoop DataBase,是Hadoop的一个子项目,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,是Google Bigtable的开源实现。
HBase在Hadoop生态中的位置如下[1]——
- 使用HDFS作为其分布式存储系统,提供了高可靠的底层存储支持
- 使用MapReduce来处理海量数据,提供了高性能的计算能力
- 使用Zookeeper提供协同/协调服务,提供了稳定服务和failover机制(故障切换)
1.2 列式存储与行式存储
上面说到HBase是基于列的列式数据库,而常用的关系数据库则是行式数据库,此处对两个概念做简单区分。
行式存储是指数据以行为单位进行存储,同一行的数据在存储介质中连续,如Oracle、Mysql、Sql Server
列式存储是指数据以列为单位进行存储,同一列的数据在存储介质中连续,如HBase、HP vertica等分布式数据库
行式存储适合处理OLTP,对实时性要求较高的应用,如ATM系统——
- INSERT/UPDATE容易,适合随机数据的增加和删除
- 适合需要获取行中所有属性的查询操作
- 当数据量很大时且没有索引时,需要大量IO(如只需要查询两列,但仍然要把每一行都读出来)
- 建立索引等提高性能的操作花时间、占空间
列式存储适合处理OLAP,实时性要求不高,但数据量大——
- 每一列都可以作为索引进行查询
- 查询时只有涉及的列被读取
- 各列独立存储,可根据每一列的实际情况进行压缩,节省存储空间
- 查询时对各个列并行查询,再进行组合(查询示意图如下)
- INSERT/UPDATE比较麻烦,不适合需要频繁更新的应用
2. HBase表格结构
HBase的表格中涉及到几个概念,用一个例子来解释,这一部分看了很多博客,其中HBase概念及表格设计解释得很通俗,可以看一下。
HBase中一个可能的表格如下,包括:
- RowKey:行键,类似关系表中的主键,是用来表示唯一一行记录的主键,按字典序排列
- Column:列,类似关系表中的列,在下图中的列就是
Gender,Age,Province,City
- ColumnFamily:列族,是列的集合,不同的列族存储在不同文件中,引入这个概念是因为HBase查询中,很多情况下不需要一行中所有的列
- Cell:单元格,由【RowKey、Column】确定的单元格,如下图中的
Male,20...
- TimeStamp:数据修改时加入的时间戳,下图中作为单独一列,实际上这个值是存放在单元格中的,见下面的例子
HBase的表数据内部用Map实现[5],如上图用字典/JSON形式可表示如下:
{"Mike":{
"BasicInfo":{
"Gender":{"T1":"Male"},
"Age":{"T1":"20"}
},
"AddressInfo":{
"Province":{"T1":"GuangDong"},
"City":{"T1":"Guangzhou"}
}
},
"Amy":{
"BasicInfo":{
"Gender":{"T2":"Female"},
"Age":{"T2":"18"}
},
"AddressInfo":{
"Province":{"T2":"GuangDong"},
"City":{"T2":"Shenzhen"}
}
}
}
假设将Mke的Age改为21,在HBase中会保留数据的若干版本,由时间戳区分,可把表格看成如下形式:
用字典/JSON形式表示如下,可以看到实际上只在第四行发生了改变,即在Age中增加了一个键值对
{"Mike":{
"BasicInfo":{
"Gender":{"T1":"Male"},
"Age":{"T1":"20", "T3":"21"}
},
"AddressInfo":{
"Province":{"T1":"GuangDong"},
"City":{"T1":"Guangzhou"}
}
},
"Amy":{
"BasicInfo":{
"Gender":{"T2":"Female"},
"Age":{"T2":"18"}
},
"AddressInfo":{
"Province":{"T2":"GuangDong"},
"City":{"T2":"Shenzhen"}
}
}
}
所以实际上,上述表在HBase中的逻辑表示如下,一个单元格包含数据的若干个版本,是【时间戳:值】的列表
综上,在HBase中,一个表就是一个高维、稀疏、有序的Map表。
关于HBase的基于列的列式存储,实际上说基于列族更合适——
- 在HBase中不同的列族存储在不同文件中,同一列族的数据在存储介质上连续
比如上面的表,在HBase中存储大致如下:
Mike - BasicInfo:Gender - T1:Male
Mike - BasicInfo:Age - T1:20
Mike - BasicInfo:Age - T3:21
Amy - BasicInfo:Gender - T2:Female
Amy - BasicInfo:Age - T2:18
Mike - AddressInfo:Province - T1:GuangDong
Mike - AddressInfo:City - T1:Guangzhou
Amy - AddressInfo:Province - T2:GuangDong
Amy - AddressInfo:City - T2:Shenzhen
3. HBase物理存储结构
对HBase的表,物理存储结构如下:
- 一个表由很多行Row组成,按照RowKey的字典序排列
- 在行的方向上,一个表会被划分为Region,即一个Region是若干行
- 一开始只有一个Region,当Region增大到一个阈值时,等分为两个Region
- Region是分布式存储的最小单元,即一个Region不会拆分到不同节点上
- Region由一个或多个Store组成,每个Store存储一个ColumnFamily
- Store由一个MemStore和若干个StoreFile组成
- StoreFile是HFile的轻量级封装,HFile就是实际的存储文件,存储着键值对(HFile内部结构可参考HBase基本概念与基本使用)
4. HBase系统架构
4.1 重要文件
HBase里有几个重要的文件,简单介绍如下:
- HLog,每次写操作都会在HLog中记录,当有节点宕机时可以恢复
- META表,记录所有的Region的元数据,即位置等信息,当Region数量很多时,META表也会分成多个Region
- ROOT表,记录META表所有Region的元数据,ROOT表始终只有一个Region,ROOT表的位置保存在zookeeper中,如下[4]:
4.2 架构
HBase的架构如下[4]:
Client
- 使用HBase RPC机制与HMaster和HRegionServer进行通信
HMaster
- 为HRegionServer分配Region
- 负责HRegionServer的负载均衡
- 当有HRegionServer失效或Region等分时,决定将Region分配到哪些节点
- GFS的垃圾回收
HRegionServer
- 维护Master分配的Region,处理对这些Region的IO请求
- 切分在运行过程中变得过大的Region
zookeeper
- (运行多个HMaster,)使用master选举机制保证有且只有一个HMaster
- 存储ROOT表的位置
- 实时监控HRegionServer的状态(HRegionServer将自己注册到zookeeper),将上线下线通知给HMaster
4.3 Region定位
在查询过程中,需要根据RowKey定位到Region的位置,具体定位方式如下:
- Client从zookeeper中获取ROOT表的位置
- Client查ROOT表,获取META表的位置(网络通信)
- Client查META表,找到RowKey所在Region的位置(网络通信)
- Client访问具体的Region,获取数据(网络通信)
如上,在没有缓存的情况下,需要三次网络通信。
实际上,访问ROOT表和META表时会进行缓存,查询时会先在缓存中寻找Region、META表或ROOT表。
当所有缓存都丢失/被覆盖时,需要6次网络通信,前三次用于发现三个缓存都丢失,后三次即为上述的三次。
关于HBase的读写细节,可以参考Hadoop相关知识整理系列之一:HBase基本架构及原理。
以上,对HBase表格的逻辑结构、表格的物理存储结构与HBase的系统架构做了简单介绍,主要是对HBase框架有一个整体的理解,更为细节的部分可以参考在下面的一些博客中。
Reference
- 《百度百科》- HBase
- 几张图看懂列式存储(转)
- 数据库为什么会分为“行式存储”和“列式存储”呢?
- Hadoop相关知识整理系列之一:HBase基本架构及原理
- HBase概念及表格设计
- HBase基本概念与基本使用
最后
以上就是搞怪云朵为你收集整理的Spark实战—— (2.1) HBase表格结构、物理存储结构与系统架构的全部内容,希望文章能够帮你解决Spark实战—— (2.1) HBase表格结构、物理存储结构与系统架构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复