前言
以前自己搭过一个azkaban的环境,但是过了很久后再重头搭建时发现了写不可思议的坑。下面记录下!
报错信息
Exception in thread “main” java.lang.NoClassDefFoundError: Could not
initialize class org.apache.derby.jdbc.AutoloadedDriver40 at
java.lang.Class.forName0(Native Method) at
java.lang.Class.forName(Class.java:348) at
java.sql.DriverManager.isDriverAllowed(DriverManager.java:556) at
java.sql.DriverManager.isDriverAllowed(DriverManager.java:548) at
java.sql.DriverManager.getDrivers(DriverManager.java:446) at
org.apache.commons.dbcp.BasicDataSource.(BasicDataSource.java:57)
at
azkaban.database.DataSourceUtils.getMySQLDataSource(DataSourceUtils.java:98)
at
azkaban.database.DataSourceUtils.getDataSource(DataSourceUtils.java:76)
at
azkaban.database.AbstractJdbcLoader.(AbstractJdbcLoader.java:63)
at
azkaban.executor.JdbcExecutorLoader.(JdbcExecutorLoader.java:59)
at
azkaban.execapp.AzkabanExecutorServer.createExecLoader(AzkabanExecutorServer.java:125)
at
azkaban.execapp.AzkabanExecutorServer.(AzkabanExecutorServer.java:98)
大体意思就是找不到derby的自动载入驱动类!
分析原因
- azkaban在启动时因为检测到hive环境,如果有hive环境就加载hive的lib下所有的jar包!意思是在azkaban启动的时候没有加载hive时,hive没有找到derby,因为hive默认元数据交由derby来管理!
- 主要原因可能是hive高版本的bug,笔者在之前用hive低版本是没有出现该bug!
- 或者是azkaban的版本过低,调用的是hive老的api进行初始化,所以造成hive还会去寻找derby!
下面图是azkaban-executor启动脚本里的截图
解决办法
方法一
查询本机中是否有现成的jar包,这个驱动类是在一个名为derby.jar的包中,所以我先查询。
sudo find / -name derby.jar
很快查到了路径,我的是在jdk中。
然后软链接到executor和web的lib中
ln -s /opt/module/jdk1.8.0_144/db/lib/derby.jar /opt/module/azkaban/executor/lib/
ln -s /opt/module/jdk1.8.0_144/db/lib/derby.jar /opt/module/azkaban/web/lib/
方法二
将hive里的derby的jar包复制到executor的extlib中!