Spark-submit执行jar包报FileNotFoundException,t.txt应存放位置及读取路径是什么?
问题核心原因
你当前使用的Source.fromFile("t.txt")是读取执行进程当前工作目录下的本地文件,spark-submit运行时,Driver和Executor的工作目录并非你的项目源码目录,且集群模式下Executor运行在不同节点,默认无法访问你本地开发环境的文件,因此抛出找不到文件的错误。
解决方案(按优先级推荐)
方案1:将t.txt作为资源文件打入JAR包(无额外配置、本地/集群通用)
- 第一步:在项目
src/main目录下新建resources文件夹(Maven默认会将该目录下所有文件打包进JAR的classes根路径),将t.txt放入该文件夹,如果需要保持原路径就新建resources/com/sk/data目录后放入 - 第二步:修改读取代码,使用类加载器读取JAR内资源,不要使用文件读取API:
// 若文件直接放在resources根目录,路径写"t.txt";若放在resources/com/sk/data下,路径写"com/sk/data/t.txt" val resourceStream = getClass.getClassLoader.getResourceAsStream("t.txt") val wholeQuery = scala.io.Source.fromInputStream(resourceStream).mkString
- 第三步:重新执行
mvn clean package打包,直接提交生成的JAR即可
方案2:通过spark-submit参数分发文件(无需修改代码)
如果不想调整现有读取逻辑,提交时增加--files参数将文件分发到所有执行进程的工作目录:
spark-submit --class 你的主类全限定名 --files D:\SparkScalaExample\src\main\scala\com\sk\data\t.txt 你的jar包路径.jar
此时原代码Source.fromFile("t.txt")可直接正常运行。
方案3:使用共享存储(适合大文件/生产集群场景)
将t.txt上传到HDFS等共享存储,使用Spark原生API读取,示例:
val wholeQuery = spark.read.textFile("hdfs://你的namenode地址/存放路径/t.txt").collect().mkString
补充注意事项
如果仅在本地Windows环境运行Spark,直接写绝对路径时需要对反斜杠转义,比如D:\\SparkScalaExample\\t.txt,或者统一使用正斜杠D:/SparkScalaExample/t.txt。
内容的提问来源于stack exchange,提问作者Yafei Wei
相关产品推荐
相关产品推荐

