我有一个用Java编写的很小的Spark应用程序,我正在尝试使用spark-submit
在K8s集群中运行。我用 Spark 二进制文件构建了一个映像,我的 uber-JAR 文件包含所有必要的依赖项(在/opt/spark/jars/my.jar
中),以及一个配置文件(在/opt/spark/conf/some.json
中)。
在我的代码中,我从
SparkSession session = SparkSession.builder()
.appName("myapp")
.config("spark.logConf", "true")
.getOrCreate();
Path someFilePath = FileSystems.getDefault().getPath("/opt/spark/conf/some.json");
String someString = new String(Files.readAllBytes(someFilePath));
并在readAllBytes
时从 Spark 驱动程序获取此异常:
java.nio.file.NoSuchFileException: /opt/spark/conf/some.json
如果我手动运行 Docker 映像,我绝对可以按预期看到文件/opt/spark/conf/some.json
。我的 Spark 作业以根用户身份运行,因此文件权限应该不是问题。
我一直假设,由于相同的 Docker 映像(确实存在该文件)将用于启动驱动程序(和执行程序,但我什至没有达到这一点),该文件应该可供我的应用程序使用。难道不是这样吗?为什么看不到文件?
您似乎从其中一个工作节点而不是容器中获取此异常。
确保您已指定所需的所有文件作为spark-submit
--files
选项。
spark-submit --master yarn --deploy-mode cluster --files <local files dependecies> ...
https://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management