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

时间:2016-10-14 11:10:43

标签: apache-spark amazon-s3 pyspark

我有一个简单的火花作业,从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/")

工作结束后我有s3"目录"调用包含结果的输出和另一个名为output_ $ folder $的s3对象,我不知道它是什么。

3 个答案:

答案 0 :(得分:4)

好吧,好像我发现它是什么。 它是某种标记文件,可能用于确定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 $ file之后重新运行了相同的spark作业。作业失败,说输出目录已存在。

我的结论是,这是hadoop的方式来知道s3中是否有一个具有给定名称的目录,我将不得不接受它。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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')