我有一个简单的火花作业,从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对象,我不知道它是什么。
答案 0 :(得分:4)
好吧,好像我发现它是什么。 它是某种标记文件,可能用于确定S3目录对象是否存在。 我是如何得出这个结论的? 首先,我发现此链接显示了
的来源org.apache.hadoop.fs.s3native.NativeS3FileSystem#mkdir
然后我搜索其他源存储库,看看我是否会找到该方法的不同版本。我没有。
最后,我做了一个实验并在删除了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')