如何在 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 中漂亮地打印数据框?