【问题标题】:Spark application uses only 1 executorSpark 应用程序仅使用 1 个执行器
【发布时间】:2017-01-28 22:37:49
【问题描述】:

我正在使用以下代码运行应用程序。我不明白为什么只有 1 个执行器在使用,即使我有 3 个。当我尝试增加范围时,我的工作失败导致任务管理器失去执行器。 在总结中,我看到 shuffle writes 的值,但 shuffle reads 为 0(可能是因为所有数据都在一个节点上,并且不需要发生 shuffle read 来完成作业)。

val rdd: RDD[(Int, Int)] = sc.parallelize((1 to 10000000).map(k => (k -> 1)).toSeq)
val rdd2= rdd.sortByKeyWithPartition(partitioner = partitioner)
val sorted = rdd2.map((_._1))
val count_sorted = sorted.collect()

编辑:我增加了执行程序和驱动程序的内存和内核。我还将执行者的数量从 4 个更改为 1 个。这似乎有所帮助。我现在看到每个节点上的随机读取/写入。

【问题讨论】:

  • 你是在集群模式还是单机模式下运行?您是在本地运行还是在某个集群上运行?
  • 我在集群模式下运行。

标签: scala apache-spark distributed-computing partitioning executors


【解决方案1】:

..可能导致所有数据都在一个节点上

这应该会让您认为您的 RDD 只有一个分区,而不是 3 个或更多,最终会利用所有执行程序。

所以,根据 Hokam 的回答,我会这样做:

rdd.getNumPartitions

现在如果是 1,那么重新分区你的 RDD,像这样:

rdd = rdd.repartition(3) 

这会将你的 RDD 分成 3 个分区。

现在再次尝试执行您的代码。

【讨论】:

    【解决方案2】:

    看起来您的代码最终只有一个用于 RDD 的分区。您应该将 RDD 的分区增加到至少 3 个,以利用所有 3 个执行器。

    【讨论】:

    • 很好的预感,+1 和我的回答。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2019-04-01
    • 2021-12-29
    • 2018-03-25
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多