S3 上带有美元符号的垃圾 Spark 输出文件

Posted

技术标签:

【中文标题】S3 上带有美元符号的垃圾 Spark 输出文件【英文标题】:Junk Spark output file on S3 with dollar signs 【发布时间】:2016-10-14 11:10:43 【问题描述】:

我有一个简单的 spark 作业,它从 s3 读取文件,取 5 个文件并在 s3 中回写。 我看到的是 s3 中总是有附加文件,在我的输出“目录”旁边,称为 output_$folder$。

这是什么?如何防止火花产生? 这是一些代码来显示我在做什么......

x = spark.sparkContext.textFile("s3n://.../0000_part_00")
five = x.take(5)
five = spark.sparkContext.parallelize(five)
five.repartition(1).saveAsTextFile("s3n://prod.casumo.stu/dimensions/output/")

完成工作后,我有一个名为 output 的 s3“目录”,其中包含结果和另一个名为 output_$folder$ 的 s3 对象,我不知道它是什么。

【问题讨论】:

【参考方案1】:

将应用程序中的 S3 路径从 s3:// 更改为 s3a:// 似乎对我有用。自从我开始使用 s3a:// 以来,不再创建 $folder$ 文件。

【讨论】:

【参考方案2】:

好的,看来我发现它是什么了。 它是某种标记文件,可能用于确定 S3 目录对象是否存在。 我是怎么得出这个结论的? 首先,我找到了显示

来源的链接
org.apache.hadoop.fs.s3native.NativeS3FileSystem#mkdir

方法:http://apache-spark-user-list.1001560.n3.nabble.com/S3-Extra-folder-files-for-every-directory-node-td15078.html

然后我搜索了其他源存储库,看看我是否会找到该方法的不同版本。我没有。

最后,我做了一个实验,在我删除了 s3 输出目录对象但留下了 output_$folder$ 文件后重新运行了相同的 spark 作业。作业失败,说输出目录已经存在。

我的结论是,这是 hadoop 知道 s3 中是否存在具有给定名称的目录的方法,我将不得不忍受它。

当我从本地开发机器(即笔记本电脑)运行作业时,会发生上述所有情况。如果我从 aws 数据管道运行相同的作业,则不会创建 output_$folder$。

【讨论】:

【参考方案3】:

s3n://s3a:// 不会生成像 <output>_$folder$ 这样的标记目录

如果您将 hadoop 与 AWS EMR 一起使用,我发现从 s3 移动到 s3n 是直接的,因为它们都使用相同的文件系统实现,而 s3a 涉及与 AWS 凭证相关的代码更改。

('fs.s3.impl', 'com.amazon.ws.emr.hadoop.fs.EmrFileSystem')
('fs.s3n.impl', 'com.amazon.ws.emr.hadoop.fs.EmrFileSystem')
('fs.s3a.impl', 'org.apache.hadoop.fs.s3a.S3AFileSystem')

【讨论】:

s3n 已过时,并已从最近的 hadoop 版本中删除。 S3A 仍然创建标记,但带有尾随 /。在下面添加文件后删除它们;最新版本允许您跳过该删除(性能),但代价是不兼容。 @stevel 我同意你的看法。有没有办法避免s3 中的这个标记? S3 是 EMR 的闭源 FS。如果您是 AWS 的客户,请直接与他们交谈

以上是关于S3 上带有美元符号的垃圾 Spark 输出文件的主要内容,如果未能解决你的问题,请参考以下文章

带有 spark.read.text 的 Spark 2.0 索引 3 处的预期方案特定部分:s3:错误

在 Amazon s3 中将 Spark RDD 编写为 Gzipped 文件

Spark:如何覆盖 S3 文件夹上的文件而不是完整的文件夹

将带有美元符号的字符串转换为数字

将 Spark DataFrame 数据分成单独的文件

在远程 Yarn 集群上使用 spark 从 S3 访问文件时出现问题