【问题标题】:Spark coalesce relationship with number of executors and coresSpark 与执行者和核心数量的关系
【发布时间】:2016-07-19 18:12:34
【问题描述】:

我提出了一个关于 Spark 的非常愚蠢的问题,因为我想澄清我的困惑。我是 Spark 的新手,仍在尝试了解它在内部是如何工作的。

假设我有一个输入文件列表(假设为 1000),我想在某处处理或写入这些文件,并且我想使用合并将我的分区数减少到 100。

现在我用 12 个执行器运行这个作业,每个执行器有 5 个核心,这意味着它运行时有 60 个任务。这是否意味着,每个任务都将在一个单独的分区上独立工作?

回合:1 12 个执行器,每个执行器有 5 个核心 => 60 个任务进程 60 分区
轮次:2 8 个执行器,每个执行器有 5 个核心 => 40 个任务

处理剩下的 40 个分区和 4 个执行器从不放置 第二次工作

或者来自同一个执行器的所有任务都将在同一个分区上工作?

回合:1:12 执行者 => 处理 12 个分区
回合:2:12 执行者 => 处理 12 个分区
回合:3:12 执行者 => 处理 12 个分区
....
....
....
回合:9(96个分区 已处理):4 个执行者 => 处理剩余的 4 个 分区

【问题讨论】:

    标签: hadoop apache-spark hadoop-yarn


    【解决方案1】:

    假设我有一个输入文件列表(假设为 1000),我想在某处处理或写入这些文件,并且我想使用合并将我的分区数减少到 100。

    在spark中默认number of partitions = hdfs blocks,由于指定了coalesce(100),Spark会将输入数据分成100个分区。

    现在我用 12 个执行器运行这个作业,每个执行器有 5 个核心,这意味着它运行时有 60 个任务。这是否意味着,每个任务都将在一个单独的分区上独立工作?

    如果你通过了,可能会通过。

    --num-executors 12:在应用程序中启动的执行器数量。

    --executor-cores 5 :每个执行程序的核心数。 1 个核心 = 1 个任务一次

    所以分区的执行会是这样的。

    第一轮

    12 个分区将由 12 个执行器处理,每个执行器有 5 个任务(线程)

    第二轮

    12 个分区将由 12 个执行器处理,每个执行器有 5 个任务(线程)
    .
    .
    .

    回合:9(已处理 96 个分区):

    4 个分区将由 4 个执行器处理,每个执行器有 5 个任务(线程)

    注意: 通常,一些执行器可能会很快完成分配的工作(各种参数,如data locality、网络 I/O、CPU 等)。因此,它将通过等待配置的调度时间来选择下一个要处理的分区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2014-08-28
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多