一问读懂Apache Kudu

前言
Apache Kudu是由Cloudera开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力 。Kudu支持水平扩展,使用Raft协议进行一致性保证,并且与Cloudera Impala和Apache Spark等当前流行的大数据查询和分析工具结合紧密 。本文将为您介绍Kudu的一些基本概念和架构以及在企业中的应用,使您对Kudu有一个较为全面的了解 。
一、为什么需要Kudu
Kudu这个名字听起来可能有些奇怪,实际上,Kudu是一种非洲的大羚羊,中文名叫“捻角羚”,就是下图这个样子:

一问读懂Apache Kudu

文章插图
 
捻角羚,图片来源见水印
比较有意思的是,同为Cloudera公司开源的另一款产品Impala,是另一种非洲的羚羊,叫做“黑斑羚”,也叫“高角羚” 。不知道Cloudera公司为什么这么喜欢羚羊,也许是因为羚羊的速度快吧 。
言归正传,现在提起大数据存储,我们能想到的技术有很多,比如HDFS,以及在HDFS上的列式存储技术Apache Parquet,Apache ORC,还有以KV形式存储半结构化数据的Apache HBase和Apache Cassandra等等 。既然有了如此多的存储技术,Cloudera公司为什么要开发出一款全新的存储引擎Kudu呢?
事实上,当前的这些存储技术都存在着一定的局限性 。对于会被用来进行分析的静态数据集来说,使用Parquet或者ORC存储是一种明智的选择 。但是目前的列式存储技术都不能更新数据,而且随机读写性能感人 。而可以进行高效随机读写的HBase、Cassandra等数据库,却并不适用于基于SQL的数据分析方向 。所以现在的企业中,经常会存储两套数据分别用于实时读写与数据分析,先将数据写入HBase中,再定期通过ETL到Parquet进行数据同步 。但是这样做有很多缺点:
  1. 用户需要在两套系统间编写和维护复杂的ETL逻辑 。
  2. 时效性较差 。因为ETL通常是一个小时、几个小时甚至是一天一次,那么可供分析的数据就需要一个小时至一天的时间后才进入到可用状态,也就是说从数据到达到可被分析之间是会存在一个较为明显的“空档期”的 。
  3. 更新需求难以满足 。在实际情况中可能会有一些对已经写入的数据的更新需求,这种情况往往需要对历史数据进行更新,而对Parquet这种静态数据集的更新操作,代价是非常昂贵的 。
  4. 存储资源浪费 。两套存储系统意味着占用的磁盘资源翻倍了,造成了成本的提升 。
我们知道,基于HDFS的存储技术,比如Parquet,具有高吞吐量连续读取数据的能力;而HBase和Cassandra等技术适用于低延迟的随机读写场景,那么有没有一种技术可以同时具备这两种优点呢?Kudu提供了一种“hAppy medium”的选择:
一问读懂Apache Kudu

文章插图
 
kudu的定位
Kudu不但提供了行级的插入、更新、删除API,同时也提供了接近Parquet性能的批量扫描操作 。使用同一份存储,既可以进行随机读写,也可以满足数据分析的要求 。
二、Kudu总览
Tables和Schemas
从用户角度来看,Kudu是一种存储结构化数据表的存储系统 。在一个Kudu集群中可以定义任意数量的table,每个table都需要预先定义好schema 。每个table的列数是确定的,每一列都需要有名字和类型,每个表中可以把其中一列或多列定义为主键 。这么看来,Kudu更像关系型数据库,而不是像HBase、Cassandra和MongoDB这些NoSQL数据库 。不过Kudu目前还不能像关系型数据一样支持二级索引 。
Kudu使用确定的列类型,而不是类似于NoSQL的“everything is byte” 。这可以带来两点好处:
  1. 确定的列类型使Kudu可以进行类型特有的编码 。
  2. 可以提供 SQL-like 元数据给其他上层查询工具,比如BI工具 。
读写操作
用户可以使用 Insert,Update和Delete API对表进行写操作 。不论使用哪种API,都必须指定主键 。但批量的删除和更新操作需要依赖更高层次的组件(比如Impala、Spark) 。Kudu目前还不支持多行事务 。
而在读操作方面,Kudu只提供了Scan操作来获取数据 。用户可以通过指定过滤条件来获取自己想要读取的数据,但目前只提供了两种类型的过滤条件:主键范围和列值与常数的比较 。由于Kudu在硬盘中的数据采用列式存储,所以只扫描需要的列将极大地提高读取性能 。
一致性模型
Kudu为用户提供了两种一致性模型 。默认的一致性模型是snapshot consistency 。这种一致性模型保证用户每次读取出来的都是一个可用的快照,但这种一致性模型只能保证单个client可以看到最新的数据,但不能保证多个client每次取出的都是最新的数据 。另一种一致性模型external consistency可以在多个client之间保证每次取到的都是最新数据,但是Kudu没有提供默认的实现,需要用户做一些额外工作 。


推荐阅读