1. 前言
前段时间因生产需要,需将 Spark2.1 版本升级到 2.4 版本。但由于升级方式存在问题:
- 并不是将 2.1 版本 jars 目录下的 jar 包全部替换成 2.4 版本的,只是替换了 spark 开头的 jar 包;
- jars 目录下存在自己放进去的一些 jar 包
2. 问题定位
-
报错内容
-
解决
-
将 jars 目录下的相关 jar 包替换为 Spark2.4 依赖的 jar 包,再次运行
查看日志发现报错19/11/17 18:20:51 WARN support.ClassPathXmlApplicationContext: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'kafkaProducerServer': Unsatisfied dependency expressed through field 'kafkaTemplate'; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.apache.commons.pool2.impl.GenericObjectPoolConfig] for bean with name 'rcPoolConf' defined in class path resource [conf/bigdata-bean.xml]; nested exception is java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig 19/11/17 18:20:51 ERROR yarn.ApplicationMaster: User class threw exception: java.lang.ExceptionInInitializerError java.lang.ExceptionInInitializerError at cn.strong.leke.bigdata.app.largescreen.CoverageConditionStatApp.main(CoverageConditionStatApp.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:678) Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'kafkaProducerServer': Unsatisfied dependency expressed through field 'kafkaTemplate'; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.apache.commons.pool2.impl.GenericObjectPoolConfig] for bean with name 'rcPoolConf' defined in class path resource [conf/bigdata-bean.xml]; nested exception is java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig
-
定位
nested exception is java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig
-
分析
应该是缺少 org.apache.commons.pool2 这个依赖所致
去Spark2.4 jars 目录下查看,果真没发现这个 jar 包,只有 commons-pool-1.5.4.jar
解决:将 commons-pool2-2.4.2.jar 放到 jars 目录下
(原因:这个包在程序里是创建 RedisPool 使用到的,Spark 所依赖的 jar 包并没有这一个)
结果:再次运行,SUCCEEDED
-
3. 总结
-
Spark 的 jars 目录下尽量不要放入自己的包,Spark自带什么就是什么,方便以后 Spark 的升级;
-
自己用到的 jar 包
- 如果很少,可通过 --jars 传进去;
- 如果较多,可通过 --package a:g:v 去下载,或者将所需依赖通过maven的插件打包进去,这样包会很大(所谓的胖包);
- 具体采用哪种看公司要求。