#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