如何在 spark scala 中更快地处理 .gz 文件?

Posted

技术标签:

【中文标题】如何在 spark scala 中更快地处理 .gz 文件?【英文标题】:How to process faster on .gz files in spark scala? 【发布时间】:2020-01-09 07:49:34 【问题描述】:

我正在阅读.gz文件

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

df.createOrReplaceTempView("df")

当我进行处理时,需要花费大量时间。 怎样才能最小化?

【问题讨论】:

您从哪种类型的存储中读取这些数据?有没有存储在 HDFS 中? @airliquide,不,它不是 HDFS。它是存储在云端的单个文件。 可能是你的慢点!尝试获得更快的存储(更接近您的处理点)。大部分时间变慢都与您的云数据访问有关。 【参考方案1】:

.gzip 不是用于 Spark 的好格式,因为该压缩编解码器不可拆分。因此,Spark 必须在单个节点上处理它,而且它总是很慢。

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

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

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

我建议使用带有 Snappy 压缩的 Parquet 以获得最佳的全方位性能。

【讨论】:

【参考方案2】:

正如 cmets 中所说的那样,您应该寻求更快的存储(HDSF、S3、Alluxio ...)以获得更好的性能。

您大部分时间都在访问云存储中的数据文件。

【讨论】:

【参考方案3】:

使用可拆分的 gzip 编解码器。见https://github.com/nielsbasjes/splittablegzip/issues/2

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

我需要读取和处理而不是写入。你能在阅读和处理方面提出一些建议吗? @RaviAnandVicky 我自己没有尝试过,但是您可以尝试使用支持并行读取 gzip 的替代 gzip 编解码器,例如 this @shuvaloc ,这仍然没有解决处理时间。【参考方案5】:

所以。通常在谈到性能时,有几种改进方法:

    获得更多或更强大的硬件 使用云变得更强大 硬件 为您的工作提供更多资源。 优化您的代码。

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

由于同样的原因,增加核心数量几乎无法做得更好。虽然你可以试试。 (3) 记忆也是如此。

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

【讨论】:

以上是关于如何在 spark scala 中更快地处理 .gz 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Zeppelin/Spark/Scala 中漂亮地打印数据框?

使用 UDF 及其性能的 Spark Scala 数据集验证

Scala 与 Python 的 Spark 性能

如何使用多核处理更快地运行 glm 功能

Spark第一周

spark 特性简介下载和安装