【问题标题】:Reading Millions of Small JSON Files from S3 Bucket in PySpark Very Slow从 PySpark 中的 S3 存储桶中读取数百万个小 JSON 文件非常慢
【发布时间】:2021-03-16 06:26:25
【问题描述】:

我在 s3 中有一个文件夹(路径 = mnt/data/*.json),其中包含数百万个 json 文件(每个文件小于 10 KB)。我运行以下代码:

df = (spark.read
           .option("multiline", True)
           .option("inferSchema", False)
           .json(path))
display(df)

问题是它非常慢。 Spark 通过一项任务为此创建一个作业。该任务似乎没有更多的执行程序运行它,这通常表示作业完成(对吗?),但由于某种原因,DataBricks 中的命令单元仍在运行。它已经像这样卡了10分钟。我觉得这么简单的事情应该不会超过 5 分钟。

注意事项:

  • 由于有数百万个 json 文件,我不能肯定地说它们具有完全相同的结构(可能存在一些差异)
  • json 文件是从同一个 REST API 网络抓取的
  • 我在某处读到 inferSchema = False 可以帮助减少运行时间,这就是我使用它的原因
  • AWS s3 存储桶已经挂载,所以绝对不需要使用 boto3

【问题讨论】:

  • 可能只是文件 I/O 慢...请注意,如果您不推断架构,默认情况下所有列都将变为字符串类型。
  • 如何知道是不是这样?如果是,如何解决?

标签: apache-spark amazon-s3 pyspark apache-spark-sql databricks


【解决方案1】:

Apache Spark 非常擅长处理大文件,但是当您在一个目录中/分布在多个目录中拥有数万个小文件(在您的情况下为数百万个)时,这将对处理时间产生严重影响(可能是 10 秒)几分钟到几小时),因为它必须读取这些小文件中的每一个。

理想的文件大小应该在磁盘中的 128 MB 到 1GB 之间,任何小于 128 MB (due spark.sql.files.maxPartitionBytes) 的文件都会解决这个 Tiny Files 问题,并将瓶颈。

您可以在中间位置以 parquet 格式将数据重写为 一个大文件使用coalesce多个偶数大小的文件使用重新分区

您可以从该中间位置读取数据以进行进一步处理,这应该可以防止任何此类由 Tiny Files 问题带来的瓶颈。

【讨论】:

    【解决方案2】:

    感谢 Anand 指出“小文件问题”,我的方法非常简单。所以我的问题是我无法提取大约 200 万个 json 文件,每个文件的大小约为 10KB。所以我无法阅读然后以镶木地板格式存储它们作为中间步骤。我得到了一个 s3 存储桶,其中包含从网络上抓取的原始 json 文件。

    无论如何,使用 python 的 zipfile 模块来了。它用于附加多个 json 文件,使每个文件至少为 128MB,最多为 1GB。效果不错!

    还有另一种方法可以使用 AWS Glue 执行此操作,但当然这需要 IAM 角色授权并且可能很昂贵,但这样做的好处是您可以直接将这些文件转换为 parquet。

    zipfile解决方案:https://docs.python.org/3/library/zipfile.html

    AWS Glue 解决方案:https://medium.com/searce/convert-csv-json-files-to-apache-parquet-using-aws-glue-a760d177b45f

    解释小文件问题的非常好的博文:

    https://mungingdata.com/apache-spark/compacting-files/

    https://garrens.com/blog/2017/11/04/big-data-spark-and-its-small-files-problem/?unapproved=252&moderation-hash=5a657350c6169448d65209caa52d5d2c#comment-252

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 2015-08-19
      • 1970-01-01
      • 2021-10-25
      • 2021-11-11
      • 2018-10-11
      相关资源
      最近更新 更多