Spark Standalone不适用于本地文件系统

时间:2018-08-08 15:13:23

标签: docker apache-spark

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

您能帮我解决异常吗?

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

Main.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

docker-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"

1 个答案:

答案 0 :(得分:0)

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

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

使用本地文件的最简单方法是仅使用SparkFiles

进行分发

还请记住,正确的写入需要分布式存储-Saving dataframe to local file system results in empty results

如果您想同时支持读写操作,则只需使用工作人员之间共享的Docker卷即可。