使用Spark将多个文件写入Parquet - 缺少一些Parquet文件

4
我们开发了一个任务,使用Spark 2.3在Amazon S3(s3a)上处理和写入大量parquet文件。每个源文件应该在S3中创建一个不同的分区。代码已经过测试(使用较少的文件),并且按预期工作。
然而,在使用真实数据执行后,我们注意到一些文件(总数很少)未被写入parquet。日志中没有错误或任何奇怪的东西。我们针对缺失的文件再次测试了代码,它奇怪地工作了?我们想在生产环境中使用这段代码,但需要检测问题的原因。我们是这样写入parquet的:
dataframe_with_data_to_write.repartition($"field1", $"field2").write.option("compression", "snappy").option("basePath", path_out).partitionBy("field1", "field2", "year", "month", "day").mode(SaveMode.Append).parquet(path_out)

我们使用了推荐的参数:
spark.sparkContext.hadoopConfiguration.set("mapreduce.output.fileoutputformat.compress", "true")
spark.sparkContext.hadoopConfiguration.set("mapreduce.fileoutputcommitter.algorithm.version", "2")  
spark.sparkContext.hadoopConfiguration.set("mapreduce.fileoutputcommitter.cleanup-failures.ignored", "true")
spark.conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

您好!这些参数是否存在已知的故障或错误?也许是与S3事件一致性有关?您有什么建议吗?

非常感谢您的帮助。

1个回答

7

是的,这是一个已知问题。通过将输出列在尝试工作目录中并重命名到目标目录来提交工作。如果该列表未报告文件:则缺少输出。如果该列表列出了不存在的文件,则提交失败。

在ASF Hadoop版本上进行修复。

  1. hadoop-2.7-2.8连接器。写入HDFS,复制文件
  2. Hadoop 2.9-3.0开启S3Guard以获取一致的S3列表(使用DynamoDB实现)
  3. Hadoop 3.1,切换到S3A committers,这些committers专为解决一致性和性能问题而设计。来自Netflix的“staging”是最简单易用的。

更多阅读:零重命名提交者

更新11-01-2019,亚马逊有自己的ASF零重命名提交者的闭源实现。询问EMR团队他们自己的正确性证明,因为我们其他人无法验证这一点。

更新11-dec-2020:Amazon S3现在完全一致,所以列表将是最新和正确的;更新不一致性和404缓存不再存在。

  • v1提交算法仍然不安全,因为目录重命名是非原子性的
  • v2提交算法总是失效的,因为它逐个重命名文件
  • 在S3上,重命名是缓慢的O(data)复制操作,因此任务提交期间的故障窗口更大。

您不再面临数据丢失的风险,但是除了性能极差外,任务提交期间的失败也无法得到妥善处理。


谢谢您的回答,我们正在使用EMR和Hadoop 2.8.5,您能否详细说明“写入HDFS,复制文件”?我们应该将parquet文件写入HDFS,然后将它们复制到S3吗?如果是这样,那么我们如何从Spark中实现呢? - ibk_jj
实际上,EMR的最新版本现在已经配备了自己的“零重命名提交者”用于Spark -请查看发布说明。我会更新这个评论。 - stevel
谢谢,是的,那正是我们在寻找的。我们相信这解决了问题。以下是链接,以备将来参考:EMRFS S3-optimized - ibk_jj
@SteveLoughran - 我们正在使用hadoop2.7,很快将转移到hadoop2.9,虽然s3guard可以解决一致性问题,但是s3A committers无法解决提交问题(https://hadoop.apache.org/docs/r3.1.1/hadoop-aws/tools/hadoop-aws/committers.html#Filesystem_does_not_have_support_for_.27magic.27_committer)。有没有办法在hadoop2.9中使用s3a committers或类似的工具? - Kabs
这个答案现在已经过时了,因为S3是一致的。我不会维护它,因为ASF文档就是为此而存在的。如果有人想让SO保持最新,他们可以维护它。 - stevel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接