一、背景
数据流向:Spark 读取 ODPS 数据,然后写入阿里云 OSS。
现象:在使用阿里云 dataworks 调度 Spark 任务时,发现Spark task 全部结束5分钟以后,整体的 job 没有显示 SUCCESSED。于是去查看程序对应的 OSS 输出目录,发现 _temporary 目录下的文件正在复制到目标目录,而不是 move 操作,导致花费时间过多。
二、问题
三、分析
- 两阶段过程是在使用文件系统时确保最终结果的一致性的最简单方法之一。
- 您必须记住,每个执行器线程都写出其结果集独立于其他线程,并且可以在不同的时刻执行写入,甚至可以重用相同的资源集。在 Spark 写数据的那一刻,他无法确定所有写入是否会成功。
- 如果失败,可以通过删除临时目录来回滚更改。
- 如果成功,可以通过移动临时目录来提交更改。
- 该模型的另一个好处是在进行中的写入和最终输出之间的区别。因此,它可以轻松地与简单的工作流管理工具集成,而无需具有单独的状态管理或其他同步机制。
- 此模型简单,可靠,适用于设计的文件系统。遗憾的是,它与对象存储没有良好的对象存储,这不支持移动,只能复制。