单个 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 文件的主要内容,如果未能解决你的问题,请参考以下文章