spark 2.2.0中不再提供directfileoutputcommitter。这意味着写s3要花很长时间(3小时对2分钟)。我可以通过在spark shell中将fileoutputcommitter版本设置为2来解决这个问题,
spark-shell --conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2
spark sql不适用于此
spark-sql --conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2
上面的命令似乎在设置version=2,但是当执行查询时,它仍然显示version 1的行为。
两个问题,
1) 如何使用spark sql获得fileoutputcommitter版本2行为?
2) 有没有办法在spark 2.2.0中仍然使用directfileoutputcommitter[我对丢失数据的可能性不是零表示满意]
相关项目:
spark 1.6 directfileoutputcommitter
1条答案
按热度按时间rhfm7lfc1#
这个问题一直困扰着我。spark不鼓励使用directfileoutputcommitter,因为它可能会在出现竞争情况时导致数据丢失。算法版本2帮不了什么忙。
我曾尝试使用gzip将数据保存在s3中,而不是提供了一些好处的快速压缩。
真正的问题是spark在
s3://<output_directory>/_temporary/0
首先,将数据从临时复制到输出。这个过程在s3中相当慢(通常是6mbps),所以如果你得到大量的数据,你会得到相当大的减速。另一种方法是先写入hdfs,然后使用distcp/s3distcp将数据复制到s3。
此外,您还可以寻找netflix提供的解决方案。
我还没评估过。
编辑:
新的spark2.4版本解决了s3写速度慢的问题。我发现在最新的emr版本(5.24)中,spark2.4和hadoop2.8的s3写性能几乎与hdfs write相当。
查看文档
https://aws.amazon.com/blogs/big-data/improve-apache-spark-write-performance-on-apache-parquet-formats-with-the-emrfs-s3-optimized-committer/
https://docs.aws.amazon.com/emr/latest/releaseguide/emr-spark-s3-performance.html