kudu架构

article/2025/9/25 9:50:03

课程链接: http://edu.51cto.com/course/15174.html

特点:

  High availability(高可用性)。Tablet server 和 Master 使用 Raft Consensus Algorithm 来保证节点的高可用,确保只要有一半以上的副本可用,该 tablet 便可用于读写。例如,如果3个副本中有2个或5个副本中的3个可用,则该tablet可用。即使在 leader tablet 出现故障的情况下,读取功能也可以通过 read-only(只读的)follower tablets 来进行服务,或者是leader宕掉的情况下,会根据raft机制重新选举leader。

基础概念:

开发语言:C++

Columnar Data Store(列式数据存储)

Read Efficiency(高效读取)

  对于分析查询,允许读取单个列或该列的一部分同时忽略其他列

Data Compression(数据压缩)

  由于给定的列只包含一种类型的数据,基于模式的压缩比压缩混合数据类型(在基于行的解决案中使用)时更有效几个数量级。结合从列读取数据的效率,压缩允许您在从磁盘读取更少的块时完成查询

Table(表)

  一张table是数据存储在 Kudu 的位置。表具有schema和全局有序的primary key(主键)。table被分成很多段,也就是称为tablets。

Tablet(段)

  一个tablet是一张table连续的segment,与其它数据存储引擎或关系型数据库的partition(分区)相似。给定的tablet冗余到多个tablet服务器上,并且在任何给定的时间点,其中一个副本被认为是leader tablet。任何副本都可以对读取进行服务,并且写入时需要在为tablet服务的一组tablet server之间达成一致性。
  一张表分成多个tablet,分布在不同的tablet server中,最大并行化操作
Tablet在Kudu中被切分为更小的单元,叫做RowSets,RowSets分为两种MemRowSets和DiskRowSet,MemRowSets每生成32M,就溢写到磁盘中,也就是DiskRowSet

Tablet Server

  一个tablet server存储tablet和为tablet向client提供服务。对于给定的tablet,一个tablet server充当 leader,其他tablet server充当该 tablet 的follower副本。只有leader服务写请求,然而leader或followers为每个服务提供读请求。leader使用Raft Consensus Algorithm来进行选举 。一个tablet server可以服务多个tablets,并且一个 tablet 可以被多个tablet servers服务着。

Master

  该master保持跟踪所有的tablets,tablet servers,Catalog Table 和其它与集群相关的metadata。在给定的时间点,只能有一个起作用的master(也就是 leader)。如果当前的 leader 消失,则选举出一个新的master,使用 Raft Consensus Algorithm来进行选举。
  master还协调客户端的metadata operations(元数据操作)。例如,当创建新表时,客户端内部将请求发送给master。 master将新表的元数据写入catalog table,并协调在tablet server上创建 tablet 的过程。
  所有master的数据都存储在一个 tablet 中,可以复制到所有其他候选的 master。
tablet server以设定的间隔向master发出心跳(默认值为每秒一次)。
master是以文件的形式存储在磁盘中,所以说,第一次初始化集群。需要设定好

Raft Consensus Algorithm

  Kudu 使用 Raft consensus algorithm 作为确保常规 tablet 和 master 数据的容错性和一致性的手段。通过 Raft,tablet 的多个副本选举出 leader,它负责接受以及复制到 follower 副本的写入。一旦写入的数据在大多数副本中持久化后,就会向客户确认。给定的一组 N 副本(通常为 3 或 5 个)能够接受最多(N - 1)/2 错误的副本的写入。

Catalog Table(目录表)

  catalog table是Kudu 的 metadata(元数据中)的中心位置。它存储有关tables和tablets的信息。该catalog table(目录表)可能不会被直接读取或写入。相反,它只能通过客户端 API中公开的元数据操作访问。catalog table 存储两类元数据。

Tables

  table schemas, locations, and states(表结构,位置和状态)

Tablets

  现有tablet 的列表,每个 tablet 的副本所在哪些tablet server,tablet的当前状态以及开始和结束的keys(键)。
在这里插入图片描述
参考:
http://blog.csdn.net/weixin_39478115/article/details/79267330
http://blog.csdn.net/weixin_39478115/article/details/78470269

注意:

  1、建表的时候要求所有的tserver节点都活着
  2、根据raft机制,允许(replication的副本数-)/ 2宕掉,集群还会正常运行,否则会报错找不到ip:7050(7050是rpc的通信端口号),需要注意一个问题,第一次运行的时候要保证集群处于正常状态下,也就是所有的服务都启动,如果运行过程中,允许(replication的副本数-)/ 2宕掉
  3、读操作,只要有一台活着的情况下,就可以运行


