Apache Spark Spark-submit 从 --files 参数读取文件

cin*_*ata 6 apache-spark

我有 Spark 提交脚本如下:

spark-submit \
  --name daily_job\
  --class com.test.Bootstrapper \
  --files /home/user/*.csv\
  --conf spark.executor.memory=2g\
  --conf spark.executor.cores=2\
  --master spark://172.17.0.4:7077\
  --deploy-mode client \
  --packages com.typesafe:config:1.3.1\
  file:///home/user/workspace/spark-test/target/spark-test-0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

集群配置 - 主节点和 2 个工作节点位于不同的容器中。

作业开始后,我可以看到 csv 文件被放入:

工人:

/usr/local/spark-2.0.2-bin-hadoop2.7/work/app-20170116160937-0036/0/test.csv
Run Code Online (Sandbox Code Playgroud)

司机:

/tmp/spark-f65b2466-e419-49bd-8da7-9f2b94cbf870/userFiles-abb14b33-58b1-47d6-935e-6c2943e3d55c/test.csv
Run Code Online (Sandbox Code Playgroud)

问题是——如何正确读取这个文件?目前我正在做如下:

private var initial: DataFrame = spark.sqlContext.read
    .option("mode", "DROPMALFORMED")
    .option("delimiter", conf.delimiter)
    .option("dateFormat", conf.dateFormat)
    .schema(conf.schema)
    .csv("file:///*.csv")
Run Code Online (Sandbox Code Playgroud)

这会导致 FileNotFoundException。

Ale*_*kiy 0

如果您使用--files,文件将被放置在每个执行器的工作目录中。因此,您可以使用在提交命令中指定的相同路径来访问它们:

var initial = spark.read
    .option("mode", "DROPMALFORMED")
    .option("delimiter", conf.delimiter)
    .option("dateFormat", conf.dateFormat)
    .schema(conf.schema)
    .csv("file:///home/user/*.csv")
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 SparkContext.addFile() 和 SparkFiles.get()