[大数据][spark]关于提交spark任务 mysql驱动包成功上传。同样的命令同样的代码确有一个报找不到mysql驱动包的问题,scala坑记录

问题描述

因为买了新电脑。我将原来电脑里面的spark代码移植到新电脑上。同样的代码。同样的打包流程。发布到测试环境上同样的spark命令

spark-submit --driver-class-path a.jar --class ...   --master yarn --deploy-mode client  --num-executors 2 --executor-cores 2 --executor-memory 4G --driver-memory  8G --jars mysql-connector-java-5.1.5-bin.jar a.jar 

在执行mysql创建连接时class.forname(driver) 找不到class

问题原因。

更新:发现新的原因。在打scala成jar包时需要将MF文件打进去。里面包含classpath。具体为什么我还在探究。因为原本我们在本地起java的时候只需要制定classpath就行了。提交spark任务时只是上传了依赖包并没有制定在spark内部的classpath,我想应该是需要在参数里面再增加spark的classpath就可以了。

 

经过了很多次的捣鼓之后发现这个问题非常棘手。没那么容易。怀疑spark有点bug。现将问题解决过程和最终办法整理如下:

在将MF文件打入jar包重新提交spark任务时任务正常。于是怀疑提交任务的时候还需要制定classpath。

原先我认为 jar里面classpath就应该加上了。于是查了官方文档并在反复实验下发现一个问题

如果说指定了driver-class-path。那就会按照指定的来。而不会按照jar来。于此同时还有另一个参数和该参数类似那就是

spark.driver.extraClassPath="mysql-connector-java-5.1.24-bin.jar:/opt/cloudera/parcels/CDH/lib/hbase/lib/*"

这个参数需要以--conf的方式配置在命令行里面。但是他会和driver-class-path形成覆盖

所以说正常用driver-class-path就够了。

于是我将driver-class-path改成--driver-class-path a.jar,mysql-connector-java-5.1.24-bin.jar,这样后再运行。确实mysql驱动能被加载了。但是我有个放在a.jar中的Log4j的日志类提示找不到。

反复实验有这几种现象:

--driver-class-path a.jar,mysql-connector-java-5.1.24-bin.jar  mysql驱动能加载,主类能运行,a.jar中的日志类找不到

--conf spark.driver.extraClassPath="a.jar:mysql-connector-java-5.1.24-bin.jar" mysql驱动能加载,主类能运行,a.jar中的日志类找不到

--driver-class-path mysql-connector-java-5.1.24-bin.jar  mysql驱动能加载,主类能运行,a.jar中的日志类找不到

--driver-class-path a.jar  --conf spark.driver.extraClassPath="a.jar:mysql-connector-java-5.1.24-bin.jar" mysql驱动找不到,主类能运行,a.jar中的日志类能找到

自此目前得出一个实验性的结果。就是当driver-class-path指定大于1个以后。在运行时的log4j日志类就无法找到。这我估计在spark运行任务时加载classpath的机制有些问题

最终无果后只能采用如上方式

将所需要的包或者路径打进一个包里。或者将classpath写进mf打进包里面

这里切记一定不能用maven工程。因为maven工程打包是不会打进mf的

这里如果用scala 用idea建普通工程。然后用idea的方式打普通包就可以了

 

目前除了以上还没有发现更好的解决方法。如果有小伙伴对这方面spark的运行机制有更深入的了解希望能给我解答疑惑。

posted @ 2020-12-09 18:06  逍遥荷包蛋  阅读(463)  评论(0)    收藏  举报