7C00.ME/houmu 2014-12-11

读FlumeJava

最近读了 Google 的一篇 Paper:FlumeJava: easy, efficient data-parallel pipelines。FlumeJava 是 Google 内部使用的一个 Java 代码库,它在 Google 现有的 MapReduce 、BigTable 等计算设施基础之上实现了一个易用的 pipeline 系统。读过 FlumeJava 这篇文章之后,会有一种很强的既视感,这种感觉来源于Spark。

FlumeJava 和 Spark 由很强的相似性。两者应该不存在“相互借鉴”,二者诞生时间相差不多, 从 Paper 推测 FlumeJava 在2009年上半年在 Google 投入使用,到2010年 Paper 发表时已经用了将近一年的时间,而 Spark 是2009年成为 AMPLab 的一个研究项目,2010年3月开源(参考 Github Commit)。但它们在设计上却有多处不谋而合之处。

首先从抽象模型的角度来说,都是单一的对外接口。 FlumeJava 中对外接口集中于 PCollection 类(和 PTable 类,但后者其实也是 PCollection 的一个子类),这个类提供了 doParallel、groupByKey、flatten 等方法,方法调用的结果是返回PCollection类的实例,不同的实例由于上述方法的调用关系构成了一个有向无环图(DAG),从而实现了pipelines系统。Spark中对外接口集中于RDD这个类,它提供了 map、 filter、 groupByKey、 reduce 等方法,方法调用结果是返回一个RDD类的实例,不同的实例由于上述方法的调用关系构成了DAG。这种高度凝练和集中式API设计,使得用户在编程接口方面需要学习的内容骤减。

其次,FlumeJava中使用了 defered evaluation,而Spark中使用了 lazy computing 。 FlumeJava中 调用 doParallel 等方法,不会立即执行相关代码,而是在DAG构建完成后开始从DAG的一个“源点”开始依次执行相关代码。而Spark也是如此,在 Spark 中一般只有到 writeFile 类似方法被调用,才会真正执行之前定义的代码,如果 Spark 主程序里面没有类似 writeFile 的方法被调用,程序在启动以后很快结束,不会产生实际的计算结果。这种lazy computing的设计,都是从函数式编程里面借鉴过来的,它的一个好处是,FlumeJava、Spark等驱动程序有机会可以优化DAG图。实际也是如此,FlumeJava 的Paper中用了不少篇幅来介绍其优化器的设计方法,优化过程借鉴了 SQL 解释优化和编译原理的一些概念和方法, Spark 的 DAG 优化这方面我了解还不多。

FlumeJava 和 Spark 也有不同之处。FlumeJava 构建在 Google MapReduce 系统之上,担当的角色比较少。而 Spark 基本上是 Standalone 的,还要承担 计算引擎(MapReduce)、任务调度等工作,比 FlumeJava 功能要负责很多。另外,Spark 的一个创新点是内存计算,RDD除了简化抽象、统一接口之外,也是 Spark 基于 lineage 的容错机制的组成部分,在 FlumeJava 里面 PCollection 没有这些责任。

读完这篇 Paper 以后,我在想 如果当初 Google 把 FlumeJava 相关项目开源,现在的大数据计算领域可能会是另一番景象,至少 Spark 会有一个强劲的对手。当然,这中情况出现不太可能,因为 FlumeJava 的使用不能脱离 Google 内部的项目。其实,我一直感觉有一人本来可以更多地分享“大数据”这个万众瞩目的大舞台的灯光,他就是 微软 家的“树精(Dryad)”。Dryad 比 Spark 要早得多,比 Hadoop 也稍微早一点,它的设计比 Hadoop 要复杂,但可能更好(个人感觉),在当时那个环境下,Dryad 其实很有机会成为现在的 Hadoop,至少也能分得半壁。不过,就目前的情形来看,Dryad 错失了这个机会。Dryad 错失成为 “Hadoop” 有很多原因,在我看来,有两点是少不了的。首先是“开源”。Dryad 现在是开源的,但是开源的比较晚,不开源很难聚齐用户和开发者,这种现象越来越明显。以 C# 作为开发语言,对其也不利(随着.Net相关技术的开源,这种不利将消弱)。其次是“进取心”,Dryad 诞生在微软(硅谷?不确定)研究院,其学术研究水平在计算机的部分领域比绝大多数大学高,但可能存在一种问题,研究项目止步于研究室或者微软内部使用,没有想过更多的“可能性”,给人一种闭门造车的感觉。这与AMPLab(Spark)对比鲜明,Spark从作为学术项目诞生到开源用了不到一年时间,并且很快加入了Apache基金会,而后的发展过程中,积极与工业界合作,其contributor里面由相当一部分活跃开发者来自Intel等IT企业。

开源和社区,已然成为了趋势和机遇。