首页 > 解决方案 > Spark Standalone 不适用于本地文件系统

问题描述

我正在使用基于spark-base容器的spark-worker容器。

我该如何解决异常:

org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/README.md

主.java

        context = new SparkContext(
                new SparkConf()
                        .setAppName("Test App")
                        .setMaster("spark://spark-master:7077")
                        .set("spark.executor.memory", "1g")
                        .setJars(new String[] { "target/spark-docker-1.0-SNAPSHOT.jar" })
        );

        String path = "file:///README.md";

        // EXCEPTION HERE!!!
        List<Tuple2<String, Integer>> output = context.textFile(path, 2) 
         ...

我的 Docker 容器没有设置 HDFS,所以我希望它们能与每个spark-worker. 我对每个工人做了:

shell> docker exec -it spark-worker-# bash
shell> touch README.md

码头工人-compose.yml

# No HDFS or file system configurations!

version: '3.3'
services:
  spark-master:
    image: bde2020/spark-master
    container_name: spark-master
    ports: ['8080:8080', '7077:7077', '6066:6066']
  spark-worker-1:
    image: bde2020/spark-worker
    container_name: spark-worker-1
    ports: ['8082:8081']
    depends_on:
      - spark-master
    environment:
      - "SPARK_MASTER=spark://spark-master:7077"
  spark-worker-2:
    image: bde2020/spark-worker
    container_name: spark-worker-2
    ports: ['8083:8081']
    depends_on:
      - spark-master
    environment:
      - "SPARK_MASTER=spark://spark-master:7077"

标签: dockerapache-spark

解决方案


Spark 可以处理本地文件,但这意味着您必须在集群中的每个节点(包括驱动程序)上提供文件的副本。

另外"file:///README.md" 是文件系统根目录中的路径,因此请确保这是您创建文件的位置,并且用户具有正确的访问权限。

使用本地文件的最简单方法是分发它SparkFiles

还要记住,正确的写入需要分布式存储 - 将数据帧保存到本地文件系统会导致空结果

如果您想同时支持写入和读取,只需使用工作人员之间共享的 Docker 卷。


推荐阅读