Spark Submit YARN集群模式SQLServer驱动缺失,需全节点复制Jar包?
解决Spark Cluster模式下SQLServer驱动找不到的问题
这个问题我太熟了,YARN Cluster模式下Jar包的分发逻辑和Client模式确实不一样,踩过好几次坑!
首先给你明确答案:不需要把sqljdbc42.jar复制到所有数据节点的/usr/hdp/current/hadoop-yarn-client/lib/目录——这么做确实能解决问题,但绝不是最优解,维护起来太麻烦,节点多的话简直是噩梦。
为什么会出现这个错误?
- Client模式下,Spark Driver是在你提交命令的本地机器上启动的,你把Jar包放到本地
/usr/hdp/current/spark2-client/jars/,Driver自然能加载到驱动类。 - Cluster模式下,Driver是在YARN集群的某个数据节点上启动的,你用
--jars参数时如果路径不对,YARN没法把Jar包分发到Driver所在的容器,就会抛出ClassNotFoundException。
更优的解决方案(按推荐程度排序)
1. 用HDFS路径指定--jars参数
把sqljdbc42.jar上传到HDFS的某个公共路径,比如hdfs:///user/spark/lib/sqljdbc42.jar,然后提交命令改成:
spark-submit --master yarn --deploy-mode cluster --jars hdfs:///user/spark/lib/sqljdbc42.jar sqlserver.py
YARN会自动把HDFS上的Jar包分发到所有需要的节点容器里,不需要手动同步任何节点,最省心。
2. 用--packages自动拉取依赖(推荐)
如果你的SQLServer驱动能在Maven中央仓库找到(比如官方的mssql-jdbc包),直接用--packages参数让Spark自动下载分发:
spark-submit --master yarn --deploy-mode cluster --packages com.microsoft.sqlserver:mssql-jdbc:9.4.1.jre8 sqlserver.py
替换成你需要的版本号就行,Spark会自动处理Jar包的下载、分发和类加载,完全不用手动管理Jar文件。
3. 同步Jar包到所有节点的Spark全局Jar目录
如果上面两种方式都不适用,你可以把sqljdbc42.jar复制到所有数据节点的/usr/hdp/current/spark2-client/jars/目录(用Ansible、scp批量操作),这样不管是Client还是Cluster模式,Spark启动时都会自动加载这个Jar包,比放到YARN的lib目录更合理,因为这是Spark的数据库驱动,属于Spark的依赖范畴。
内容的提问来源于stack exchange,提问作者vishal
相关产品推荐
相关产品推荐

