【问题标题】:Huge Multiline Json file is being processed by single Executor单个 Executor 正在处理巨大的多行 Json 文件
【发布时间】:2019-08-17 21:40:09
【问题描述】:

我有一个 35-40GB 大小的巨大 json 文件,它是 hdfs 上的 MULTILINE JSON。我已经使用了.option('multiline', 'true').read.json('MULTILINE_JSONFILE_.json').repartition(50) 使用 Pyspark。

我增加了 60 个执行器、16 个内核、16GB Ememory 并设置了内存开销参数。 Executor 的每次运行都会丢失。

它非常适用于较小的文件,但不适用于 > 15 GB 的文件 我有足够的集群资源。

从我看到的 spark UI 中,每次数据由单个执行器处理时,所有其他执行器都处于空闲状态。

我看过阶段(0/2)任务(0/51)

我也重新分区了数据。

代码:

spark.read.option('multiline', 'true').read.json('MULTILINE_JSONFILE_.json').repartition(50)
df.count()
df.rdd.glom().map(len).collect()
df.write.... (HDFSLOCATION, format='csv')

目标:我的目标是对每一列应用 UDF 函数并清理数据并写入 CSV 格式。 数据框大小为 800 万行,210 列

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    根据经验,Spark 的并行度基于输入文件的数量。但是您只指定了 1 个文件 (MULTILINE_JSONFILE_.json),因此 Spark 将使用 1 个 cpu 来处理以下代码

    spark.read.option('multiline', 'true').read.json('MULTILINE_JSONFILE_.json')
    

    即使你有 16 个核心。

    我建议您将一个 json 文件拆分为多个文件。


    更准确地说,如果文件存储在 HDFS 上,并行性基于文件块的数量。如果MULTILINE_JSONFILE_.json 是 40GB,如果块大小是 128MB,它可能有超过 400 个块。因此,如果文件位于 HDFS 中,Spark 任务应该并行运行。如果你坚持并行,我认为这是因为指定了option("multiline", false)

    In databricks documentation,你可以看到下面这句话。

    文件将作为一个整体加载,不能拆分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 2013-09-28
      • 2023-02-02
      • 1970-01-01
      • 2010-11-13
      相关资源
      最近更新 更多