美文网首页大数据学习
Kudu:Apache Kudu 简介和架构

Kudu:Apache Kudu 简介和架构

作者: xiaogp | 来源:发表于2020-12-12 20:51 被阅读0次

    摘要:KuduHdfsHbase

    Kudu简介

    Kudu是由Cloudera开源的存储引擎,可以同时提供低延迟的随机读写和高效的批量数据分析能力,他是一个融合HdfsHbase功能的新组件,具备介于两者之间的新存储组件。

    Kudu和Hbase Hdfs对比.png
    • Kudu是大数据存储引擎,可以结合其他框架进行大数据批量分析
    • 结合了Hdfs的高吞吐数据能力和Hbase高随机读写能力

    Kudu架构

    Kudu使用单个Master节点管理集群和元数据,使用任意数量的Table Server节点来存储实际数据,可以部署多个Master节点来提高容错。
    Kudu架构中分为Master ServerTablet ServerTableTablet

    Kudu架构.png
    • Master Server: Kudu集群中的老大,可以有多个Master Server提高集群的容错能力,但是只有一个Master Server对外提供服务,负责管理集群和管理元数据
    • Tablet Server: Kudu集群中的小弟,可以有任意多个,负责存储数据数据读写。在Tablet Server上存储Tablet,对于一个Tablet,只有其中一个Table Server作为leader,提供读写服务,其他Table Server都是follower,只提供读服务。
    • Table: Kudu中的表概念,有SchemaPrimary Key概念,Kudu中的表会被水平方向分为多个Tablet片段存储在Tablet Server上。
    • Tablet: 一个Tablet是一张表的一个连续片段,tablet是表的水平分区,tablet之间的primary key范围不会重叠,一张表的所有tablet片段构成了这张表的所有primary key范围。tablet会冗余存储在多个Tablet Server上设置副本,任何时刻只有一个Tablet Server是leader,其他都是follower。

    数据模型

    Kudu的设计是面向结构化存储的,数据模型与传统的关系型数据库类似,一个 Kudu集群由多个表组成,每个表由多个字段组成,一个表必须指定一个由若干个(>=1)字段组成的主键,如下图:

    数据模型.png
    • 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视图级别的底层存储系统

    kudu底层存储.png
    • 每个table被划分为tablet,每个tablet包含一个MetaData和若干个RowSet(行集合)
    • MetaData记录元数据,即记录该tablet属于哪个table,RowSet包含一个MemRowSet和若干个DiskRowSet
    • MemRowSet:当有新数据插入时写入MemRowSet,以及修改已经在MemRowSet中的数据,当MemRowSet写满或者超过一定时间后刷入磁盘形成若干个DiskRowSet,默认是1G或者120s
    • DiskRowSet:MemRowSet每刷新一次就会生成一个DiskRowSet,DiskRowSet刷下来之后就不在变化了,DiskRowSet中又包含BloomFIleAdhoxIndexBaseDataUndoFileRedoFileDeltaMem
    • 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分区.png

    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

    master主页.png

    点击Masters看到只有一个master单节点,角色是leader,以及rpc地址http地址,分别用来使用kudu和查看kudu

    点击master.png

    点击Tablet Server看到有3个注册的tablet server,分布在三台机器,3个成功0个失败,点击进入可以到每个tablet server的页面

    点击tablet server.png

    点击Tables可以查看表的表名,状态,tablet数量,磁盘占用大小

    点击tables.png

    点击某个表可以查看表的主键,数据类型,分区,impala建表语句


    点击表.png

    相关文章

      网友评论

        本文标题:Kudu:Apache Kudu 简介和架构

        本文链接:https://www.haomeiwen.com/subject/pmfygktx.html