我有一个简单的glue etl 作业,它是由Glue 工作流程触发的。它从爬虫表中删除重复数据并将结果写回到 S3 存储桶中。工作顺利完成。然而,spark 的空文件夹会生成“$folder$" 保留在 s3 中。它在层次结构中看起来不太好,并会导致混乱。有没有办法配置 Spark 或粘合上下文以在成功完成作业后隐藏/删除这些文件夹?
---------------------S3 image ---------------------
好吧,经过几天的测试我终于找到了解决方案。在粘贴代码之前,让我总结一下我发现的内容......
- 这些 $folder$ 是通过 Hadoop 创建的。Apache Hadoop 在 S3 存储桶中创建文件夹时会创建这些文件。Source1 https://aws.amazon.com/premiumsupport/knowledge-center/emr-s3-empty-files/它们实际上是目录标记,如路径+/。Source 2 https://www.edureka.co/community/920/difference-between-s3n-s3a-and-s3#:%7E:text=s3%20is%20a%20block%2Dbased,is%20the%20successor%20to%20s3n.
- 要更改行为,您需要更改 Spark 上下文中的 Hadoop S3 写入配置。读this https://docs.qubole.com/en/latest/user-guide/cloud-filesystem/aws-filesystem.html and this https://towardsdatascience.com/testing-glue-pyspark-jobs-4b544d62106e and
- 了解 S3 、 S3a 和 S3nhere https://www.edureka.co/community/53425/what-is-the-difference-between-s3n-s3a-and-s3 and here https://forums.databricks.com/questions/35959/what-is-the-difference-between-using-s3a-s3n-and-s.html
- 感谢@stevel 的评论here https://stackoverflow.com/questions/65125955/dynamically-folder-creation-in-s3-bucket-from-pyspark-job
现在的解决方案是在 Spark 上下文 Hadoop 中设置以下配置。
sc = SparkContext()
hadoop_conf = sc._jsc.hadoopConfiguration()
hadoop_conf.set("fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
为了避免创建 SUCCESS 文件,您还需要设置以下配置:hadoop_conf.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false")
确保使用 S3 URI 写入 s3 存储桶。前任:
myDF.write.mode("overwrite").parquet('s3://XXX/YY',partitionBy['DDD'])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)