RDD 与Spark 生产代码的数据集
Posted
技术标签:
【中文标题】RDD 与Spark 生产代码的数据集【英文标题】:RDD v.s. Dataset for Spark production code 【发布时间】:2020-12-13 21:24:17 【问题描述】:对于使用 RDD
或 Dataset
编写 Spark 项目,是否有任何行业指南?
到目前为止,对我来说显而易见的是:
RDD
,更多的类型安全,更少的优化(在 Spark SQL 的意义上)
Dataset
,更少的类型安全,更多的优化
在生产代码中推荐哪一个?由于Spark在过去几年很流行,所以目前在***中似乎没有找到这样的主题。
我已经预见到大多数社区都支持Dataset
:),因此让我先引用this answer 的反对票(请分享反对意见):
就个人而言,我发现静态类型的数据集最没用: 不提供与 Dataset[Row] 相同的优化范围(尽管它们共享存储格式和一些执行计划优化,但它并不能完全受益于代码生成或堆外存储),也不能访问 DataFrame 的所有分析功能.
没有像 RDD 那样灵活,仅原生支持一小部分类型。
当使用 as 方法转换 Dataset 时,编码器的“类型安全”是有争议的。由于数据形状没有使用签名进行编码,因此编译器只能验证 Encoder 的存在。
【问题讨论】:
【参考方案1】:这里摘自“Spark:权威指南”来回答这个问题:
何时使用低级 API?
您通常应该在三种情况下使用较低级别的 API:
您需要一些在更高级别的 API 中找不到的功能;为了 例如,如果您需要对物理数据的放置进行非常严格的控制 集群。 您需要维护一些使用 RDD 编写的遗留代码库。 您需要进行一些自定义共享变量操作
https://www.oreilly.com/library/view/spark-the-definitive/9781491912201/ch12.html
换句话说:如果您没有遇到上述这些情况,通常最好使用更高级别的 API(Datasets/Dataframes)
【讨论】:
【参考方案2】:RDD 限制:
没有输入优化引擎:
RDD 中没有自动优化的规定。它不能使用像催化剂优化器和钨执行引擎这样的 Spark 高级优化器。我们可以手动优化每个 RDD。
Dataset 和 DataFrame 克服了这个限制,它们都利用 Catalyst 生成优化的逻辑和物理查询计划。我们可以为 R、Java、Scala 或 Python DataFrame/Dataset API 使用相同的代码优化器。它提供空间和速度效率。
二。运行时类型安全 RDD 中没有静态类型和运行时类型安全。它不允许我们在运行时检查错误。 Dataset 提供编译时类型安全性来构建复杂的数据工作流。编译时类型安全意味着如果您尝试将任何其他类型的元素添加到此列表中,它将给您编译时错误。它有助于在编译时检测错误并使您的代码安全。
三。内存不足时降级 当没有足够的内存将 RDD 存储在内存中或磁盘上时,RDD 会降级。当存储 RDD 的内存不足时,就会出现存储问题。从 RAM 溢出的分区可以存储在磁盘上,并提供相同级别的性能。通过增加 RAM 和磁盘的大小,可以解决这个问题。
四。性能限制和序列化和垃圾收集的开销 由于 RDD 是内存中的 JVM 对象,因此它涉及垃圾收集和 Java 序列化的开销,这在数据增长时会很昂贵。 由于垃圾收集的成本与 Java 对象的数量成正比。使用对象较少的数据结构将降低成本。或者我们可以将对象以序列化的形式持久化。
v.处理结构化数据 RDD 不提供数据的模式视图。它没有处理结构化数据的规定。
Dataset 和 DataFrame 提供数据的 Schema 视图。它是组织成命名列的分布式数据集合。
这都是 Apache Spark 中 RDD 的限制,所以引入了 Dataframe 和 Dataset。
When to use Spark DataFrame/Dataset API and when to use plain RDD?
https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html
https://dzone.com/articles/apache-spark-3-reasons-why-you-should-not-use-rdds#:~:text=Yes!,data%20analytics%2C%20and%20data%20science.
https://data-flair.training/blogs/apache-spark-rdd-limitations/
【讨论】:
以上是关于RDD 与Spark 生产代码的数据集的主要内容,如果未能解决你的问题,请参考以下文章