Spark foreachPartition仅在主服务器上运行

时间:2019-06-21 15:21:05

标签: java apache-spark google-cloud-dataproc data-processing

我有一个DataProc集群,其中有一个主机和4个工人。 我有这份火花工作:

JavaRDD<Signal> rdd_data = javaSparkContext.parallelize(my_data, 8);

rdd_data.foreachPartition(partitionOfRecords -> {
    println("Items in partition-" + partitionOfRecords.count(y=>true));
    })

my_data是一个包含约1000个元素的数组。 群集上的作业以正确的方式启动并返回正确的数据,但它仅在主服务器上运行,而不在工作线程上运行。 我在集群中的每台计算机上都使用了dataproc image 1.4

任何人都可以帮助我理解为什么这项工作只能在master上进行吗?

2 个答案:

答案 0 :(得分:2)

这里有两个景点:

  1. 仅在执行程序与运行Spark程序的客户端位于同一节点的情况下,行println("Items in partition-" + partitionOfRecords.count(y=>true));将显示预期结果。发生这种情况是因为println命令在幕后使用stdout流,该流只能在同一台机器上访问,因此无法将来自不同节点的消息传播到客户端程序。
  2. 将master设置为local [1]时,您将强制Spark使用一个线程在本地运行,因此Spark和客户端程序使用相同的stdout流,并且您可以看到程序输出。这也意味着驱动程序和执行程序是同一节点。

答案 1 :(得分:1)

我在额外的Spark配置中找到了master local [1]!现在它可以正常工作了!