【发布时间】:2020-03-01 03:38:54
【问题描述】:
我在官方文档中找不到关于Spark临时数据持久化的信息,只能在this等一些Spark优化文章中找到:
在每个阶段边界,数据由父级中的任务写入磁盘 阶段,然后由子阶段中的任务通过网络获取。 因为它们会产生大量的磁盘和网络 I/O,所以阶段边界可以是 价格昂贵,应尽可能避免使用。
每个阶段边界上的磁盘持久性是否总是适用于:HashJoin 和 SortMergeJoin?为什么 Spark(内存引擎)在 shuffle 之前对 tmp 文件进行持久化?这是为了任务级恢复还是其他什么?
附:问题主要与 Spark SQL API 有关,而我也对 Streaming & Structured Streaming 感兴趣
UPD:在"Stream Processing with Apache Spark book" 找到了关于为什么会发生的提及和更多详细信息。在参考页面上查找“任务故障恢复”和“阶段故障恢复”主题。据我了解,Why = recovery,When = always,因为这是 Spark Core 和 Shuffle Service 的机制,负责数据传输。此外,所有 Spark 的 API(SQL、流式处理和结构化流式处理)都基于相同的故障转移保证(Spark Core/RDD)。所以我想这是 Spark 的普遍行为
【问题讨论】:
-
@thebluephantom 听起来不错。 Spark 的广泛转换是否比 Map-Reduce 行为更快(更优化)?我从未使用过 Map-Reduce,但读到它有时会保留中间结果,然后再保留
map输出 -
@thebluephantom 与进一步洗牌相比,此(磁盘 I/O)操作的成本是多少?
-
@thebluephantom 另一点是理论上我可以在同一个工人/机器上运行所有 mu 执行器。 Spark 会考虑舞台边界的局部性吗?
-
与进一步洗牌相比,这个(磁盘 I/O)操作的成本是多少?很难回答,一段字符串有多长
-
@moin1010 1 个问题中的问题太多。改写它。这回答了部分问题。
标签: apache-spark apache-spark-sql