1. 逻辑组成

tablet

tablet是kudu表的一个水平分区,类似于Hbase的region概念。每个tablet包含一个连续主键范围的记录,不同tablet的键范围不会有重叠,一个表的所有tablet就组成了这个表完整的键空间,充分利用kudu的分区功能,可以有效避免数据热点问题。

RowSet

每个tablet由若干个RowSet构成,一个RowSet由一组行数据组成,对于给定一个key的那一行记录,只会出现在一个RowSet里面(MenRowSet或DiskRowSet)。但是RowSet的键空间不是连续的,所以不同RowSet的键空间范围会有重叠,但键不会有重复。

mutation

对数据的插入、修改、删除统一叫做mutation

MemRowSet

MemRowSet是一个按主键排序的内存B-tree(一行数据对应这个B-tree的一个entry,即一个MRSRow实例),数据插入时都会先进入MemRowSet,然后数据就对查询可见了,而为了维持快照的一致性(可以理解为并发读写某行数据时候,可以读到自己正确的快照数据),那么就要求对每行数据的所有修改(叫做mutation)都需要保存下来,形成一个mutation链表,作为该行的redo log。当内存满后,MemRowSet会刷到磁盘中形成DiskRowSet,然后再创建新的MemRowSet。

DiskRowSet

MemRowSet刷到存盘形成DiskRowSet,而DiskRowSet真正存储为一系列的cfile;每个DiskRowSet中的每行记录都会对应一个"rowid" (DiskRowSet有点像数组,"rowid"对应一个数组下标且对使用者不可见),"rowid"与主键之间会有一个映射关系:

  1. 当主键为单列主键时,“rowid"其实就内置在存储主键列的cfile中,主键是排序存储的,所以每个主键默认对应着一个"rowid”,通过主键获得"rowid",然后再从其它cfile快速定位其它列,这个就是所谓的主键索引
  2. 当主键为复合主键时,会有一个单独的索引文件(index cfile)保存着编码后的复合主键,这样就可以像单主键提供一样的功能。

一行数据以列式格式储存到不同的cfile,读取一行完整记录时,虽然要扫描多个cfile,但是具有有相同的rowid,所以还是可以快速地获取到各个列的数据。

在逻辑上,每个DiskRowSet由三个部分组成,分别是:

Base data

MemRowSet刷到磁盘后形成的列式数据

UNDO records

可以对base data进行回滚到MemRowSet刷盘之前的历史记录

REDO records

数据刷新到磁盘后,对Base data所做的mutation集合 ,被应用于读取更新版本的数据

落盘后Base data和REDO delta进行的Major compation会生成新的Base data和新的UNDO records

DeltaMemStore

是一个内存并发BTree,节点的键由rowid与mutation时间戳组合而成,当在读取时,与MemRowSet中的mutation处理逻辑一样。当DeltaMemStore大小到一定程度会被刷到磁盘形成DeltaFile,然后重置自己为空。

DeltaFile

UNDO records 和 REDO records 存储为相同的文件格式,叫作DeltaFile,包含着一系列的mutation数据。

2. 读写过程

2.1 数据在MemRowSet中的读写

数据首次插入是会落到MemRowSet,随后的更新、删除、删除后重新插入这些操作会有一个链表按时间顺序把这些mutations保存起来,逻辑如下图:

每个mutation都会标记一个时间戳,用来用为MVCC的主要依据,当在tx时提交一个查询,

  1. 如果tx<tx1,表示tx1还没提交,会跳过该行数据
  2. 否则会把tx1时的行数据copy到scanner的缓冲区,然后遍历mutation链表,找到所有时间戳小于tx(表示发生在查询之前)的mutation与buffer中的行数据进行合并。

如果对单行更新得太频繁,那么每次在链表尾部插入mutation都是一个O(n)操作;另外读取数据的时候要遍历连接,这也会造成许多cpu缓存的丢失。

2.2 数据在DiskRowSet中的读写

2.2.1 更新过程:

