Docker部署Spark集群提交任务失败:FileSystem scheme:C异常求助
Spark Submit Error: No FileSystem for scheme: C When Submitting to Dockerized Cluster
我之前也碰到过一模一样的问题,这完全不是你的业务代码问题,核心原因是Windows本地路径格式和Docker Spark集群的Linux环境不兼容。
问题根源
你提交命令里用的/c/Users/...是Windows风格的路径,但Docker里的Spark集群运行在Linux环境下:
- Hadoop的FileSystem组件根本不识别
C这个文件系统协议,它只支持Linux本地文件系统、HDFS、S3这类存储协议; - 集群里的worker节点没有访问你Windows本地C盘的权限,自然找不到这个jar包。
另外,那个NativeCodeLoader的警告和这个错误完全无关——它只是Hadoop没找到对应平台的本地库,不影响核心功能,不用理会。
解决方法
最稳妥的方案是把jar包放到Docker集群能访问到的共享目录里,步骤如下:
挂载本地目录到Spark容器
启动docker-spark的master和worker容器时,通过-v参数把Windows本地存放jar的目录挂载到容器内的固定路径。比如:# 启动Spark Master并挂载本地jar目录 docker run -d -v /c/Users/shams/Documents/Appunti/iot-demo-app/spark-streaming/target/scala-2.11:/opt/spark/my-jars -p 7077:7077 -p 8080:8080 bde2020/spark-master:2.4.0-hadoop2.7 # 启动Spark Worker时也要挂载同一个本地目录 docker run -d -v /c/Users/shams/Documents/Appunti/iot-demo-app/spark-streaming/target/scala-2.11:/opt/spark/my-jars --link spark-master:spark-master bde2020/spark-worker:2.4.0-hadoop2.7这里把你本地的jar目录挂载到了容器内的
/opt/spark/my-jars路径。使用容器内路径提交任务
修改spark-submit命令,用容器内的路径指定jar包:./spark-submit.cmd --class KafkaConsumer --master spark://docker-host:7077 /opt/spark/my-jars/spark-streaming-assembly-1.0.jar
替代方案:local://协议(谨慎使用)
如果你的Windows机器和Docker集群在同一网络,也可以用local://协议指向本地jar的绝对路径,比如:
./spark-submit.cmd --class KafkaConsumer --master spark://docker-host:7077 local:///c/Users/shams/Documents/Appunti/iot-demo-app/spark-streaming/target/scala-2.11/spark-streaming-assembly-1.0.jar
但这种方式容易遇到权限和网络共享问题,还是挂载目录的方法更稳定。
内容的提问来源于stack exchange,提问作者Matteo Tosato
相关产品推荐
相关产品推荐

