Apache Spark:生成的文件在工作节点而不是主节点上创建

时间:2018-02-28 14:26:58

标签: apache-spark yarn mesos

我在本地pc上配置一个主服务器,在virtualbox中配置一个工作节点,结果文件一直在工作节点创建,发送回主节点的实例,我想知道为什么会这样。

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

我使用spark2.2。 我对master和worker节点使用相同的用户名。 我还配置了没有密码的ssh 我尝试了 - 部署模式客户端 - 部署模式群集
我尝试了一次,然后切换了主/工作节点,我得到了相同的结果。

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()

但为什么我必须在主节点和工作节点的同一位置预先发送文件?我现在不使用纱线或中号。

1 个答案:

答案 0 :(得分:1)

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

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

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