我有一个简单的火花作业,它从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,它包含结果,还有另一个名为output_$folder$的s3对象,我不知道它是什么。
发布于 2016-10-14 11:31:38
好吧,好像我发现了它是什么。它是某种标记文件,可能用于确定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$。
发布于 2018-08-11 17:33:47
将应用程序中的S3路径从s3://更改为s3a://似乎对我起了很大作用。自从我开始使用$folder$之后,就不再创建s3a://文件了。
发布于 2021-08-11 00:05:02
s3n://和s3a://不生成像<output>_$folder$那样的标记目录
如果您在AWS中使用hadoop,我发现从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')https://stackoverflow.com/questions/40041732
复制相似问题