我正在尝试使用partitionBy在S3上使用pyspark保存数据集。我在日期列上进行分区。星火作业需要超过一个小时才能执行。如果我在没有partitionBy的情况下运行代码,只需3-4个薄荷糖即可。有人能帮我调一下调子吗?
发布于 2019-06-09 03:12:53
好吧,所以火花在做IO方面是很糟糕的。特别是在s3方面。目前,当您正在写入的火花,它将使用一个完整的执行器,以顺序写入数据。在s3和spark之间来回移动会导致它变得非常慢。因此,您可以做一些事情来帮助缓解/解决这些问题。
spark.sql.shuffle.partitions 200 // 200 is the default you'll probably want to reduce this和/或重新分区数据。顺便提一句:您可以使用选项spark.sql.files.maxRecordsPerFile 1000000来帮助控制文件大小,以确保它们不会失控。
简而言之,您应该避免创建太多的文件,特别是小文件。还要注意:当你回去读那些2000*n的文件时,你会看到一个很大的性能冲击。
我们在不同的情况下使用上述所有的策略。但是一般来说,我们只是尝试在写之前使用合理的分区策略+重新分区。另一个注意事项:如果执行了洗牌,您的分区就会被破坏,并且火花自动分区将接管。因此,需要不断地重新分区。
希望这些建议能有所帮助。SparkIO是相当令人沮丧的,但是请记住将文件的读/写保持在最低限度,并且您应该看到良好的性能。
发布于 2019-08-30 17:33:13
使用FileOutputCommiter的第2版
.set("mapreduce.fileoutputcommitter.algorithm.version", "2")
https://stackoverflow.com/questions/56496387
复制相似问题