Apache Spark:在工作节点而不是主节点上创建结果文件

Apache Spark: resulting file being created at worker node instead of master node

我在本地 pc 上配置了一个主节点,在 virtualbox 中配置了一个工作节点,结果文件一直在工作节点上创建,而不是发送回主节点,我想知道这是为什么。

因为我的工作节点无法将结果发送回主节点?如何验证?

我用的是spark2.2。 我对主节点和工作节点使用相同的 username。 我还配置了无密码的ssh。
我尝试了 --deploy-mode client--deploy-mode cluster
我尝试了一次,然后我切换了 master/worker 节点,我得到了相同的结果。

val result = joined.distinct()
result.write.mode("overwrite").format("csv")
      .option("header", "true").option("delimiter", ";")
      .save("file:///home/data/KPI/KpiDensite.csv")

此外,对于输入文件,我这样加载:

val commerce = spark.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema", "true")
  .option("delimiter", "|").load("file:///home/data/equip-serv-commerce-infra-2016.csv").distinct()

但是为什么我必须在同一位置的主节点和工作节点上预置文件?我现在不使用 yarn 或 mesos。

您正在导出到本地文件系统,这会告诉 Spark 在机器的文件系统上写入它 运行 代码。在 worker 上,这将是 worker 机器的文件系统。

如果你想让数据存储在驱动程序的文件系统中(不是master,你需要知道驱动程序在你的纱线集群上的位置运行),那么你需要收集RDD 或数据帧并使用普通的 IO 代码将数据写入文件。

然而,最简单的选择是使用分布式存储系统,例如 HDFS (.save("hdfs://master:port/data/KPI/KpiDensite.csv")) 或导出到数据库(写入 JDBC 或使用 nosql 数据库);如果您 运行 您的应用程序处于集群模式。