Spark2.0啥时候使用rdd?

Posted

技术标签:

【中文标题】Spark2.0啥时候使用rdd?【英文标题】:When to use rdd in Spark2.0?Spark2.0什么时候使用rdd? 【发布时间】:2017-09-06 16:39:49 【问题描述】:

使用新的 SparkSQL API,我们似乎不再需要 RDD。由于RDD很昂贵,看来我们应该避免它。有人可以解释什么时候在 Spark2 中使用 RDD 的好时机?

【问题讨论】:

有关自定义分区的更多信息,请参阅下面的链接。 ***.com/questions/47116294/… 【参考方案1】:

看来我们不再需要RDD了

RDD API 更通用,事实上 SQL API 是建立在 RDD API 之上并带有一堆扩展。

由于RDD很昂贵,看来我们应该避免它。

RDD API 本身并不昂贵。它只是没有提供与 SQL API 相同的优化。您仍然可以在 RDD 之上构建高性能应用程序(例如 org.apache.spark.ml)。

谁能解释一下什么时候在 Spark2 中使用 RDD 比较合适?

它是基于意见的,但如果您需要端到端的类型安全或大量使用没有内置编码器的类型,RDD API 是一个自然的选择。

当执行顺序很重要时(您可以使用 SQL 创建自己的规划器规则,但要付出更多努力)或需要低级别控制(如用户定义的 Partitioners),您可能更喜欢 RDD。

【讨论】:

RDD 优于 Datasets/DataFrames 的一个关键领域是迭代算法,就像您在讨论 spark ML 包时巧妙地提到的那样。尽管 Spark ML(不是原始的 RDD MLLib)API 引用数据集,但在幕后他们倾向于使用 RDD,然后在最后转换回数据集。 Catalyst 优化器没有并行化,因此优化迭代算法是不切实际的。 @Garren 你能详细说明一下吗,可以举个例子吗?我虽然迭代算法基本上是当你计算一些东西然后把它放在缓存中并多次访问该数据,而不是仅仅转换一次并写入结果。那么,为什么使用 Dataset 计算要放入缓存中的内容会降低性能呢? @MaxNevermind 想想梯度下降、梯度提升、LDA、KMeans 或几乎任何图形算法。关于最后一个,您可以使用图框进行比较。 虽然“基于 RDD 的 API 预计将在 Spark 3.0 中被删除。” spark.apache.org/docs/2.3.0/ml-guide.html【参考方案2】:

TLDR:只有在需要对数据的物理分布进行细粒度控制时,才应使用 RDD。

这可能与 Spark 2.0 无关,但可能与 Spark 2.2 及更高版本有关。我在Spark: The Definitive Guide 中发现了这一点,我发现本书的这一部分有助于决定是否使用 RDD:

现代 Spark 中基本上没有实例,你应该 使用 RDD 而不是结构化 API,而不是操作一些 非常原始的未处理和非结构化数据(第 44 页)。

如果你决定绝对需要使用 RDD,你可以参考 p. 212 在“何时使用 RDD”部分的书中。摘录转载:

一般来说,除非你有一个 这样做的非常非常具体的原因。他们是一个低得多的级别 API 提供了强大的功能,但也缺乏很多 结构化 API 中可用的优化。对于广大 大多数用例,DataFrames 将更高效,更稳定, 并且比 RDD 更具表现力。

您想要使用 RDD 的最可能原因是因为您 需要对数据的物理分布进行细粒度控制 (数据的自定义分区)。 (第 212 页)

【讨论】:

以上是关于Spark2.0啥时候使用rdd?的主要内容,如果未能解决你的问题,请参考以下文章

Spark 2.0:如何将元组的 RDD 转换为 DF [重复]

Spark全面精讲视频_Spark2.0视频

spark2.0的10个特性介绍

[Spark2.0]Spark SQL, DataFrames 和Datasets指南

CDH5.12.0 如何升级到Spark2.0 版本

Spark 2.0 数据集与数据帧