Spark标记文件名是否可能稍后删除/回滚?

时间:2019-01-31 02:49:26

标签: apache-spark

我在AWS EMR中使用Spark 2.4。 我在我的ELT / ETL中使用Pyspark和SparkSQL,在AWS S3上使用带有Parquet输入和输出的DataFrames。

据我所知,自 Spark 2.4 起,还没有办法标记或自定义输出文件(镶木地板)的文件名。请纠正我吗?

当我将实木复合地板输出文件存储在S3上时,最终得到的文件名看起来像这样:

part-43130-4fb6c57e-d43b-42bd-afe5-3970b3ae941c.c000.snappy.parquet

文件名的中间部分似乎已嵌入了GUID / UUID:

part-43130- 4fb6c57e-d43b-42bd-afe5-3970b3ae941c .c000.snappy.parquet

我想知道是否可以在运行时时从PySpark或SparkSQL函数获取此GUID / UUID值,以便将该值记录/保存/显示在文本文件中?

我需要记录此GUID / UUID值,因为出于手动回滚的目的(例如,我可能会在一天或一周后发现此问题),稍后可能需要删除带有该值的文件作为其名称的一部分。数据已损坏,需要删除,因此可以识别和删除所有带有GUID / UUID标签的文件。

我知道我可以在GUID列上手动对表进行分区,但是最后我得到的分区过多,因此会影响性能。我需要以某种方式为每个数据加载作业标记文件,以便我可以轻松地从S3中识别和删除它们,因此GUID / UUID值似乎是一种可能的解决方案。

打开以获取其他建议。

谢谢

2 个答案:

答案 0 :(得分:0)

这是新的“ s3a特定提交者”吗?如果是这样,则表示他们正在使用netflix的代码/技巧在每个写入的文件上使用GUID,以避免最终出现一致性问题。但这并没有太大帮助。

  1. 考虑提供一个Spark补丁,可让您在文件名中添加特定的前缀。
  2. 对于Apache Hadoop和Spark(即非EMR)而言,S3A提交者可以选择在生成临时文件名时使用该前缀。

短期:好吧,您始终可以列出目录树的前后状态(提示:使用FileSystem.listFiles(path,recursive)来提高速度),并记住新文件或重命名它们(这会很慢:记住新的文件名会更好)

答案 1 :(得分:0)

  1. Spark 已经在名称中写入带有 UUID 的文件。您可以设置客户文件命名(例如添加一些 id),而不是创建太多分区。可能这是适合您的解决方案 - https://stackoverflow.com/a/43377574/1251549

  2. 尚未尝试(但正在计划中)-https://github.com/awslabs/amazon-s3-tagging-spark-util 理论上,你可以用jobid(或其他)标记然后运行一些东西

这两种解决方案都会导致执行多个 s3 list objects API 请求检查标签/文件名并一一删除文件。