大师兄

083 | 阿里巴巴的大数据故事:流计算引擎发展史

在阿里巴巴的发展过程中,流数据处理一直是业务中很重要的一部分。和数据分析平台不一样,阿里巴巴内部的流数据处理平台有很多套。

在阿里巴巴的流数据发展历程里,有两个著名的流引擎JStorm和Blink依然还在产生着深远的影响。这种影响并不仅仅在阿里巴巴集团的内部,并且扩散到了全球的开源世界。比起其他用于集团内部的流计算引擎,它们更被人所熟知,今天我们就来重点分析一下这两个流计算引擎的发展。

我们先来说说Storm和JStorm

Storm是被Twitter收购以后才开源出来的流计算引擎。阿里巴巴集团是在封仲淹带领的团队下才开始使用Storm的。

我在之前讲Storm的时候说过,这种流计算引擎是用一种比较小众的函数式编程语言Clojure开发出来的。国内的Clojure专家屈指可数,因此阿里巴巴使用Storm时遇到了很多的问题。

毕竟有些时候需要去增加或者改变一些功能,而这也就意味着需要对系统进行改进或者定制,但是Clojure语言十分小众,懂这种编程语言的人尚且不多,更不用说专业去修改了,所以,这些都决定了这种工作非常难以展开。

鉴于Storm十分难以改进和定制,又是当时开源世界里最成熟的流计算引擎。于是,从2012年开始,阿里巴巴决定用Java对Storm进行重写,这就是JStorm项目的由来。

按照封仲淹的观点来说,JStorm就是Storm二次开发的产物。它可以让用户无缝地从Storm迁移到JStorm。

阿里巴巴选择用Java进行开发,这让开发进度明显加快。而且,源于阿里巴巴的应用规模、对数据实时性等种种要求,团队对JStorm也进行了很多的优化。可以这么说,JStorm的出现,解决了Storm存在的很多问题。

2015年11月19日,阿里巴巴集团正式向Apache基金会捐赠了JStorm。JStorm成为了Apache Storm下面的一个子项目,并在Apache基金会里继续孵化。

那段时间,JStorm的作者们对于开源表现出非常大的积极性。封仲淹那时也表示,整个社区的Storm 2.0会基于阿里巴巴的JStorm,用Java语言进行开发。

然而世事无常,JStorm在Apache的孵化器里待了快两年,依然没有成为Apache基金会的顶级项目。而Storm2.0这个以阿里巴巴JStorm为主的开发项目更是连影子都没有见到。

对于此事,我非常好奇,但并不真正知晓其答案。只是有次听到一个Apache圈内人士聊到过,说阿里巴巴和Storm社区之间似乎有了矛盾。

再来说说Flink和Blink

Flink是德国柏林工业大学设计的一个流计算引擎,现在是Apache的顶级开源项目。Flink这个引擎从模型的角度来看是非常先进的,但是在工程实现上却相对薄弱一些。

Flink也被阿里巴巴集团用到了自己的生产环境中,项目的领导者是曾经在微软SQL Server组以及Facebook都待过的数据库专家蒋晓伟(花名“量仔”)。

他在接受采访时表示,在Spark和Flink这两个引擎中,Flink的设计理念更为先进一些,也更符合阿里巴巴对流计算引擎的要求,这恰恰也是他的团队选择这个引擎的原因。

当然,阿里巴巴集团并没有把Flink拿来直接使用,而是对Flink进行了大量的、全方位的改造,不仅提高了Flink的性能,而且改进了不少功能。这个项目在阿里巴巴内部叫作Blink,是阿里巴巴集团内部很多业务的流处理引擎,其重要地位可见一斑。

Blink目前还未开源,但在与社区的合作上,Blink团队和Flink的开发者之间保持了更为友好的关系。Flink的开发团队多次在公开场合感谢Blink团队对Flink项目的贡献,Blink团队也把很多功能都反馈到了Flink的代码库里。

为什么JStorm和Blink同为由阿里巴巴主导的,针对Apache已有项目改良的产物,却在和开源社区的互动以及对开源社区的影响方面有着不同的结果。我想,这其中大概有几方面的原因。

首先,Flink是后起之秀,又来自德国,还是从学校里出来的。在Flink流进市场的时候,北美的主要互联网企业要么已经使用了自研的流计算引擎,要么已经基于开源的流计算引擎开展了业务,不太可能短期内更新流计算引擎到Flink,所以Flink本身就需要大客户的支撑,阿里巴巴的出现恰逢其时。

其次是Flink团队和阿里巴巴团队的互补性比较强。前者理论基础好,但是没有工业界的开发经验,后者工业界开发经验却很足,这也就让双方的合作有了基础。

最后,也可能是最重要的一点就是,这还是一个面子问题。JStorm的做法是把Storm的整个代码库用另外一个语言完全重写了一遍,这无疑是一种比较得罪人的做法。而Blink在贡献回自己的代码时,是在Flink原有代码基础上改的,并且改动时也和Flink的人做了仔细协商。我想,也许就是这两种不同的合作态度,决定了两个项目的不同结果。

除了这两个流计算引擎以外,阿里巴巴内部还有其他一些流计算引擎(包括Max Compute组自己开发的,一个完全和开源社区无关的流计算引擎),但是这些引擎公开的消息很少,我就算是有心想研究它们,却也不知道从何下手了。

不过最新消息称,经过多年不同引擎之间的内部PK,阿里巴巴在2018年终于确定了:未来Blink会是阿里巴巴集团统一的流计算引擎。

JStorm和其他的流计算引擎上的业务都会慢慢迁移过来,最终整个公司的所有流计算引擎的开发和维护资源都会集中到Blink上。这也是阿里巴巴集团内部第一次有某种数据处理产品“一统江山”。

两个流计算引擎和开源社区的交流的不同结局告诉我们,和开源社区打交道,仅仅是提供自认为更加厉害的代码给开源社区是远远不够的。尤其是贡献代码的同时却没有给予社区主要贡献者足够的尊重,往往会让事情往坏的方向发展。和社区的合作需要大量持续的互动和交流,以及对社区主要贡献者的尊重。