根据databricks的this博客,spark依赖于来自Hadoop的提交协议类,因此如果由于某些失败而未完成作业,则输出目录不会更改(不会发生部分输出文件)。
所以我的问题是;
如果发生故障(HDFS,S3等),火花会阻止对不同存储的部分写入吗?
在最终写入操作之前,不同的火花作业是否可以使用相同的临时位置?
同一个提交多次的火花作业是否可以使用相同的临时位置?
答案 0 :(得分:4)
这是一个非常有趣的问题 - 对于如何在失败不可避免的范围内实施数据分析而言,这是一个基础。
HDFS:O(1)
提交任务,可以抵御任务提交中的失败。作业提交是〜O(files)
,包含大量文件;如果它中途失败,输出状态未知。
S3:O(data)
提交任务,提交作业的速度很慢(O(data)
用于整个作业的输出)。原子重命名缺乏潜在危险。
HDFS:O(files)
提交任务,无法处理失败。作业提交是O(1)touch _SUCCESS
调用。
S3:O(data)
提交任务,无法处理失败,并且使用更长的COPY操作提交,任务提交失败的可能性更高。
我个人认为V2算法的失败语义不起作用; MapReduce和Spark都假设一个在提交过程中失败的任务可以重复......这不适用于此。
还有一些您不想知道的额外细节,例如驱动程序如何结束任务失败,MapReduce如何判断它已从YARN分区,因此不得提交,但通常都是心跳和假设一旦任务超时就不会重新出现。如果您自己实现提交算法,请确保在整个作业提交之后一直挂起的任务提交者不会影响输出
O(files/threads
)。作业提交期间的失败无法恢复。解决问题; Azure和谷歌云存储确实有目录重命名,虽然它们通常是O(文件),而不是O(1) - 但至少不是O(数据),如S3。您可以安全地使用Hadoop V1提交程序。
答案 1 :(得分:1)