【问题标题】:Decrease number of tasks in a Spark stage减少 Spark 阶段中的任务数量
【发布时间】:2022-02-11 07:06:47
【问题描述】:

我在 aws EMR 中运行 spark sql 作业,它从 s3 读取约 100k 小 JSON 文件,进行一些转换,然后将结果写回 s3。我已将随机分区和默认并行度设置为 20,将执行程序内存设置为 4GB。然而,对于一个阶段 javaToPython at NativeMethodAccessorImpl.java,如 UI 所示,我理解写入 s3,有近 2.7k 任务,输入数据大小 collect 操作的阶段的相同行为。我不明白为什么?我在这里想念什么? 我还通过减少应用程序中的分区数量(使用合并)来测试应用程序,但似乎没有任何改变。我正在运行 pyspark 2.4.7 和 EMR-5.33.1

【问题讨论】:

  • 你能分享你的代码和来自 spark UI 的所有配置吗?

标签: amazon-web-services apache-spark task amazon-emr stage


【解决方案1】:

我认为要了解您所观察到的内容,您需要了解您的集群详细信息和配置。

您的应用程序中的一些假设:

  • 您没有在应用程序中实现线程

任务数由并行度(并发任务总数)定义——由

  • 执行者数量
  • 每个执行器的核心数
  • 分区数

请阅读how stages are split into tasks

这样 - 另一个想法是你提到的

~100k 小 JSON 文件

如果您还没有,请务必查看并了解Small Files Problem

调用的部分

  1. 小文件的危害

国家

  1. 很容易导致任务过多。如果超过参数spark.driver.maxResultSize(默认1g)的配置,则 会抛出以下异常,影响任务的处理 原因:org.apache.spark.SparkException:作业因阶段而中止 失败:478 个任务(2026.0 MB)的序列化结果总大小为 大于 spark.driver.maxResultSize (1024.0 MB) 当然,你可以 增加 spark.driver.maxResultSize 的默认配置为 解决问题,但如果你不能解决小文件问题 源,你以后可能会遇到类似的问题。

另外,Spark 在处理任务时,会为一个分区分配一个 任务进行处理,多个分区在处理 平行。虽然并行处理可以改善处理 效率,并不是说任务越多越好。如果 数据量小,任务太多会影响效率。

了解如何创建任务(配置方面和应用方面)+ Spark 应用程序试图摄取的内容,将帮助您了解您的应用程序在做什么。

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 2013-07-05
    • 2016-09-28
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多