Apache Kudu是Cloudera开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力。
Kudu支持水平扩展,使用Raft协议进行一致性保证,并且与Cloudera Impala和Apache Spark等大数据查询和分析工具结合紧密。
同类产品
Apache Parquet或Apache ORC可以用来分析静态数据集,但它们不能更新数据,而且随机读写性能不足
Apache HBase、Apache Cassandra可以进行高效的随机读写,但并不适用于基于SQL的数据分析方向。
现在企业通常会存储两套数据分别进行实时读写与数据分析,比如先将数据写入HBase,然后在定期通过ETL导入到Parquet进行数据同步。但是这样做存在问题:
用户需要在两套系统之间编写并维护ETL逻辑
时效性差:ETL同步时间使数据存在“空档期”
在实际情况中,往往需要对历史数据进行更新,此时Parquet缺陷显露
存储资源浪费
Kudu不但提供行级的插入、更新、删除API,同时提供接近Parquet性能的批量扫描操作。
Kudu使用同一份存储,既可以进行随机读写,也可以满足数据分析的需求。
Tables与Schemas
Kudu是存储结构化数据表的存储系统,在一个kudu集群中可以定义任意数量的table,每个table都需要预先定义schema。
Kudu目前还不能像关系数据库一样支持二级索引。
读写操作
用户可以使用insert,update,delete api对表进行读写,但无论哪种api,都需要指定主键。
如果需要批量删除和更新操作,则需要依赖更高层次的组件(如Impala、Spark)
Kudu目前不支持多行事务。
在读操作方面,Kudu只提供Scan操作获取数据,可以指定过滤条件获取想要读取的数据。
目前只提供两种类型的过滤条件:主键范围,列值与常数的比较。
Kudu在硬盘中数据采用列式存储,所以只扫描需要的列可以提高读取性能。
一致性模型
Kudu为用户提供两种一致性模型,默认是snapshot consistency
一致性模型保证用户每次读取出来的都是一个可用的快照,但它只能保证单个client可以看到最新的数据,而不能保证多个client每次取出的都是最新的数据。
另一种一致性模型external consistency,可以在多个client之间保证每次取到的都是最新数据,但kudu没有提供默认实现。