Spark应用程序仅使用1个执行程序

时间:2016-09-20 21:02:34

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

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

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.这似乎有所帮助。我现在看到每个节点上的随机读/写。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

  

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

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

所以,继续Hokam的回答,这就是我要做的事情:

rdd.getNumPartitions

现在如果是1,那么重新分区您的RDD,如下所示:

rdd = rdd.repartition(3) 

将您的RDD划分为3个分区。

现在再次尝试执行代码。