解决Oozie运行时类未找到错误:OozieLauncherOutputCommitter缺失
在使用Oozie执行任务时,遇到以下异常堆栈信息,表明 OozieLauncherOutputCommitter 类在运行时无法被加载:
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.oozie.action.hadoop.OozieLauncherOutputCommitter not found
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2227)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$1.call(MRAppMaster.java:481)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$1.call(MRAppMaster.java:458)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.callWithJobClassLoader(MRAppMaster.java:1560)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.createOutputCommitter(MRAppMaster.java:458)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.serviceInit(MRAppMaster.java:377)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$4.run(MRAppMaster.java:1518)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.initAndStartAppMaster(MRAppMaster.java:1515)
at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.main(MRAppMaster.java:1448)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.oozie.action.hadoop.OozieLauncherOutputCommitter not found
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2219)
... 12 more
Caused by: java.lang.ClassNotFoundException: Class org.apache.oozie.action.hadoop.OozieLauncherOutputCommitter not found
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2101)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193)
该错误的根本原因通常是 Oozie 的共享库(sharelib)未正确部署到 Hadoop 集群的文件系统中,导致Hadoop的 MRAppMaster 在创建输出提交器时无法定位所需的类。
诊断步骤
首先,通过以下命令检查 Oozie 共享库的当前状态:
oozie admin -oozie http://{oozie-host}:11000/oozie -shareliblist
如果返回结果中包含以下组件列表,则说明共享库配置正常:
hive
distcp
mapreduce-streaming
spark
oozie
hcatalog
hive2
sqoop
pig
若列表为空或未显示任何组件,则说明共享库尚未创建或存在问题。
解决方案:重建并更新共享库
1. 找到 Oozie 安装目录下的 share 文件夹(通常位于 /usr/lib/oozie 或自定义路径中),将其打包为一个压缩文件:
tar zcf share.tar.gz share
2. 使用 oozie-setup.sh 脚本将打包后的共享库上传到 HDFS 指定路径:
./bin/oozie-setup.sh sharelib create -fs hdfs://hadoop01:8020 -locallib share.tar.gz
上述命令会自动创建 /user/oozie/share/lib 目录(若不存在)并将 share.tar.gz 的内容解压至该路径。
3. 执行共享库更新命令,使 Oozie 服务重新加载最新配置:
oozie admin -oozie http://{oozie-host}:11000/oozie -sharelibupdate
4. 再次执行 oozie admin -shareliblist 命令,确认组件列表已正常出现。
原因分析
此问题通常发生在 Oozie 共享库未被正确同步到 HDFS 的情况下。当 /user/oozie/share/lib 目录缺失或内容不完整时,Hadoop 的 MRAppMaster 无法在类路径中找到 org.apache.oozie.action.hadoop.OozieLauncherOutputCommitter,从而抛出 ClassNotFoundException。确保共享库正确部署即可解决该问题。