如何在Spark Scala中更快地处理.gz文件?

问题描述 投票:-3回答:4

我正在将.gz文件读取为

val df = spark.read..format("csv")
    .option("header", "true")
    .option("delimiter", "|")
    .load("filepath.gz")

df.createOrReplaceTempView("df")

[当我进行处理时,会花费大量时间。如何将其最小化?

apache-spark apache-spark-sql spark-streaming databricks azure-databricks
4个回答
0
投票

如在注释中所说,为了澄清……您应该寻求更快的存储(HDSF,S3,Alluxio ...)以获得更好的性能。

[您花费大部分时间访问云存储中的数据文件。


0
投票

。gzip不是与Spark一起使用的好格式,因为压缩编解码器不可拆分。因此,Spark必须在单个节点上对其进行处理,并且它总是很慢。

[如果可能,我建议将压缩编解码器更改为可拆分的其他内容,或者先尝试在Spark之外对文件进行预处理,然后再转换为另一种格式,然后再尝试使用Spark处理它们。例如,您可以编写一个小型Shell脚本,该脚本将解压缩并转换文件,然后再尝试使用Spark读取它们。

有关压缩格式的更多信息,请参见:http://comphadoop.weebly.com/

顺便说一下,CSV在Spark上也不是很好的格式。如果您的记录中嵌入了换行符,则CSV也不一定是可拆分的。在这种情况下,您仍在单个节点上进行处理。

我建议将Parquet与Snappy压缩结合使用,以获得最佳的整体性能。


-1
投票

如果您的数据存储在单个csv文件中,则由单个工作程序处理。要从大规模并行处理中受益,您应该将数据拆分为多个文件或使用可拆分文件格式(例如ORC或Parquet)。

要将单个文件分割成多个文件,您可以像这样使用repartition

df.repartition(100).write.orc(location)

-1
投票

所以通常,在谈到性能时,很少有改进的方法:

  1. 获得更多或更多强大的硬件
  2. 使用云获得更强大的功能硬件
  3. 为您的工作提供更多资源。
  4. 优化代码。

根据您的情况,您几乎无法优化代码中的任何内容-只有一个文件,只有一个操作。所以4不行。

由于相同的原因,增加内核数几乎无法做得更好。虽然可以尝试。 (3)记忆力也一样。

所以基本上只剩下前两个选项。

© www.soinside.com 2019 - 2024. All rights reserved.