Apache spark 从Spark向拼花写入许多文件-缺少一些拼花文件
我们开发了一个作业,使用Spark 2.3在Amazon S3(s3a)的拼花中处理和写入大量文件。每个源文件都应该在S3中创建不同的分区。代码经过测试(使用较少的文件)并按预期工作 然而,在使用真实数据执行后,我们注意到一些文件(总数的一小部分)没有写入拼花地板。日志中没有错误或任何奇怪的东西。我们再次测试了丢失的文件的代码,它成功了吗?。我们希望在生产环境中使用代码,但我们需要检测这里的问题。我们写信给拼花地板如下:Apache spark 从Spark向拼花写入许多文件-缺少一些拼花文件,apache-spark,amazon-s3,parquet,Apache Spark,Amazon S3,Parquet,我们开发了一个作业,使用Spark 2.3在Amazon S3(s3a)的拼花中处理和写入大量文件。每个源文件都应该在S3中创建不同的分区。代码经过测试(使用较少的文件)并按预期工作 然而,在使用真实数据执行后,我们注意到一些文件(总数的一小部分)没有写入拼花地板。日志中没有错误或任何奇怪的东西。我们再次测试了丢失的文件的代码,它成功了吗?。我们希望在生产环境中使用代码,但我们需要检测这里的问题。我们写信给拼花地板如下: dataframe_with_data_to_write.repartit
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")
使用此参数是否存在已知的bug问题?也许是有一致性的东西?有什么建议吗
任何帮助都将不胜感激。是的,这是一个已知的问题。通过在尝试工作目录中列出输出并重命名到目标目录中来提交工作。如果该列表未报告文件:输出丢失。如果该列表列出了不存在的文件,则提交失败 ASF Hadoop发行版上的修复程序
- v1提交算法仍然不安全,因为目录重命名是非原子的
- v2提交算法在逐个重命名文件时总是被破坏
- 重命名是S3上缓慢的O(数据)复制操作,因此任务提交期间的失败窗口更大
您不再面临数据丢失的风险,但是性能非常糟糕,任务提交期间的失败没有得到正确处理感谢您的回答,我们使用的是EMR和hadoop is 2.8.5,请您详细说明“写入hdfs,复制文件”。我们是否应该将拼花地板文件写入hdfs,然后将其复制到S3?如果是这样的话,Spark如何做到这一点?事实上,最新版本的EMR现在为Spark提供了自己的“零重命名提交人”——请查看发行说明。我会更新这个评论的谢谢,是的,这就是我们要找的。我们认为这解决了问题。这里有一个链接供将来参考:@SteveLoughran-我们正在使用hadoop2.7,不久将转向hadoop2.9,而s3guard可以解决一致性问题,但s3A提交者将无法解决提交问题()。有没有办法在hadoop2.9中使用s3a提交器或类似的工具?