【发布时间】:2018-03-21 18:37:13
【问题描述】:
我需要将数据帧上传到 S3 存储桶,但我没有存储桶的删除权限。有什么办法可以避免在 S3 上创建这个 _temporary 目录?也许在 spark 中以任何方式使用本地 FS 作为 _temporary 目录,然后将最终生成的文件上传到 S3 存储桶或完全避免 _temporary 目录。
提前致谢。
【问题讨论】:
我需要将数据帧上传到 S3 存储桶,但我没有存储桶的删除权限。有什么办法可以避免在 S3 上创建这个 _temporary 目录?也许在 spark 中以任何方式使用本地 FS 作为 _temporary 目录,然后将最终生成的文件上传到 S3 存储桶或完全避免 _temporary 目录。
提前致谢。
【问题讨论】:
没有。
数据被写入_temporary/jobAttemptID/taskAttemptID/,然后在任务/作业提交期间重命名为dest dir。
您可以做的是为您的作业写入 hdfs,然后使用 distcp 进行复制。这有很多优点,尤其是“使用一致的文件系统,您不会冒 s3n 或 s3a 连接器带来的数据丢失风险”
2019 年 7 月 11 日更新。 Apache Hadoop S3A 提交程序让您无需临时文件夹或重命名即可提交工作,即使针对不一致的 S3 存储也能提供性能和正确结果。这就是您可以安全地提交工作的方式。 Amazon EMR 对自己的工作有自己的重新实现,尽管(目前没有 Spark 期望的完整故障语义
【讨论】:
是的,您可以避免在将数据帧上传到 s3 时创建_temporary 目录。
当 Spark 将数据附加到现有数据集时,Spark 使用FileOutputCommitter 来管理暂存输出文件和最终输出文件。
默认情况下,输出提交者算法使用版本 1。在此版本中,FileOutputCommitter 有两种方法,commitTask 和 commitJob。 commitTask 将任务生成的数据从任务临时目录移动到作业临时目录,当所有任务完成后,commitJob 将数据从作业临时目录移动到最终目的地。
但是,当输出提交者算法使用版本 2 时,commitTask 将任务生成的数据直接移动到最终目的地,commitJob 基本上是空操作。
如何将 spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 设置为 2? 您可以使用以下任何一种方法设置此配置:
spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2 在
火花配置。 spark.conf.set("mapreduce.fileoutputcommitter.algorithm.version",
"2")dataset.write.option("mapreduce.fileoutputcommitter.algorithm.version",
"2")。详细了解输出提交器算法版本databricks-blog 和mapred-default
【讨论】:
foo/_temporary/0/_temporary/attempt_...000000_0/part-00000-....snappy.parquet 但是,commitTask 临时写入任务,然后将该输出直接移动到最终目录(由执行程序完成,并行性,更快) commitJob(由驱动程序完成?)然后本质上是禁止的按照 Databricks 博客中的说明操作。