#????????????Kudu:Storage?for?Fast?Analytics?on?Fast?Data
##?Abstract
??kudu?是一个用于存储结构化数据的开源存储引擎,它支持低延迟的随机访问及高效的分析访问模式。kudu采用水平分区的方式对数据分布到集群中,使用Raft一致性协议复制每个分区,提供较低的平均恢复时间and?low?tail?latencies.?kudu在hadoop生态圈的背景下所设计的,它支持通过Cloudera?Impala,Apache?Spark,MapRedure等多种工具的访问模式。
##?1?Introduction
最近几年,所产生的数据爆炸式增长,一些开源技术在企业中快速地得到应用,这些技术具有存储大量的数据能力,同时具有低成本、可扩展性的特点。对于"big?data"工作负载,Hadoop生态系统已经成为了一个焦点,因为许多传统的数据库系统难以提供较好的可扩展性。
对于结构化的数据的存储,在hadoop生态圈中典型地通过两种方式实现:对于静态的数据集,数据通常使用以Apache?Avro或Apache?Parquet等二进制数据格式存储在HDFS上。然而,无论是HDFS还是这些格式都没有提供对单条记录的更新或者提供高效的随机访问的能力。对于易变的数据通常存储在Apache?HBase或Apache?Cassandra等半结构化存储引擎中。这些存储系统提供对记录进行低延迟的读写,但是对于基于SQL的分析或机器学习这些应用来说,这些存储引擎相较于静态文件格式而言并不能提供较好的顺序吞吐量。
静态数据在HDFS上提供的分析性能与HBase和Cassandra提供的行级高效随机访问能力之间存储一条鸿沟。如果在单个应用中同时需要这两种能力,那么开发者不得不开发非常复杂的架构。尤其是,对于许多Cloudera的客户have?deveplped?data?pipelines?which?involve?streaming?ingest?and?updates?in?HBase,随后将数据周期地导入到Parquet用于分析。这种架构具有如下缺点:
*?应用必须编写较复杂的代码去管理数据在两种系统中的流动及同步
*?操作者需要夸多个不同的系统管理一致性的备份,安全策略,监视。
*?The?resulting?architecture?may?exhibit?significant?lag?between?the?arrival?of?new?data?into?the?HBase?“staging?area”?and?the?time?when?the?new?data?is?available?for?analytics.
*?In?the?real?world,?systems?often?need?to?accomodate?latearriving?data,?corrections?on?past?records,?or?privacyrelated?deletions?on?data?that?has?already?been?migrated?to?the?immutable?store.?Achieving?this?may?involve?expensive?rewriting?and?swapping?of?partitions?and?manual?intervention.
kudu是一种新的存储引擎,它彻底填补了HDFS顺序访问的高吞吐与HBase或Cassandra低延时随机访问之间的鸿沟。然而这些已存在的系统能够继续在某些情形下拥有优势。kudu提供了一个?"happy?medium"的选择,可以让许多workloads的架构显著地简化。尤其,Kudu提供了简单的API,可以对行级数据进行insert,updates,delete,同时提供对表进行效地扫描,其吞吐量与Parquet相当。
??
这篇文章介绍了kudu的架构,第2部分站在用户的角度对系统进行了描述。介绍了数据模型,APIs及操作视图结构。第3部分描述了kudu的架构,包括数据的分区方式、数据在节点之间的复制、错误恢复及执行一般的操作。第4部分介绍kudu如何在磁盘上存储数据,并提供高效的随机访问和分析性能。第5部分讨论了kudu与Hadoop生态系统中的其它系统的集成。第6部分展示了在综合workloads上的初步性能结果。
?
##?2?Kudu?at?a?high?level
###?2.1?Tables?and?schemas
从用户的角度来说,kudu是一个用于存储结构化数据表的存储系统。一个kudu集群可以有多张tables,每个tables有一个定义好的schema,shchema由明确数量的列组成。每列有一个列名,类型(eg.INT32?or?STRING)及可选的非空属性。一些被排序的列子集作为tables的primary?key。primary?key要求具有唯一性。primary?key作为仅有的索引,通过索引可以对进行高效地讲更新和删除操作。kudu的数据模型非常类似于关系型数据库,但是不同于许多其它的分布式存储系统,比如Cassandra,MongoDB,Riak,BigTable等。
和关系型数据库一样,用户在创建table时必须定义表的schema。试图对未定义的列插入数据或者违背primary?key唯一性限制都将导致错误的结果。用户随时都可以通过*alter?table*?命令增加或删除列,但是primary?key不能被删除。
我们决定显示指定列的类型而不是使用NoSQL-style?“everythin?is?bytes",其原因主要有以下两点:
*?Explicit?types?allow?us?to?use?type-specific?columnar?encodings?such?as?bit-packing?for?integers.
*?Explicit?types?allow?us?to?expose?SQL-like?metadata?to?other?systems?such?as?commonly?used?business?intelligence?or?data?exploration?tools
与大多数关系型数据库不同的是:kudu当前并不支持二级索引,除primary?key外,其它列并没有提供唯一性限制。目前,kudu要求每个table有一个primary?key,当然我们期望将来的版本能够自动产生迭代的keys.
??
??