【问题标题】:Apache Spark: resulting file being created at worker node instead of master nodeApache Spark:在工作节点而不是主节点上创建结果文件
【发布时间】:2018-02-28 14:26:57
【问题描述】:

我在本地电脑上配置了一个master,在virtualbox里面配置了一个worker节点,结果文件一直在worker节点上创建,发送回master节点,我想知道这是为什么。

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

我使用 spark2.2。 我对主节点和工作节点使用相同的 用户名。 我还配置了没有密码的 ssh。
我试过 --deploy-mode client--deploy-mode cluster
我试过一次,然后我切换了主/工作节点,我得到了相同的结果。

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。

【问题讨论】:

    标签: apache-spark hadoop-yarn mesos


    【解决方案1】:

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

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

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

    【讨论】:

    • 明确一点:这是因为您使用的是file 方案,它指向本地文件系统。
    • 是的,我明白你说的,本地文件系统。所以现在如果我添加更多工作节点,结果将被拆分到所有工作节点,或者有一个工作人员完成最后一个 join 并将文件保存到它?
    • 我尝试了 2 名工人,一名工人拥有所有结果。是时候试试 hdfs了。
    • @mingzhao.pro 是的,这取决于后备 RDD 中的分区。如果只有一个分区,那么只有一个文件将包含整个集群的数据。如果您想将所有数据放在一个文件中(无论存储如何),那么您需要在您的 rdd 上调用 coalesce(1),请记住,一台机器必须能够在内存中携带所有数据。
    • 奇怪的是结果折叠包含 200 个小 csv 文件,总和只有 DataSet/DataFrame,如果我转换为 2 个分区的 RDD 并保存,我的每台工作机器上都会有一部分结果吗?
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多