【问题标题】:Importing a large text file into Spark将大文本文件导入 Spark
【发布时间】:2018-04-05 15:19:32
【问题描述】:

我有一个 360GB 的管道分隔文本文件,压缩 (gzip)。该文件位于 S3 存储桶中。 这是我第一次使用 Spark。我知道您可以对文件进行分区,以允许多个工作节点对数据进行操作,从而获得巨大的性能提升。但是,我正在尝试找到一种有效的方法将我的一个 360GB 文件转换为分区文件。有没有办法使用多个 Spark 工作节点来处理我的一个压缩文件以对其进行分区?不幸的是,我无法控制我只是得到一个大文件的事实。我可以自己解压缩文件并将其分解为多个文件(例如 360 个 1GB 文件),但我只会使用一台机器来执行此操作,而且速度会很慢。我需要使用 Spark 对数据进行一些昂贵的转换,所以我认为对文件进行分区是必要的。我在 Amazon Glue 中使用 Spark,所以我知道它可以扩展到大量机器。另外,我正在使用 python (pyspark)。

谢谢。

【问题讨论】:

  • 您已经知道要如何分区了吗?您是否已经有一个好的分区候选者(列)?您希望将来如何处理这些数据?
  • 是的,数据有DMA。有 210 个 DMA。这并不完美,因为某些 DMA 会比其他 DMA 拥有更多的数据,但我认为这是我最好的选择。不过,我的问题是如何有效地处理这个 360GB 的文件。
  • 但是这个 CSV 文件不是已经分区了吗?它是如何写入/保存的?
  • 不,我正在导入的文件没有分区。这是一个单独的 gzip 压缩的 360GB 管道分隔文件。
  • 不幸的是,我没有使用 S3 存储的经验。是否可以使用 S3 方法对其进行分区?我不认为你可以从使用 Spark 中受益,除非这个文件无论如何都被分区了,这样你就可以使用多个工作人员来处理它。分区后 - 您可以通过 DMA 列重新分区

标签: apache-spark pyspark bigdata


【解决方案1】:

一种可能的解决方案是使用 Amazon's S3DistCp 作为 EMR 集群上的一个步骤,将 360GB 文件复制到集群上可用的 HDFS 文件系统中(这需要在 EMR 上部署 Hadoop)。

S3DistCp 的一个好处是您可以更改输出文件的编解码器,并将原始 gzip 文件转换为允许 Spark 为其 RDD 生成多个分区的格式。

但是我不确定 S3DistCp 执行操作需要多长时间(这是 S3 上的 Hadoop Map/Reduce。从 EMR 运行时,它受益于优化的 S3 库,但我担心 Hadoop 会在生成 Map 任务时面临与 Spark 相同的限制)。

【讨论】:

    【解决方案2】:

    首先我建议你必须使用带有 zlib 压缩的 ORC 格式,这样你就可以得到将近 70% 的压缩率,并且根据我的研究,ORC 是最适合最快数据处理的文件格式。所以你必须加载你的文件并简单地将它写入带有重新分区的orc格式。

    df.repartition(500).write.option("compression","zlib").mode("overwrite").save("testoutput.parquet")
    

    【讨论】:

    • 您可以根据您的数据大小更改重新分区值。
    【解决方案3】:

    如果我没记错的话,如果您使用 SparkContext.textFile 读取文件,Spark 会使用 Hadoop 的 TextInputFormat。如果设置了压缩编解码器,TextInputFormat 通过检查代码是否为SplittableCompressionCodec 的实例来确定文件是否可拆分。

    我相信 GZIP 是不可拆分的,Spark 只能生成一个分区来读取整个文件。

    你可以做的是:
    1. 在SparkContext.textFile 之后添加一个重新分区,这样您至少有一个以上的转换处理部分数据。
    2. 请求多个文件,而不仅仅是一个 GZIP 文件
    3. 编写一个应用程序,在运行 Spark 应用程序之前将文件解压缩并拆分为多个输出文件。
    4. 为 GZIP 编写自己的压缩编解码器(这有点复杂)。

    看看这些链接:

    TextInputFormat source code for TextInputFormat
    GzipCodec source code for GZIPCodec

    这些在 java 中,但我确信它们有等效的 Python/Scala 版本。

    【讨论】:

    • 您还可以将压缩类型更改为可拆分的压缩类型,例如 BZip2
    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 2022-12-09
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多