Java Spark foreachPartition仅在主机上运行

Java Spark foreachPartition仅在主机上运行,java,apache-spark,google-cloud-dataproc,data-processing,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));

我有一个DataProc集群,有一个主集群和4个工作集群。 我有一份有火花的工作:

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

rdd_data.foreachPartition(partitionOfRecords -> {
    println("Items in partition-" + partitionOfRecords.count(y=>true));
    })
JavaRDD rdd_data=javaSparkContext.parallelize(my_data,8);
rdd_data.foreachPartition(记录分区->{
println(“分区中的项-”+partitionOfRecords.count(y=>true));
})
其中,my_数据是一个包含大约1000个元素的数组。 集群上的作业以正确的方式启动并返回正确的数据,但它只在主服务器上运行,而不在辅助服务器上运行。 我对集群中的每台机器使用dataproc image 1.4


任何人都可以帮助我理解为什么此作业只在master上运行?

我在extra Spark配置中找到了master local[1]!现在它工作正常了

这里有两个关注点:

  • println(“分区中的项-”+partitionOfRecords.count(y=>true))
    将仅在执行器与运行Spark程序的客户端是同一节点的情况下打印预期结果。这是因为
    println
    命令在引擎盖下使用stdout流,该流只能在同一台机器上访问,因此无法将来自不同节点的消息传播到客户端程序
  • 当您将master设置为local[1]时,您强制Spark使用一个线程在本地运行,因此Spark和客户端程序使用相同的stdout流,您可以看到程序输出。这也意味着驱动程序和执行程序是同一个节点

  • 我不能轻易地复制这种行为。您是如何确定任务在主机上运行的?最好澄清这是通过Dataproc作业API还是通过spark submit的命令行调用提交的,以及是否指定了任何额外的spark属性(例如--master local[1],这将使作业使用spark的“local executor”)而不是实际的集群)。此外,了解机器类型也很重要。例如,如果问题实际上只是只使用了一个节点,而不是“主节点”,那么可能是因为在n1-standard-8 worker上运行,每个worker将有8个任务,并且所有8个分区都在一个节点上运行如果我们确实没有添加额外的spark属性,然后我怀疑这项工作应该只是增加分区的数量。对不起,伙计们,这是我的错!错误的Ctrl-C Ctrl-V集合主本地[1]。现在它工作正常了。谢谢你的时间!