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

eza*_*mur 1 amazon-s3 apache-spark pyspark

我有一个简单的 spark 作业,它从 s3 读取一个文件,需要五个并在 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/")
Run Code Online (Sandbox Code Playgroud)

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

eza*_*mur 6

好吧,看来我知道那是什么了。它是某种标记文件,可能用于确定 S3 目录对象是否存在。我是如何得出这个结论的?首先,我发现这个链接显示了来源

org.apache.hadoop.fs.s3native.NativeS3FileSystem#mkdir
Run Code Online (Sandbox Code Playgroud)

方法: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$。


小智 5

将应用程序中的 S3 路径从 更改s3://s3a://似乎对我来说已经成功了。该$folder$自从我开始使用不再得到创建的文件s3a://