Apache spark pysaprk数据帧写入速度非常慢
我们正在使用分区方式(年、月、日)和附加模式将spark数据框写入拼花地板。 这里的问题是,随着存储位置(存储拼花文件的位置)中数据的增加,写入所需的时间急剧增加。当我检查日志时,我发现filescanRDD正在读取存储位置中可用的每个拼花地板文件。有没有办法提高性能 示例代码:Apache spark pysaprk数据帧写入速度非常慢,apache-spark,pyspark,Apache Spark,Pyspark,我们正在使用分区方式(年、月、日)和附加模式将spark数据框写入拼花地板。 这里的问题是,随着存储位置(存储拼花文件的位置)中数据的增加,写入所需的时间急剧增加。当我检查日志时,我发现filescanRDD正在读取存储位置中可用的每个拼花地板文件。有没有办法提高性能 示例代码: df.repartition('day').write.partitionBy('year','month','day').parquet("location",mode='append') 下面是日志,从4:10:
df.repartition('day').write.partitionBy('year','month','day').parquet("location",mode='append')
下面是日志,从4:10:15到5:10:15之间有时间间隔,我什么也看不到
20/01/23 04:10:15 INFO metrics: type=HISTOGRAM, name=application_1577238363313_31976.1.CodeGenerator.sourceCodeSize, count=394, min=430, max=467509, mean=4483.268903934098, stddev=5676.791863953458, median=2491.0, p75=4394.0, p95=15365.0, p98=24887.0, p99=32063.0, p999=32063.0
20/01/23 05:10:15 INFO metrics: type=GAUGE, name=application_1577238363313_31976.1.NettyBlockTransfer.shuffle-client.usedDirectMemory, value=50331648
20/01/23 05:10:15 INFO metrics: type=GAUGE, name=application_1577238363313_31976.1.NettyBlockTransfer.shuffle-client.usedHeapMemory, value=50331648
20/01/23 05:10:15 INFO metrics: type=GAUGE, name=application_1577238363313_31976.1.NettyBlockTransfer.shuffle-server.usedDirectMemory, value=50331648
20/01/23 05:10:15 INFO metrics: type=GAUGE, name=application_1577238363313_31976.1.NettyBlockTransfer.shuffle-server.usedHeapMemory, value=50331648
您的问题与
模式=append
有关。在此模式下,Spark读取目标中的所有文件,以便创建新的文件名。您可以使用将parquet.enable.summary元数据更改为False
:
sparkConf.set("parquet.enable.summary-metadata", "false")
您可以将文件导出到另一个目录中,然后手动将其移动到所需的目录中。问题在于分区函数。您应该在磁盘分区之前创建内存分区,如下所示
df=df1.repartition(col("year"),col("month"),col("day"))
df.coalesce(2).write.partitionBy('year','month','day').parquet("location",mode='append')
参考资料:使用coalesce的具体原因是什么?我们正在编写的数据量很小,因此使用coalesce时请确保添加以下内容:集群大小、数据大小、spark提交模式和运行的完整日志,这样更容易提供方法。到目前为止,输入还不够。我已经添加了日志