Kudu是为Apache Hadoop平台开发的列式存储管理器。Kudu共享Hadoop生态系统应用程序的共同技术属性:它运行在普通硬件上,水平可伸缩,并支持高可用性操作。

Kudu的设计让它与众不同。Kudu的一些好处包括:

  • OLAP(联机分析处理)工作负载的快速处理。
  • 与MapReduce、Spark等Hadoop生态系统组件集成。
  • 与Apache Impala的紧密集成,使其成为一个良好的、可变的替代方案,以使用Apache Parquet HDFS。
  • 强大但灵活的一致性模型,允许您在每个请求的基础上选择一致性要求,包括严格可序列化的一致性选项。
  • 同时运行顺序和随机工作负载的强大性能。
  • 易于管理和管理。
  • 高可用性。平板电脑服务器和主机使用Raft共识算法,该算法确保只要副本总数的一半以上可用,平板电脑就可以进行读写。例如,如果3个副本中有2个或5个副本中有3个可用,则tablet可用。
  • 读取可以由只读的跟随片提供服务,即使在leader片故障的情况下。
  • 结构化的数据模型。

通过组合所有这些属性,Kudu的目标是支持在当前一代Hadoop存储技术上难以或不可能实现的一系列应用程序。以下是一些应用程序的例子,Kudu是一个很好的解决方案:

  • 报告应用程序,其中新到达的数据需要立即为最终用户提供
  • 时间序列应用必须同时支持:
    • 跨大量历史数据的查询
    • 关于必须快速返回的单个实体的细粒度查询
  • 使用预测模型进行实时决策的应用程序,基于所有历史数据定期更新预测模型

有关这些场景和其他场景的更多信息,请参见示例用例

1.1、Kudu-Impala集成特性

创建/修改/删除表
Impala支持使用Kudu作为持久化层创建、修改和删除表。这些表遵循与Impala中的其他表相同的内部/外部方法,允许灵活的数据摄取和查询。

插入
数据可以插入到Impala中的Kudu表中,使用与其他任何Impala表相同的语法,就像那些使用HDFS或HBase进行持久化的表一样。

更新/删除
Impala支持UPDATE和DELETE SQL命令来逐行或批量修改Kudu表中的现有数据。选择SQL命令的语法是为了尽可能与现有标准兼容。除了简单的DELETE或UPDATE命令外,还可以在子查询中使用FROM子句指定复杂的连接。

灵活的分区
与Hive中的表分区类似,Kudu允许您通过散列或将范围动态地预拆分为预定义数量的片,以便在集群中均匀地分布写和查询。可以按任意数量的主键列、任意数量的散列和可选的分割行列表进行分区。看到模式设计。

平行扫描
为了在现代硬件上获得尽可能高的性能,Impala使用的Kudu客户端可以在多个平板电脑上并行扫描。

高效的查询
在可能的情况下,Impala将谓词计算下推到Kudu,以便谓词的计算尽可能接近数据。在许多工作负载下,查询性能与Parquet相当。

更多关于使用Impala查询存储在Kudu的数据的详细信息,请参考Impala文档。

1.2、概念和术语

列式数据存储
Kudu是一个列数据存储。列数据存储将数据存储在强类型的列中。通过适当的设计,它更适合分析或数据仓库工作负载,这有几个原因。

阅读效率
对于分析查询,您可以读取单个列或该列的一部分,而忽略其他列。这意味着您可以在读取磁盘上最小数量的块的同时完成查询。对于基于行的存储,您需要读取整个行,即使您只从几个列返回值。

数据压缩
因为给定列只包含一种类型的数据,所以基于模式的压缩比混合数据类型的压缩效率高几个数量级,混合数据类型用于基于行的解决方案。结合从列读取数据的效率,压缩允许您在完成查询的同时从磁盘读取更少的块。看到数据压缩

表格
表是数据存储在Kudu中的地方。一个表有一个模式和一个完全有序的主键。一个表被分成若干段,称为片剂。

tablet
tablet是表的连续段,类似于其他数据存储引擎或关系数据库中的分区。一个给定的平板电脑被复制到多个平板电脑服务器上,在任何给定的时间点,其中一个副本被认为是领先的平板电脑。任何副本都可以提供读操作,而写操作需要服务于平板电脑的一组平板电脑服务器达成一致。

tablet server
平板电脑服务器存储并向客户端提供平板电脑。对于给定的平板电脑,一个平板电脑服务器充当领导者,而其他服务器充当该平板电脑的追随者副本。只有leader服务写请求,而leader或follower服务读请求。领导人是通过Raft共识算法选出的。一个片剂服务器可以服务多个片剂,一个片剂可以服务多个片剂服务器。

主(master)
主服务器跟踪所有片板(tablets)、片板服务器(tablets server)、Catalog Table和其他与集群相关的元数据。在一个给定的时间点,只能有一个master(领导者)。如果当前的leader消失了,一个新的master会通过Raft Consensus算法被选出。

