单个 Executor 正在处理巨大的多行 Json 文件

Posted

技术标签:

【中文标题】单个 Executor 正在处理巨大的多行 Json 文件【英文标题】:Huge Multiline Json file is being processed by single Executor 【发布时间】: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 列

【问题讨论】:

【参考方案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,你可以看到下面这句话。

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

【讨论】:

以上是关于单个 Executor 正在处理巨大的多行 Json 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl 从巨大的存档中提取单个

优化巨大的 JSON 响应

将单个逗号分隔的行转换为多行

如何使用 eloquent/fluent 从单个查询中更新多行?

PDO Prepared在单个查询中插入多行

在 DOS 批处理文件中注释多行