DirectFileOutputCommitter 在 Spark 2.2.0 中不再可用。这意味着写入 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 但是当查询被执行时它仍然显示版本 1 的行为。
两个问题,
1) 如何使用 spark-sql 获取 FileOutputCommitter 版本 2 行为?
2) 有没有办法我仍然可以在 spark 2.2.0 中使用 DirectFileOutputCommitter? [我认为丢失数据的可能性不是零]
相关项目:
最佳答案
我一直被这个问题击中。 Spark 不鼓励使用 DirectFileOutputCommitter,因为它可能会在竞争情况下导致数据丢失。算法版本 2 没有多大帮助。
我尝试使用 gzip 将数据保存在 s3 中,而不是 snappy 压缩,这带来了一些好处。
这里真正的问题是 spark 在 s3://<output_directory>/_temporary/0
中写入首先然后将数据从临时复制到输出。这个过程在 s3 中非常慢,(通常为 6MBPS)所以如果你获得大量数据,你会得到相当大的减速。
另一种方法是先写入 HDFS,然后使用 distcp/s3distcp 将数据复制到 s3。
此外,您可以寻找解决方案 Netflix provided .
我还没有评估过。
编辑:
新的spark2.4版本解决了s3写慢的问题。我发现在最新的 EMR 版本(5.24)中,spark2.4 和 hadoop 2.8 的 s3 写入性能几乎与 HDFS 写入性能相当。
查看文档
关于hadoop - 星火 2.2.0 FileOutputCommitter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46261754/