Spark作业无法读取HDFS中Jar包问题求助
你遇到的核心问题是spark-submit命令中指定的Jar路径被识别为本地文件系统路径,但你的Jar实际存储在HDFS上,不管是client还是cluster模式,Spark都会尝试从本地加载Jar,自然找不到。
快速解决方案
修正你的spark-submit命令,将Jar路径改为HDFS的完整URL格式(如果已经配置HDFS默认文件系统,也可以简化为hdfs:///spark/wc.jar):
spark-submit --deploy-mode client --master yarn --class com.main.WordCount hdfs://<你的NameNode主机名>:<端口>/spark/wc.jar
比如如果NameNode在hadoop-master,端口是默认的9000,命令就是:
spark-submit --deploy-mode client --master yarn --class com.main.WordCount hdfs://hadoop-master:9000/spark/wc.jar
报错原因详解
Client部署模式报错
Warning: Local jar /spark/wc.jar does not exist, skipping.
java.lang.ClassNotFoundException: com.main.WordCount
当使用client模式时,Spark驱动程序运行在你提交命令的本地机器上,它会尝试从本地文件系统加载/spark/wc.jar。由于这个Jar实际在HDFS上,本地找不到,所以Spark跳过加载这个Jar,自然找不到主类com.main.WordCount。
Cluster部署模式报错
Exception in thread "main" java.io.FileNotFoundException: File file:/spark/wc.jar does not exist
cluster模式下,Spark驱动程序会运行在YARN的Application Master节点上。提交命令时,YARN Client会尝试把你指定的Jar从本地复制到YARN的资源管理目录,但它依然把/spark/wc.jar当成本地路径,而AM所在的节点本地并没有这个文件,因此抛出文件找不到的异常。
额外优化建议
你的代码中手动设置了setMaster("yarn"),其实可以去掉——spark-submit命令行的--master yarn参数会覆盖代码中的配置,这样代码更灵活,适配不同的部署模式。
内容的提问来源于stack exchange,提问作者Kumar Harsh