在这里插入图片描述
  上图显示了一个具有三个 master 和多个tablet server的Kudu集群,每个服务器都支持多个tablet。它说明了如何使用 Raft 共识来允许master和tablet server的leader和follow。此外,tablet server 可以成为某些 tablet 的 leader,也可以是其他 tablet follower。leader以金色显示,而 follower 则显示为蓝色。

测试:
7个tablet server
ssd硬盘,5分钟manul flush到kudu 1000万数据

总结:
  1、KUDU分区数必须预先预定
  2、在内存中对每个Tablet分区维护一个MemRowSet来管理最新更新的数据,默认是1G刷新一次或者是2分钟。后Flush到磁盘上形成DiskRowSet,多个DiskRowSet在适当的时候进行归并处理
  3、和HBase采用的LSM(LogStructured Merge,很难对数据进行特殊编码,所以处理效率不高)方案不同的是,Kudu对同一行的数据更新记录的合并工作,不是在查询的时候发生的(HBase会将多条更新记录先后Flush到不同的Storefile中,所以读取时需要扫描多个文件,比较rowkey,比较版本等,然后进行更新操作),而是在更新的时候进行,在Kudu中一行数据只会存在于一个DiskRowSet中,避免读操作时的比较合并工作。那Kudu是怎么做到的呢? 对于列式存储的数据文件,要原地变更一行数据是很困难的,所以在Kudu中,对于Flush到磁盘上的DiskRowSet(DRS)数据,实际上是分两种形式存在的,一种是Base的数据,按列式存储格式存在,一旦生成,就不再修改,另一种是Delta文件,存储Base数据中有变更的数据,一个Base文件可以对应多个Delta文件,这种方式意味着,插入数据时相比HBase,需要额外走一次检索流程来判定对应主键的数据是否已经存在。因此,Kudu是牺牲了写性能来换取读取性能的提升。
更新、删除操作需要记录到特殊的数据结构里,保存在内存中的DeltaMemStore或磁盘上的DeltaFIle里面。DeltaMemStore是B-Tree实现的,因此速度快,而且可修改。磁盘上的DeltaFIle是二进制的列式的块,和base数据一样都是不可修改的。因此当数据频繁删改的时候,磁盘上会有大量的DeltaFiles文件,Kudu借鉴了Hbase的方式,会定期对这些文件进行合并。
在这里插入图片描述
  4、既然存在Delta数据,也就意味着数据查询时需要同时检索Base文件和Delta文件,这看起来和HBase的方案似乎又走到一起去了,不同的地方在于,Kudu的Delta文件与Base文件不同,不是按Key排序的,而是按被更新的行在Base文件中的位移来检索的,号称这样做,在定位Delta内容的时候,不需要进行字符串比较工作,因此能大大加快定位速度,但是无论如何,Delta文件的存在对检索速度的影响巨大。因此Delta文件的数量会需要控制,需要及时的和Base数据进行合并。由于Base文件是列式存储的,所以Delta文件合并时,可以有选择性的进行,比如只把变化频繁的列进行合并,变化很少的列保留在Delta文件中暂不合并,这样做也能减少不必要的IO开销。
5、除了Delta文件合并,DRS自身也会需要合并,为了保障检索延迟的可预测性(这一点是HBase的痛点之一,比如分区发生Major Compaction时,读写性能会受到很大影响),Kudu的compaction策略和HBase相比,有很大不同,kudu的DRS数据文件的compaction,本质上不是为了减少文件数量,实际上Kudu DRS默认是以32MB为单位进行拆分的,DRS的compaction并不减少文件数量,而是对内容进行排序重组,减少不同DRS之间key的overlap(重复),进而在检索的时候减少需要参与检索的DRS的数量。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/AKDbDsZB.shtml

相关文章

Apache Kudu

前言    在Kudu出现前,由于传统存储系统的局限性,对于数据的快速输入和分析还没有一个完美的解决方案,要么以缓慢的数据输入为代价实现快速分析,要么以缓慢的分析为代价实现数据快速输入。随着快速输入和分析场景越来越多&…

Kudu的介绍及使用

前文: 过往采用Hive的离线处理时效性低,计算任务过于集中,查询效率低。SparkStreamingHive的数据清洗线使得多套数据流过于复杂。未来的数据仓库场景越来越趋向于实时数仓。 一、引入 二、架构图 2、架构及数据量 3、文件结构 4、目录结构 5…

Kudu简单使用

环境版本:CDH 6.3.2 | Impala 3.2.0 | Hive 2.1.1 | Hue 4.2.0 | kudu 1.10.0 # 创建kudu表,需指定主键、分区 CREATE TABLE kudu_table (id BIGINT,name STRING,PRIMARY KEY(id) ) PARTITION BY HASH PARTITIONS 16 STORED AS KUDU;# 创建impala外部表映…

Kurento

