Spark 2.2.0中不再提供DirectFileOutputCommitter。这意味着写入S3需要花费很长时间(3小时vs 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
上面的命令似乎是设置版本= 2,但是当执行查询时,它仍然显示版本1行为。
两个问题,
1)如何使用spark-sql获取FileOutputCommitter版本2行为?
2)我有没有办法在spark 2.2.0中使用DirectFileOutputCommitter? [我很好,数据丢失的可能性非零]
相关项目:
答案 0 :(得分:8)
我受到了这个问题的打击。 Spark不鼓励使用DirectFileOutputCommitter,因为它可能会导致数据在比赛情况下丢失。算法版本2没有太大帮助。
我试图使用gzip来保存s3中的数据而不是snappy压缩,这给了一些好处。
这里真正的问题是首先在s3://<output_directory>/_temporary/0
中写入spark然后将数据从临时复制到输出。这个过程在s3中相当缓慢,(通常为6MBPS)因此,如果你获得大量数据,你将会大幅减速。
另一种方法是首先写入HDFS,然后使用distcp / s3distcp将数据复制到s3。
此外,您可以寻找解决方案Netflix provided。
我没有评估过。