[大数据][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的运行机制有更深入的了解希望能给我解答疑惑。

浙公网安备 33010602011771号