数据刷新到磁盘后的修改删除操作不会再进MemRowSet,而是执行如下步骤:

  1. 根据主键结合元数据和布隆过滤器快速定位到行记录所在的DiskRowSet
  2. 寻找主键索引(index cfile)来确定行的rowid
  3. 然后mutation会进入DeltaMemStore,到时DeltaMemStore会刷到磁盘形成DeltaFile,所以DeltaMemStore和DeltaFile包含的内容相同,但是后者经过序列化压缩得更紧凑,这些DeltaFile被称作为REDO files,而里面的mutations被称作REDO records

HBase中采用了非原地更新的方式,将更新操作和删除操作转换成插入一条新数据的形式,虽然这样能够较快的实现更新与删除,但是将导致满足指定rowkey,列族、列名要求的数据有多个,并且可能分布在不同的storefile中。

2.2.2 读过程:
  1. 当想要在MemRowSet刷新之后立即读取最新版本的数据时,只需要扫描Base data即可
  2. 如果想对历史记录进行回溯查询,那么还是先读取base data,然后根据当前扫描器的时间戳会找到一系列的UNDO records与base data合并恢复历史的状态。
  3. 在数据落盘一段时间后,数据可能变更过,所以会产生DeltaFiles,这个时候的扫描除了读取base data之外,还需要将REDO records进行合并得到新版本的数据

3. RowSet内的Delta compaction

DeltaMemStore每次flush都会生成新的delta file,每次扫描都需要将delta文件与base data进行合并,读取性能会越来越差,所以kudu会有后台任务,负责将RowSet低效的物理储存布局转换为更高效的布局,这个过程叫做“delta compactions”,主要分为两种类型

3.1 Minor REDO delta compaction

不涉及base data,主要是为了减少delta文件数量

3.2 Major REDO delta compaction

除了可以减少delta文件数量之外,还能把REDO records转为UNDO records,因为major需要读取并重写base data,而base data一般比delta data大得多,所以major任务比minor任务消耗更大的性能。

因为两种compaction都是发生在RowSet内,而RowSet内维护着rowid,所以可以完全独立在后台运行,而不需要对compaction目标数据进行锁定,compaction后将结果与输入数据进行原子交换,再把compaction前的文件删除

4. RowSet之间的Merging compactions

随着tablet的数据增加,DiskRowSet也会逐渐累积起来,对下面几种情况会有性能影响:

  1. 随机访问(或根据主键更新),由于RowSet的键范围可能会有重叠,所以需要查询所有的RowSet键范围来确定指定的键可能存在哪些RowSet,通过bloom filter可以有效的过滤一些RowSet而减少物理扫描,但是额外对bloom filter的访问也会增加内存和cpu的消耗
  2. 范围扫描,这种情况下,有重叠键范围的RowSet都需要进行扫描,bloom filter不能像随机访问那样有效进行过滤。
  3. 排序扫描,从各个RowSet扫描到目标数据后,需要将各个RowSet的扫描结果进行汇总合并排序,RowSet越多,这个过程就会越耗性能。

