【问题标题】:does coalesce(1) the dataframe before write have any impact on performance?写入前的数据帧合并(1)对性能有什么影响吗?
【发布时间】:2019-04-21 10:35:57
【问题描述】:
在将dataframe写入hdfs之前,我coalesce(1)使其只写入一个文件,因此在复制时很容易手动处理,从hdfs获取,...
我会用这样的代码来编写输出。
outputData.coalesce(1).write.parquet(outputPath)
(输出数据为 org.apache.spark.sql.DataFrame)
我想问一下它们是否对性能有任何影响而不是合并
outputData.write.parquet(outputPath)
【问题讨论】:
标签:
apache-spark
dataframe
hdfs
parquet
【解决方案1】:
是的,它会用 1 个工人写。
所以,即使你给了 10 个 CPU 核心,它也会用 1 个 worker(单分区)写入。
如果您的文件非常大(10 GB 或更多),则会出现问题。但如果您有小文件(100 mb),建议您使用
【解决方案2】:
虽然在处理大量数据时确实不建议使用,但当 _temporary 中有太多小分区文件并且文件移动需要相当长的时间才能将它们移动到正确的目录时,使用 coalesce(1) 会很方便.
【解决方案3】:
我不建议这样做。分布式计算的全部目的是将数据和处理放在多台机器上,并利用多台机器(工作节点)的 CPU/内存的优势。
在您的情况下,您正试图将所有内容放在一个地方。如果要写入只有一个分区的单个文件,为什么需要分布式文件系统?性能可能是一个问题,但只能在您在使用 Coalesce 功能之前/之后检查分布在集群上多个节点上的大量数据之前/之后进行评估。