apache-spark - 火花非确定性和重新计算安全
问题描述
有人声称,由于重新计算和容错,Spark RDD 必须是其输入的确定性函数,但也有认可的非确定性 RDD,例如在SparkSQL或SparkML中。是否有关于如何安全使用非确定性的正式指导?
考虑这个带有菱形 DAG 的 Spark 作业。
val bar = (rdd map f) zip (rdd map g)
bar.saveAsTextFile("outfile")
如果rdd
是不确定的(例如,随机或时间戳),是否会outfile
包含一致的数据?是否有可能重新计算 zip 的一个组件而另一个组件不会?如果我们检查点或坚持,是否能保证安全rdd
?本地检查站就足够了吗?
解决方案
一般的
以下是我在实践层面的一些看法和经验:
如果您从 Hive 中的表/文件中读取,那么 Spark 将列出所有使用的文件以及哪个节点证明了该列表的一部分,因此如果它一直回到开始,重新计算将是一致的,即读取从 HDFS / Hive 获取该数据子集。
如果你使用随机函数,那么我 .cache 或 .persist 以避免使用不同的路径逻辑重新计算。当然,结合上述情况,如果在读取并必须从源中获取数据后使用随机函数,您会得到不同的结果。见下文。
如果在处理的同时允许更新 JDBC 源并且 DAG 从它们重新计算,则从 JDBC 源读取将无法保证一致性/确定性结果。
检查点的效果
万一由于某种原因失败,从 DAG 一直返回源的计算成本很高。在给定阶段采取的检查点将数据存储到磁盘 - 本地或 HDFS,如果随后出现故障,则从该点开始重新计算,从而节省时间。DAG 血统已损坏。
最后的笔记
如果重新计算从 JDBC 源或在 Stage 中处理时使用的随机函数开始可能会影响随后已处理的分区,该怎么办?我无法轻易证明这一点,但我认为那些不适合“当前节点”重新处理的结果将被丢弃。否则这是不切实际的,这是我的看法。
关于作者自己的回答,火花检查点和持久化到磁盘有什么区别,应注意以下几点:“......几乎没有重要的区别,但基本的区别是血统发生了什么。持久化/缓存保持血统完好无损而检查点打破血统......”。其他答案中的陈述不正确。
推荐阅读
- keras - 图像旋转的损失?
- visual-studio-code - 如何更改 vscode 终端的外观?
- android - 无法在 Android Kotlin 中列出 USB 连接的设备
- javascript - 使用 slick.js 的可过滤图库
- node.js - 异步函数总是返回空白数组
- mysql - 酒窝 - 将金额绘制为 52 周的堆叠条形图
- metabase - 有没有办法从 Metabase 连接到 sanity.io 数据库/数据存储数据?
- postgresql - Azure 托管 PostgreSQL 服务上的中断 VACUUM FULL 消耗了大量空间。我该如何恢复它?
- javascript - Jquery在滚动上添加和删除类
- laravel-8 - 无法在 Laravel 8 中安装 Bootstrap 5.0.1 包