Spark使用partitionBy会比不使用更慢

7

我使用以下工具进行了写作测试:

 df.write.partitionBy("id", "name")
    .mode(SaveMode.Append)
    .parquet(filePath)

然而,如果我省略分区:
 df.write
    .mode(SaveMode.Append)
    .parquet(filePath)

它执行速度比之前快了100倍(!)。

当进行分区时,写入相同数量的数据需要花费100倍的时间,这正常吗?

这个DataFrame有10个额外的整数列,其中包含10个唯一的id和3000个唯一的name列值。


它会导致洗牌吗? - Gillespie
涉及多少数据?在强制进行分区之前,它可能全部适合一个分区。 - The Archetypal Paul
@Gillespie,我该怎么找到? - BAR
请查看Spark UI以查看有多少数据被洗牌。 - Gillespie
@Gillespie,这正是我在想的。我得找出如何在Google Dataproc上实现它。 - BAR
显示剩余4条评论
1个回答

1
第一个代码片段将每个分区写入文件系统(本地或HDFS)的parquet文件。这意味着如果您有10个不同的ID和3000个不同的名称,此代码将创建30000个文件。我怀疑创建文件、写入parquet元数据等开销相当大(除了洗牌)。
Spark不是最好的数据库引擎,如果您的数据集适合内存,建议使用关系型数据库。它会更快,更容易处理。

你的意思是parquet不是最好的数据库存储方式吗?我正在设置jdbc到postgres来测试性能。我认为数据不必适合内存...这不是Spark背后的重点吗? - BAR
Parquet文件格式实际上非常好,但是Spark是否是适合您的工具取决于您的用例。Spark针对大量数据的并行处理进行了优化。如果您只有几个或甚至100 GB的数据,像PostgreSQL这样的数据库可能会是更好的选择。但是,如果不知道您的用例,很难给出任何建议。 - kostya
Spark被一些人用来处理PB级别的数据。我相信Spark能够并行处理来自任何支持的源的数据,包括JDBC。我有大约250GB的数据需要处理,可以将其分区为大约1GB大小的文件以便并行运行。 - BAR
这些数据需要多久处理一次?它们更新的频率是多少?如果您的数据存储在数据库中,您将不得不将其“加载”到Spark中。加载过程可以并行化,但您仍然需要通过网络传输250GB的数据。整个数据传输和在多个主机上运行分析的过程是否比SQL查询更快?硬件要求如何? - kostya
它如何并行化JDBC数据库?只要不调用“load()”,Spark就不会将所有数据加载到内存中,对吗? - BAR
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接