摘要:Kudu
,Hdfs
,Hbase
Kudu简介
Kudu是由Cloudera开源的存储引擎
,可以同时提供低延迟的随机读写
和高效的批量数据分析
能力,他是一个融合Hdfs
和Hbase
功能的新组件,具备介于两者之间的新存储组件。
- Kudu是大数据存储引擎,可以结合其他框架进行大数据批量分析
- 结合了Hdfs的高吞吐数据能力和Hbase高随机读写能力
Kudu架构
Kudu使用单个Master
节点管理集群和元数据,使用任意数量的Table Server
节点来存储实际数据,可以部署多个Master节点来提高容错。
Kudu架构中分为Master Server
,Tablet Server
,Table
,Tablet
-
Master Server
: Kudu集群中的老大,可以有多个Master Server提高集群的容错能力
,但是只有一个
Master Server对外提供服务,负责管理集群和管理元数据
。 -
Tablet Server
: Kudu集群中的小弟,可以有任意多个
,负责存储数据
和数据读写
。在Tablet Server上存储Tablet
,对于一个Tablet,只有其中一个Table Server作为leader
,提供读写服务,其他Table Server都是follower
,只提供读服务。 -
Table
: Kudu中的表概念,有Schema
和Primary Key
概念,Kudu中的表会被水平方向
分为多个Tablet
片段存储在Tablet Server上。 -
Tablet
: 一个Tablet是一张表的一个连续片段
,tablet是表的水平分区,tablet之间的primary key范围不会重叠
,一张表的所有tablet片段构成了这张表的所有primary key范围。tablet会冗余存储
在多个Tablet Server上设置副本
,任何时刻只有一个Tablet Server是leader,其他都是follower。
数据模型
Kudu的设计是面向结构化存储
的,数据模型与传统的关系型数据库类似,一个 Kudu集群由多个表组成,每个表由多个字段组成,一个表必须指定一个由若干个(>=1)字段组成的主键,如下图:
- Kudu需要在建表时定义
Schema
信息,包括定义列(列类型)
和主键primary key
。 - Kudu的
数据唯一性
依赖与primary key的列组合 - Kudu不支持传统关系型数据库的
二级索引
- Kudu表中的每个字段是
强类型
的,而不是HBase那样所有字段都认为是 bytes。这样做的好处是可以对不同类型数据进行不同的编码。Kudu的数据类型包括BOOL
,INT8
,INT16
,INT32
,BIGINT
,INT64
,FLOAT
,DOUBLE
,STRING
,BINARY
底层数据模型
Kudu的底层存储基于table/tablet/replica视图级别的底层存储系统
- 每个table被划分为tablet,每个tablet包含一个
MetaData
和若干个RowSet
(行集合) - MetaData记录
元数据
,即记录该tablet属于哪个table,RowSet包含一个MemRowSet
和若干个DiskRowSet
- MemRowSet:当有
新数据
插入时写入MemRowSet,以及修改已经在MemRowSet中的数据,当MemRowSet写满或者超过一定时间后刷入磁盘形成若干个DiskRowSet,默认是1G或者120s - DiskRowSet:MemRowSet每刷新一次就会生成一个DiskRowSet,DiskRowSet刷下来之后就不在变化了,DiskRowSet中又包含
BloomFIle
,AdhoxIndex
,BaseData
,UndoFile
,RedoFile
,DeltaMem
- BloomFIle:根据一个DiskRowSet中的key生成
布隆过滤器
,用于快速模糊定位某个key是否在DiskRowSet中 - AdhoxIndex:如果key在DiskRowSet中定位key的具体偏移位置
- BaseData:MemRowSet刷如磁盘的数据,按列存储,按主键排序
- RedoFile:保存
更新后
的数据,防止事务成功后数据未在磁盘更新 - UbdoFile:保存
更新前
的数据,防止事务失败后恢复原始数据 - DeltaMem:用于DiskRowSet数据的
更新
,存储DiskRowSet中变更的数据,随着DiskRowSet的变化,DeltaMem记录变更记录,DeltaMem增长到一定程度刷到磁盘形成deltaData
数据分区策略
Kudu对表进行横向分区,Kudu表会被横向切分存储在多个tablets中。不过相比与其他存储引擎,Kudu提供了更加丰富灵活的数据分区策略。一般数据分区策略主要有两种,一种是Range Partitioning
,另一种分区策略是Hash Partitioning
。
-
Range Partitioning
: 按照字段值范围
进行分区,HBase 就采用了这种方式,优势是在数据进行批量读的时候,可以把大部分的读变成同一个 tablet 中的顺序读
,能够提升数据读取的吞吐量
。并且按照范围进行分区,我们可以很方便的进行分区扩展。其劣势是同一个范围内的数据写入都会落在单个 tablet 上
,写的压力大,速度慢
。 -
Hash Partitioning
: 按照字段的Hash值
进行分区,Cassandra采用了这个方式,由于是Hash分区,数据的写入会被均匀的分散到各个 tablet 中
,写入速度快
。但是对于顺序读的场景这一策略就不太适用了,因为数据分散,一次顺序读需要将各个 tablet 中的数据分别读取并组合,吞吐量低
。并且 Hash 分区无法应对分区扩展的情况。
Kudu支持用户对一个表指定一个范围分区
规则和多个 Hash 分区
规则
Kudu的读写更新流程
kudu写入流程.png- 先根据主键找到要访问的tablet,即根据key的
范围
过滤掉不可能存在的范围区间 - 在该范围下通过
布隆过滤器
再过滤掉不可能存在的rowset - 最后通过rowset中的
B-tree
精确定位key是否存在 - 如果存在则报错,否则插入
MemRowSet
kudu读取流程.png
- 先根据key范围找到tablet
- 在tablets下scan找到找到数据,在找到
delta store
修改数据,在合并上内存中未刷入磁盘的数据MenRowSet
kudu更新流程.png
- 跟写入数据一样,先找到key数据
- 找到数据后将修改内容写入
delta store
中
Kudu web ui
通过http访问Kudu web ui,http://master主机名:8051
点击Masters
看到只有一个master单节点,角色是leader,以及rpc地址
和http地址
,分别用来使用kudu和查看kudu
点击Tablet Server
看到有3个注册的tablet server,分布在三台机器,3个成功0个失败,点击进入可以到每个tablet server的页面
点击Tables
可以查看表的表名,状态,tablet数量,磁盘占用大小
点击某个表可以查看表的主键,数据类型,分区,impala建表语句
点击表.png
网友评论