主服务器还为客户机协调元数据操作。例如,当创建一个新表时,客户端从内部将请求发送给主服务器。主服务器将新表的元数据写入编目表中,并协调在片剂服务器上创建片剂的过程。

所有主服务器的数据都存储在一个薄片中,可以复制到所有其他候选主服务器。

tablet server与主服务器之间的心跳间隔为设定的间隔(默认为每秒一次)。

raft 共识算法
Kudu使用Raft共识算法作为一种保证容错和一致性的手段,无论是对常规tablet还是对master data。通过Raft,一个片剂的多个副本选出一个leader, leader负责接收和复制写到follower副本。一旦写入被持久化到大多数副本中,它就会被客户端确认。一组N个副本(通常是3个或5个)能够接受最多(N - 1)/2个错误副本的写入。

目录表
目录表是Kudu元数据的中心位置。它存储关于表格和平板电脑的信息。不能直接读写编目表。相反,只能通过在客户端API中公开的元数据操作来访问它。

目录表存储两类元数据:


表模式、位置和状态

tablets
现有tablets的列表,其中的tablets服务器拥有每个tablets的副本、tablets的当前状态以及开始和结束键。

逻辑复制
Kudu复制的是操作,而不是磁盘数据。这称为逻辑复制,与物理复制相对。这有几个优点:

  • 尽管插入和更新确实通过网络传输数据,但删除不需要移动任何数据。删除操作被发送到每个平板服务器,它在本地执行删除操作。

  • 物理操作,比如压缩,不需要在Kudu中通过网络传输数据。这与使用HDFS的存储系统不同,在HDFS中,块需要通过网络传输,以满足所需的副本数量。

  • tablet不需要在同一时间或相同的时间表上执行压缩,或者在物理存储层上保持同步。这减少了所有平板服务器同时经历高延迟的机会,因为压缩或沉重的写负载。

1.3、体系结构概述

下图显示了一个具有三个主机和多个平板服务器的Kudu集群,每个服务器服务于多个平板。它说明了如何使用Raft共识来允许主服务器和平板服务器的领导者和追随者。此外,对于某些平板电脑来说,一台平板电脑服务器可能是领头羊,而对于其他平板电脑来说,它可能是追随者。领导用金色表示,追随者用蓝色表示。
image.png

1.4、示例用例

流输入与接近实时可用性
数据分析中一个常见的挑战是,新数据不断地快速到达,并且需要接近实时地读取、扫描和更新相同的数据。Kudu提供了快速插入和更新与高效柱状扫描的强大组合,从而在单个存储层上实现实时分析用例。

具有广泛不同访问模式的时间序列应用程序
时间序列模式是根据数据点发生的时间组织和输入数据点的模式。这对于在一段时间内调查指标的性能或试图基于过去的数据预测未来的行为很有用。例如,时间序列的客户数据既可以用于存储购买点击流历史记录,也可以用于预测未来的购买,或者用于客户支持代表。当这些不同类型的分析正在发生时,插入和突变也可能单独或批量地发生,并且可以立即读取工作负载。Kudu可以以可扩展和高效的方式同时处理所有这些访问模式。

出于以下几个原因,Kudu非常适合时间序列工作负载。通过使用Kudu对基于哈希的分区的支持,再加上它对复合行键的原生支持,可以很容易地在多个服务器上建立一个表,而不会出现在使用范围分区时经常出现的“热点定位”风险。Kudu的柱状存储引擎在此上下文中也很有用,因为许多时间序列工作负载只读取少数列,而不是整行。

在过去,您可能需要使用多个数据存储来处理不同的数据访问模式。这种做法增加了应用程序和操作的复杂性,并重复了数据,增加了(或更糟)所需的存储量。Kudu可以本地高效地处理所有这些访问模式,而不需要将工作转移到其他数据存储中。

预测建模
数据科学家经常从大量数据中开发预测学习模型。当学习发生或建模的情况发生变化时,可能需要经常更新或修改模型和数据。此外,科学家可能想改变模型中的一个或多个因素,看看随着时间的推移会发生什么。更新HDFS中存储在文件中的大量数据是资源密集型的,因为每个文件都需要完全重写。在《Kudu》中,更新几乎是实时发生的。科学家可以调整值,重新运行查询,并以秒或分钟刷新图表,而不是数小时或数天。此外,批处理或增量算法可以在任何时间跨数据运行,并获得接近实时的结果。

将Kudu中的数据与遗留系统相结合
公司从多个来源生成数据,并以各种系统和格式存储数据。例如,您的一些数据可能存储在Kudu中,一些存储在传统RDBMS中,一些存储在HDFS中的文件中。您可以使用Impala访问和查询所有这些源和格式,而不需要更改遗留系统。