如何配置 Spark / Glue 以避免在 Glue 作业成功执行后创建空的 $_folder_$
Posted
技术标签:
【中文标题】如何配置 Spark / Glue 以避免在 Glue 作业成功执行后创建空的 $_folder_$【英文标题】:How to configure Spark / Glue to avoid creation of empty $_folder_$ after Glue job successful execution 【发布时间】:2021-04-16 11:06:27 【问题描述】:我有一个简单的胶水 etl 作业,由胶水工作流程触发。它从爬虫表中删除重复数据,并将结果写回 S3 存储桶。作业成功完成。但是,spark 生成“$folder$”的空文件夹仍保留在 s3 中。它在层次结构中看起来不太好,并导致混乱。成功完成作业后,有什么方法可以配置火花或胶水上下文以隐藏/删除这些文件夹?
----------S3 镜像 ---------
【问题讨论】:
根据this,是Hadoop造成的。我猜你可以使用 lambda 函数在 S3 对象创建事件中删除$folder$
。
感谢您的评论@AchyutVyas。我宁愿避免手动删除......奇怪的是那些 $folder$ 并不总是被创建......我怀疑当我手动触发胶水作业时,它不会创建文件夹但是当我使用工作流,这些文件夹被创建。虽然不确定!必须再次测试。将很快更新问题...
嘿,@Lina 使用 lambda 删除 $folder$
不是手动删除。请您也测试一下,删除$folder$
后是否也使用相同的作业触发方法创建?
感谢@AchyutVyas。通过说手动,我的意思是执行额外的操作来隐藏/删除文件夹。我更愿意以一种根本不会生成文件夹的方式配置 spark。我在本地对此进行了测试,发现了一件有趣的事情。如果我使用 [AWS 胶水库] (learning.tusharsarde.com/2019/11/…) 在本地运行胶水作业,它不会在云 s3 存储桶中创建 $folder$。我尝试使用相同的胶水版本,禁用云作业中的书签,但云作业会创建这些文件夹。仍在测试以查看区别是什么
@AchyutVyas 找到了答案。请在下面查看我的答案。
【参考方案1】:
好吧,经过几天的测试,我终于找到了解决方案。在粘贴代码之前,让我总结一下我的发现......
这些 $folder$ 是通过 Hadoop 创建的。Apache Hadoop 在 S3 存储桶中创建文件夹时会创建这些文件。 Source1 它们实际上是路径 + / 的目录标记。 Source 2 要更改行为,您需要更改 Spark 上下文中的 Hadoop S3 写入配置。阅读this 和this 和this 了解 S3、S3a 和 S3n here 和 here 感谢@stevel 的评论here现在解决方案是在 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'])
【讨论】:
现场..谢谢 不客气!以上是关于如何配置 Spark / Glue 以避免在 Glue 作业成功执行后创建空的 $_folder_$的主要内容,如果未能解决你的问题,请参考以下文章