当前位置: 代码迷 >> 综合 >> azkaban中遇到Could not initialize class org.apache.derby.jdbc.AutoloadedDriver40
  详细解决方案

azkaban中遇到Could not initialize class org.apache.derby.jdbc.AutoloadedDriver40

热度:72   发布时间:2023-11-22 16:17:29.0

前言

以前自己搭过一个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中!

  相关解决方案