java相关代码:https://codeload.github.com/Kurento/kurento-tutorial-java/zip/refs/heads/master node相关代码:https://github.com/Kurento/kurento-tutorial-node WebRTC之Kurento:直播、视频通话、视频会议我都行! 前言 前段时间做rtsp无插件网页…

kudu介绍

kudu介绍 Kudu是运行在hadoop平台上的列式存储系统,拥有Hadoop生态系统应用的常见技术特性,运行在一般的商用硬件上,支持水平扩展,高可用。 kudu的优势 1)一个table由多个tablet组成,对分区查看、扩容和数据高可用支持非常好 2…

KUDU 介绍

前言 近两年,KUDU 在大数据平台的应用越来越广泛。在阿里、小米、网易等公司的大数据架构中,KUDU 都有着不可替代的地位。本文通过分析 KUDU 的设计, 试图解释为什么 KUDU 会被广泛应用于大数据领域,因为还没有研究过 KUDU 的代码…

KUDU(一)kudu概述

文章目录 概述使用场景对比其他存储Kudu基本架构Kudu中的相关概念和机制 概述 Kudu是一个分布式列式存储引擎/系统,由Cloudera开源后捐献给Apache基金会很快成为顶级项目。用于对大规模数据快速读写的同时进行快速分析 官网 https://kudu.apache.org/ Kudu运行在…

Kudu概述

Kudu是一个分布式的,具有可扩展性的列式存储管理器,可以对快速变化的数据进行快速分析。 使用场景 近实时计算场景时间序列数据的场景预测建模与存量数据共存既有随机读写/访问,又有批量扫描分析的场景(OLAP)HTAP混合事务分析处理场景Kudu作为持久层与Impala紧密集成的…

Kudo介绍 + Spark\Python\Scala开发Kudu应用程序

前半部分文章摘自:http://blog.csdn.net/a1043498776/article/details/72681890 Kudu的背景 Hadoop中有很多组件,为了实现复杂的功能通常都是使用混合架构, Hbase:实现快速插入和修改,对大量的小规模查询也很迅速HDF…

adb remount 挂载失败

打开cmd ,输入adb remount 挂载设备的时候失败,提示如下: 按照提示,输入adb root 再输入adb remount ,成功。

adb remount overlayfs的说明

在android R项目中执行adb remount的时候,能看到"Using overlayfs for xxx"的打印,类似如下: #adb root restarting adbd as root#adb remount Disabling verity for /system Using overlayfs for /system Disabling verity for /…

[高通SDM450][Android9.0]adb无法进行remount的解决方案

文章目录 开发平台基本信息问题描述解决方法 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 在调试开发的时候,执行remount可以获得更高的权限,对系统的一些应用或者文件进行删除或替换,达到快速调试的目的&…

adb remount

使用adb remount失败了,提示 如下图。 解决方法 先执行 adb root 然后 ctrlc, 然后再adb remount就成功了

Android 11 无法remount问题

问题描述: 在Android 11开发的时候,想快速调试把单独编译好的模块push 到 /system 目录下,结果发现remount failed C:>adb root restarting adbd as rootC:>adb remount Skipping /system for remount Skipping /vendor for remount S…

Android P(9.0) userdebug 版本执行adb remount失败

当你执行 adb remount 时会发现提示 remount of the / superblock failed: Permission denied remount failed 原因是android P 版本后 google 启用 avb(Android Verified Boot)2.0,verified boot and DM-verity默认启用策略发生了变化。详情如下: DM-V…

remount

1. 需要获取手机的root权限,方法很多了,我用的是360一键Root,有时也用百度一键Root 2. 从其他手机拷贝sqlite3文件到PC,我是从模拟器copy出来的,为方便大家,附件就有,可以直接下载哈 3. 进入手机…

Typescript之接口(Interface)

我们可以通过Interface关键字来定义限制数据的类型。 1.给对象定义类型 /*** 定义一种类型,名称叫做PersonInfo,里面有三个属性* name 人物的名字,类型为string* age 人物的年龄,类型为number* say 人物的方法,类型为函数类型&a…

astype

anp.array([1.1,1.2]) print(a数据类型:,a.dtype) print(astype修改数据类型:,a.astype(float).dtype) print(原数据类型未改变,a.dtype)#正确操作 aa.astype(float32) print(修改类型后再次操作,类型改变:,a.dtype) ba.astype(in…

TypeScript中的interface和type区别

💂 个人网站: 【紫陌】【笔记分享网】 💅 想寻找共同学习交流、共同成长的伙伴, 请点击【前端学习交流群】 在 TypeScript中,type 和 interface有些相似,都可以给类型命名并通过该名字来引用表示的类型。不过它们之间使…

TypeScript接口——interface

目录 一、接口概述: 二、接口类型介绍: 1、属性接口: 2、 函数接口: 3、可索引接口: (1)可索引接口约束数组示例: (2) 可索引接口约束对象示例&#xf…