Spark 最新的特性以及功能
2015 年中 Spark 版本从 1.2.1 升级到当前最新的 1.5.2,1.6.0 版本也马上要进行发布,每个版本都包含了许多的新特性以及重要的性能改进,我会按照时间顺序列举部分改进出来,希望大家对 Spark 版本的演化有一个稍微直观的认识。
由于篇幅关系,这次不能给大家一一讲解其中每一项改进,因此挑选了一些我认为比较重要的特性来给大家讲解。如有遗漏和错误,还请帮忙指正。
Spark 版本演化
首先还是先来看一下 Spark 对应版本的变化:
先来一个整体的介绍:1.2 版本主要集中于 Shuffle 优化, 1.3 版本主要的贡献是 DataFrame API, 1.4 版本引入 R API 并启动 Tungsten 项目阶段,1.5 版本完成了 Tungsten 项目的第一阶段,1.6 版本将会继续进行 Tungsten 项目的第二个阶段。而我下面则重点介绍 DataFrame API 以及 Tungsten 项目。
DataFrame 介绍
DataFrame API 是在 1.3.0 中引入的,其目的是为了统一 Spark 中对结构化数据的处理。在引入 DataFrame 之前,Spark 之有上针对结构化数据的 SQL 查询以及 Hive 查询。
这些查询的处理流程基本类似:查询串先需要经过解析器生成逻辑查询计划,然后经过优化器生成物理查询计划,最终被执行器调度执行。
而不同的查询引擎有不同的优化器和执行器实现,并且使用了不同的中间数据结构,这就导致很难将不同的引擎的优化合并到一起,新增一个查询语言也是非常艰难。
为了解决这个问题,Spark 对结构化数据表示进行了高层抽象,产生了 DataFrame API。简单来说 DataFrame 可以看做是带有 Schema 的 RDD(在1.3之前DataFrame 就叫做 SchemaRDD,受到 R 以及 Python 的启发改为 DataFrame这个名字)。
在 DataFrame 上可以应用一系列的表达式,最终生成一个树形的逻辑计划。这个逻辑计划将会经历 Analysis, Logical Optimization, Physical Planning 以及 Code Generation 阶段最终变成可执行的 RDD,如下图所示:
在上图中,除了最开始解析 SQL/HQL 查询串不一样之外,剩下的部分都是同一套执行流程,在这套流程上 Spark 实现了对上层 Spark SQL, Hive SQL, DataFrame 以及 R 语言的支持。
下面我们来看看这些语言的简单示例:Spark SQL : val count = sqlContext.sql("SELECT COUNT(*) FROM records").collect.head.getLong(0)
各个语言的使用方式都很类似。除了