Apache Hadoop提供了一系列数据存储与处理的组件,覆盖了多种多样、应用于企业级关键服务的用户案例。在Cloudera,我们一直在努力探索Hadoop的各种可能性,拓展Hadoop的边界——使得Hadoop更快、更好用、更安全。
自2012年,我们开启了一个关于Apache Hadoop存储系统的验证工作(避免Hadoop被约束在部分特定用户案例中)。验证过程中,我们发现了一些重要的发展趋势并最终决定去开发一个新型的存储系统,对HDFS与Apache HBase提供的功能进行补充。现在,我们非常自豪地推出Kudu,一个Hadoop生态系统上的新生开源组件。Kudu的目标是:
- 提供快速的全量数据分析与实时处理功能;
- 充分利用先进CPU与I/O资源;
- 支持数据更新;
- 简单、可扩展的数据模型
在这里,我们会对打造Kudu的动机、Kudu架构等给出简单的介绍。
功能上的空白
在很多Cloudera的客户环境中,我们发现了“混合架构 (hybrid architecture)”的趋势,即很多Hadoop工具会被同时部署。HBase主要被用于支撑数据导入,(及其)快速的小查询执行,更重要的是支持数据的随机修改。而HDFS与Impala组合的使用可以高效处理列式存储数据(例如Apache Parquet),在大规模数据集上提供高性能的分析型查询。
目前,大部分客户都被迫去打造一个混合式的架构,将多个工具集成在一起进行使用。客户首先选择一种存储系统导入、更新数据,但是后续为了最优化分析型报表的生成就得转向采用另一种存储系统。虽然我们的客户已经成功地部署、维护了这样的混合架构,但是我们相信,如果一个存储系统能够为多种不同类型的工作负载提供高性能的处理能力,那么对于那种需要使用混合架构才能解决的问题将是更加优雅的解决方案。
新的硬件
另一个我们在客户现场发现的趋势是硬件能力的不断加强。首先是内存的增长,从32GB到2012年的128GB到如今的256GB。然后是磁盘,现在在很多普通服务器中SSD的应用也是屡见不鲜。HBase、HDFS、以及其他的Hadoop工具通过调整、升级也在不断适应更新换代的硬件,但是这些系统在当初设计时集群的瓶颈在于底层磁盘的速度。最优化磁盘存储架构的设计对于现代架构(大量数据可以缓存在内存中,永久存储层数据的随机访问速度是原来的100多倍)就未必是最优的。
另外,随着存储层数据访问速度的不断增长,整个系统性能的瓶颈反而转向了CPU。当存储层越来越快,CPU效率变得愈发关键。
Kudu简介
为了应对先前发现的这些趋势,有两种不同的方式:持续更新现有的Hadoop工具或者重新设计开发一个新的组件。其目标是:
- 对数据扫描(scan)和随机访问(random access)同时具有高性能,简化用户复杂的混合架构;
- 高CPU效率,最大化先进处理器的效能;
- 高IO性能,充分利用先进永久存储介质;
- 支持数据的原地更新,避免额外的数据处理、数据移动
我们为了实现这些目标,首先在现有的开源项目上实现原型,但是最终我们得出结论:需要从架构层作出重大改变。而这些改变足以让我们重新开发一个全新的数据存储系统。于是3年前开始开发,直到如今我们终于可以分享多年来的努力成果:Kudu,一个新的数据存储系统。
Kudu设计
从用户的角度而言,Kudu是用于存储结构化数据的(tables)。表,具有一个定义明确的表结构(schema)包含一组预先定义的列。每个表具有一个主键(primary key),由一到多个列所组成。主键强加了数据唯一性的约束,同时也像索引一样可以加速数据的更新和删除。
Kudu表包含了一系列逻辑数据子集(Tablets),跟如同传统数据库系统的分区(Partition)。Kudu原生提供数据可用性支持,通过将Tablets复制到不同机器的方式(Raft consensus算法)处理硬件错误带来的数据不可访问问题。每个Tablets的大小一般在几十个GB左右,一个独立的服务器节点一般可以为10—100个Tablets提供服务。
Kudu采用master后台进程管理元数据(就像是目录catalog,描述数据的逻辑结构)、在硬件错误恢复时实现调度(coordinator)以及记录每个tablet服务器上tablets的状态等。Kudu使用多个master后台进程以提供管理节点的高可用性。Kudu实现了Raft Consensus算法,因此很多master进程的功能都可以通过Tablet服务器实现,在未来的发展路线图中,master的职责也会被分散到不同的机器上。另外,Kudu的master后台进程不会成为整个集群性能的瓶颈,根据在250节点集群的测试中,master后台进程完全没有性能的问题。
存储于Kudu的数据是可修改的(利用log-structured变种算法)。更新、插入、删除都是临时先缓冲于内存,随后合并进永久性列式存储中。Kudu为了保证查询延迟不出现大的波动,也会周期性地进行小型维护操作,比如compaction。
Kudu提供了C++、Java API支持点操作与批操作。Kudu的另一个目标是与现有的Hadoop生态系统工具进行集成。目前,Kudu的Beta版本已经与Impala、MapReduce以及Apache Spark实现了整合。随着时间的推移,我们计划将Kudu集成到整个Hadoop生态系统中。
更多Kudu架构细节,请查阅http://getkudu.io/kudu.pdf