为什么在将结果保存到文件系统时,spark将结果文件上传到_temporary目录,然后将其移动到输出文件夹而不是直接将它们上传到输出文件夹?

#1 楼

两阶段过程是确保使用文件系统时最终结果一致性的最简单方法。

您必须记住,每个执行程序线程都独立于其他线程写入其结果集,并且可以执行写入操作在不同的时间甚至重复使用同一组资源。在写操作时,Spark无法确定所有写操作是否都会成功。


如果失败,则可以通过删除临时目录来回滚更改。
如果成功,则可以通过移动临时目录来提交更改。

该模型的另一个好处是清楚区分正在进行的写入和最终输出。因此,它可以轻松地与简单的工作流管理工具集成,而无需使用单独的状态存储或其他同步机制。

此模型简单,可靠,并且可以很好地与文件系统配合使用。已设计。不幸的是,它在不支持移动的对象存储中表现不佳。

评论


作业运行完成后,是否应该删除_temporary目录?

–翁卡(Omkar Puttagunta)
18年8月30日在17:59

@OmkarPuttagunta通常它应该(准确地说,应该原子移动)。但是,在某些情况下,此步骤无法完成-stackoverflow.com/q/51603404/6910411

– zero323
'18 Sep 1'在0:10



就我而言,我以独立模式运行,并且群集上没有HDFS!因此,其编写工作是在一个工作程序中创建零件文件,而在另一工作程序中,它总是在_temporary /中创建零件文件,我认为这就是问题

–翁卡(Omkar Puttagunta)
'18 Sep 1'在1:24

@OmkarPuttagunta是的,如果没有共享存储,写入过程将无法完成-您的部分(未提交)结果会散布在整个集群中。

– zero323
'18 Sep 1'在10:52