前言
在 MapReduce 流行这些年之后,针对大数据集的分布式批处理执行引擎已经逐渐成熟。到现在(2017年)已经有比较成熟的基础设施可以在上千台机器上处理 PB 量级的数据。因此,针对这个量级的基本数据处理问题可以认为已经被解决,大家的注意力开始转到其他问题上:
-
完善编程模型
-
提升处理性能
-
扩大处理领域
之前我们讨论过,由于 MapReduce 提供的编程接口实在太过难用,像 Hive, Pig,Cascading 和 Crunch 等处理 API 和框架逐渐流行。Apache Tez 更进一步,可以让原来的代码不做过多改动就可以迁移。Spark 和 Flink 也各自有其高层的数据流 API,基本借鉴自 FlumeJava。
这些数据流工具基本都是用关系型的算子来表达计算过程:
-
基于某些字段对数据集进行连接的 Join 算子
-
基于关键字对元组进行聚类的 Group 算子
-
基于条件对元组进行过滤的 Filter 算子
-
对元素进行聚合和统计的 Aggregate 算子
等等。这些算子内部实现时,会用到我们本章之前提到的各种 join 和 group 算法。
除了能够显著降低使用方的代码量外,这些高层的框架通常还支持交互式的使用。因此,你可以在 shell 中增量式的构建分析代码,且能够方便的多次跑以查看运行结果。当我们拿到一个新的数据集,需要做实验探索该如何对其进行分析时,这种交互式的方式非常方便。这其实也是我们之前讨论过的 Unix 编程哲学的一个体现。
这些高层的 API 不仅让用户可以更高效的使用体验,还能够提升任务在物理层面的执行效率。
向声明式方向靠拢
相比直接实现代码进行 Join,使用关系型的 Join