Spark 2.x与1.x对比和分析

目前Spark最新版本已经到了2.4.1了。Spark 1.x中RDD是底层的API和内核,在Spark 2.x中主要是Dataframe/Dataset。本文对Spark 2.x与1.x进行对比和分析,首先明白Spark 2.x与1.x是一脉相承的关系,Spark 2.x是基于Spark 1.x进行了更多的功能和模块的扩展,以及底层性能的优化。Spark 1.x并不是被Spark 2.x淘汰了,对于Spark 1.x中大部分功能,Spark 2.x都保留了支持和延续,并没有淘汰。

下面对Spark 2.x中的每个组件都进行分析。

Spark Core(RDD)

从Spark诞生之日开始,RDD就是Spark最主要的编程接口,RDD,简单来说,就是一个不可变的分布式数据集,被分为多个partition从而在一个集群上分布式地存储。可以使用RDD提供的各种transformation和action算子,对RDD执行分布式的计算操作。

从Spark 2.0开始,包括Structured Streaming、Spark ML、Spark SQL底层都开始基于Dataframe/Dataset来作为基础计算引擎,但这并不意味着Spark Core/RDD被淘汰了。

Spark Core/RDD作为一种low-level的API有它的较为底层的应用场景,虽然后续这种场景会越来越少,Dataframe/Dataset API会逐渐替代原先Spark Core的一些场景,但是不可否认的是,这种场景还是存在的。此外,Dataframe/Dataset实际上底层也是基于Spark Core/RDD构建的。所以说,Spark Core/RDD是Spark生态中,不可替代的基础API和引擎,其他所有的组件几乎都是构建在它之上。未来它不会被淘汰,只是应用场景会减少而已。

如果我们需要对数据集进行非常底层的掌控和操作,比如说,手动管理RDD的分区,或者根据RDD的运行逻辑来结合各种参数和编程来进行较为底层的调优。我们完全可以在透彻阅读Spark Core源码的基础之上,对其进行troubleshooting和底层调优。

Spark 2.x中的Spark SQL,提供了标准化SQL的支持,以及子查询的支持,大幅度提升了Spark在SQL领域的应用场景。而且本身在大数据领域中,SQL就是一个最广泛使用的用户入口,主要就是因为SQL简单、易学、易用、直观。

Spark SQL(Dataframe/Dataset)

就像RDD一样,Dataframe也代表一个不可变的分布式数据集。与RDD不同的一点是,Dataframe引入了schema的概念,支持以复杂的类型作为元素类型,同时指定schema,比如Row。因此Dataframe更像是传统关系型数据库中的表的概念。在Spark 2.0中,Dataframe和Dataset合并了,Dataframe已经不是一个单独的概念了,目前仅仅只是Dataset[Row]的一个类型别名而已,可以理解为Dataframe就是Dataset。

Dataset API相比较而言,有更多的优点:

1、静态类型以及运行时的类型安全性

Dataframe/Dataset目前都是要求类型指定的(静态类型),因此在编译时就可以发现类型错误,并提供运行时的类型安全。Dataset是完全基于typed API来设计的,类型都是严格而且强类型的,如果使用了错误的类型,或者对不存在的列进行了操作,都能在编译时就发现。

2、将半结构化的数据转换为typed自定义类型

我们可以将半结构化的数据,转换为自定义的typed结构化强类型数据集。并基于此,得到之前说的编译时和运行时的类型安全保障。

3、API的易用性

Dataframe/Dataset引入了很多的high-level API,并提供了domain-specific language风格的编程接口。这样的话,大部分的计算操作,都可以通过Dataset的high-level API来完成。通过typed类型的Dataset,我们可以轻松地执行agg、select、sum、avg、map、filter、groupBy等操作。使用domain-specific language也能够轻松地实现很多计算操作,比如类似RDD算子风格的map()、filter()等。

Spark官方社区对RDD和Dataframe/Dataset的建议时,按照各自的特点,根据的需求场景,来灵活的选择最合适的引擎。在一个Spark应用中,也可以将两者结合起来一起使用。

Spark Streaming&Structured Streaming

Spark Streaming是Spark流式计算引擎,底层基于RDD计算引擎。除了类似RDD风格的计算API以外,也提供了更多的流式计算语义,比如window、updateStateByKey、transform等。同时对于流式计算中重要的数据一致性、容错性等也有一定的支持。

Spark 2.x中也推出了基于Dataframe/Dataset的Structured Streaming流式计算引擎。相较于Spark Streaming来说,其最大的不同之处在于,采用了全新的逻辑模型,提出了real-time incremental table的概念,更加统一了流式计算和离线计算的概念,与离线数据进行join的语义支持、内置的自动化容错机制、内置的自动化的一次且仅一次的强一致性语义、time-based processing、延迟数据达到的自动处理、与第三方外部存储进行整合的sink概念,等等高级特性。大幅度降低了流式计算应用的开发成本。

下面主要讲下Spark 2.x的一些特性:

统一Dataframe和Dataset API

从Spark 2.0开始,Dataframe就只是Dataset[Row]的一个别名,不再是一个单独的类了。无论是typed方法(map、filter、groupByKey等)还是untyped方法(select、groupBy等),都通过Dataset来提供。而且Dataset API将成为Spark的新一代流式计算框架——structured streaming的底层计算引擎。

SparkSession

SparkSession是新的Spark上下文以及入口,用于合并SQLContext和HiveContext,并替代它们。以前提供了SQLContext和HiveContext两种上下文入口,现在只需要使用一个统一的SparkSession即可。但是为了向后兼容性,SQLContext和HiveContext还是保留下来了。

新版本Accumulator API

Spark 2.0提供了新版本的Accumulator,提供了各种方便的方法,比如说直接通过一个方法的调用,就可以创建各种primitive data type(原始数据类型,int、long、double)的Accumulator。并且在spark web ui上也支持查看spark application的accumulator,性能也得到了提升。老的Accumulator API还保留着,主要是为了向后兼容性。

    原文作者:江户小宝
    原文地址: https://zhuanlan.zhihu.com/p/63322070
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