kudu设计-tablet相关推荐

  1. kudu之Tablet Copy设计

    Master和Tablet Copy与配置更改集成 摘要 本文阐述了如何在Kudu的Raft实现的上下文中进行Tablet Copy.有关Kudu中Raft配置更改的详细信息,请参阅Raft配置更改设 ...

  2. KUDU(二)kudu架构设计

    文章目录 架构设计 原理 table与schema Kudu存储模型 RowSet组成: tablet发现过程 架构设计 kudu是典型的主从架构,主Master:管理集群,管理元数据 从:table ...

  3. kudu集群Tablet Server异常:Check failed: _s.ok() Bad status: Service unavailable: Cannot initialize clock

    背景: CDH 6.3.1集群上kudu实例Tablet Server异常无法启动.根据报错信息提示时钟同步问题无法启动Check failed: _s.ok() Bad status: Servic ...

  4. Kudu:为大数据快速分析量身定制的 Hadoop 存储系统

    Apache Hadoop提供了一系列数据存储与处理的组件,覆盖了多种多样.应用于企业级关键服务的用户案例.在Cloudera,我们一直在努力探索Hadoop的各种可能性,拓展Hadoop的边界--使 ...

  5. Kudu 原理、API使用、代码

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 大数据组件使用 总文章  Impala 操作/读写 Kudu, ...

  6. [Kudu基础]--Kudu+Impala介绍 | 微店数据科学团队博客

    感谢原文作者:https://juejin.im/entry/5a72d3d1f265da3e4d730b37 Kudu+Impala介绍 概述 Kudu和Impala均是Cloudera贡献给Apa ...

  7. 大数据存储技术之KUDU学习总结/快速入门

    KUDU学习总结 1 基础概念 官方:https://kudu.apache.org/ 在 KUDU 之前,大数据主要以两种方式存储: • 静态数据:以 HDFS 引擎作为存储引擎,适用于高吞吐量的离 ...

  8. 一文快速搞懂Kudu到底是什么

    文章目录 引言 文章传送门: Kudu 介绍 背景介绍 新的硬件设备 Kudu 是什么 Kudu 应用场景 Kudu 架构 数据模型 分区策略 列式存储 整体架构 Kudu Client 交互 Kud ...

  9. Kudu+Impala介绍

    概述 Kudu和Impala均是Cloudera贡献给Apache基金会的顶级项目.Kudu作为底层存储,在支持高并发低延迟kv查询的同时,还保持良好的Scan性能,该特性使得其理论上能够同时兼顾OL ...

  10. Kudu入门和API基础操作

    Kudu入门和API基础操作 文章目录 Kudu入门和API基础操作 为什么使用Kudu作为存储介质 1. Kudu介绍 1.1 背景介绍 1.2 新的硬件设备 1.3 Kudu是什么 1.4 Kud ...

最新文章

  1. [CTO札记]互联网一定要免费吗?网络文学是继网络游戏后又一成功的收费模式...
  2. win10中cmd如何编译和运行c/c++程序?
  3. JVM - 写了这么多年代码,你还不知道new对象背后的逻辑?
  4. MySQL 乐观锁与悲观锁
  5. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
  6. 对研发人员很有震撼和启发的公式
  7. 判断字符为空_49. 把字符串转换成整数(剑指offer)
  8. python怎么用gamma函数_如何通俗的理解伽马(gamma)函数
  9. EOS全球行南京站:降低用户及开发者门槛仍是2019 EOS关键词
  10. spark学习 Java版SparkSQL程序读取Hbase表注册成表SQL查询
  11. Asp.net控件开发学习笔记(二)-控件开发基础
  12. Sourse Insight使用过程中的常使用功能简介
  13. openssl ca文档翻译
  14. Redis数据结构之list对象
  15. css3 模拟fadein,CSS3 transition fadein with display:none
  16. QT美化使用字体图标
  17. graphs菜单_Graphs Made Easy-统计图绘制软件下载 v4.1.0.0 官方版 - 安下载
  18. 值得反复研读的表连接之CARTESIAN JOIN方式
  19. 手机游戏软件开发的前景 The future of development of game software on mobiles
  20. Java学习笔记---Lambda表达式及Stream流Api

热门文章

  1. linux代码折叠,Ubuntu中gedit中插件的安装之代码折叠插件
  2. 机房服务器维修合同,机房维护合同模板.doc
  3. excel表 公式失效_如何在没有公式的情况下创建Excel工作表的副本
  4. 数值分析的学科体系_清华大学 数值分析 视频教程
  5. 金山词霸2003/2005/2006词典丢失的解决方法
  6. 龙芯2f笔记本安装gentoo
  7. Python-Selenium自动化登陆QQ空间
  8. 嵌入式-----产品手册----塔吊黑匣子电气安装培训
  9. 【渝粤题库】广东开放大学 招投标与合同管理 形成性考核 (2)
  10. 04 高等数学专题——向量代数和空间解析几何