S3Guard,HADOOP-13345 通过让 DynamoDB 存储列表来改进 S3 的一致性。这使得第一次可以可靠地将 S3A 用作工作的直接目的地。否则,执行时间可能似乎是个问题,但真正的问题是基于重命名的提交者可能会得到不一致的列表,甚至看不到它必须重命名的文件。
S3Guard 提交者工作HADOOP-13786 将在完成后(截至 2017 年 8 月,仍在进行中)提供两个提交者。
暂存提交者
- worker 写入本地文件系统
- 任务提交者上传到 S3 但未完成操作。相反,它将提交元信息保存到 HDFS。
- 此提交元信息作为 HDFS 中的普通任务/作业数据提交。
- 在作业提交中,提交者从 HDFS 读取待提交的数据并完成它们,然后清理所有未完成的提交。
任务提交是所有数据的上传,时间为O(data/bandwidth)。
这是基于 Ryan 在 Netflix 的 s3committer,并且是最安全的一个。
魔术提交者
之所以被调用,是因为它在文件系统中发挥了“魔力”。
- 文件系统本身识别像
s3a://dest/__magic/job044/task001/__base/part-000.orc.snappy这样的路径
- 将写入重定向到
s3a://dest/__magic/job044/task001/__base/part-000.orc.snappy;未完成流 close() 调用中的写入。
- 将提交元信息保存到 s3a,此处为
s3a://dest/__magic/job044/task001/__base/part-000.orc.snappy.pending
任务提交:从该目录加载所有 .pending 文件,聚合,保存在别处。时间是O(files);数据大小不重要。
任务中止:加载所有 .pending 文件,中止提交
- 作业提交:从已提交的任务中加载所有挂起的文件,完成。
因为它在 S3 中列出文件,所以它需要 S3Guard 来提供 AWS S3 上的一致性(其他 S3 实现是开箱即用的,所以不需要它)。
两个提交者共享相同的代码库,两者的作业提交将是O(files/threads),因为它们都是不占用带宽或太多时间的短 POST 请求。
在测试中,暂存提交器比魔术提交器更快,因为魔术提交器与 S3 的对话更多,这很慢……尽管 S3Guard 加快了列表/getFileStatus 调用的速度。您写入的数据越多,暂存提交者的任务提交时间就越长,而对于相同数量的文件,魔术任务提交是恒定的。两者都比使用 rename() 更快,因为它是如何被列表模仿的,复制
GCS 和 Hadoop/Spark 提交算法
(这里的GCS代码我没有看,所以保留错误的权利。以Dennis Huo的说法为权威)
如果 GCS 确实比 S3A 复制然后删除更有效地重命名(),它应该更快,比 O(数据)更多的 O(文件),这取决于代码中的并行化。
我不知道他们是否可以选择 0-rename 提交者。 FileOutputFormat 下的 mapreduce 代码的变化是为了支持不同的/可插拔的提交者针对不同的文件系统,所以他们有机会在这里做点什么。
目前,请确保您使用的是 v2 MR 提交算法,该算法虽然对故障的恢复能力较差,但至少会将重命名推送到任务提交中,而不是作业提交中。
另见Spark and Object Stores。