Class org.datanucleus.api.jdo.JDOPersistenceManagerFactory was not found

Posted fansy1990

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Class org.datanucleus.api.jdo.JDOPersistenceManagerFactory was not found相关的知识,希望对你有一定的参考价值。

Class org.datanucleus.api.jdo.JDOPersistenceManagerFactory was not found

Class org.datanucleus.api.jdo.JDOPersistenceManagerFactory was not found

问题描述
一次应用程序迁移底层Hadoop集群(由CDH迁移至HDP),在发起Spark On YARN任务的时候,Spark任务连接Hive异常,出现如标题所示的异常。
软件版本

软件版本
HDP2.6.4.0-91
Spark1.6.3
Hadoop2.7.3

1. 思路第一步

  1. 首先查找此类,此类是在datanucleus-api-jdo.jar中的,如下图所示;
  2. 也就是说,在Spark On YARN调用的时候其Classpath并没有该类,考虑添加此jar包到Classpath;
  3. 此jar包在Hive的安装目录,直接把整个Hive的lib添加到Classpath;

2. 新问题及解决

  1. 添加hive的lib到Classpath后,出现如下所示的错误:
java.lang.SecurityException: sealing violation: package org.apache.derby.impl.services.timer is sealed
	at java.net.URLClassLoader.getAndVerifyPackage(URLClassLoader.java:399)
	at java.net.URLClassLoader.definePackageInternal(URLClassLoader.java:419)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:451)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)

并且会提示:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.EmbeddedDriver
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  1. 如果单看上面第二个NoClassDefFoundError,那么会认为是没有加入相应的jar包,通过查询,此类位于derby.jar中,同时在Hive的lib中是有该jar包的;
  2. 通过查询(参考:https://stackoverflow.com/questions/6454061/securityexception-sealing-violation-when-starting-derby-connection ),发现第一个错误,是由于有多个derby.jar在Classpath中导致的,所以了解到时加入了Hive的lib中的jar包后,引入的jar包过多;
  3. 在hdp中spark-client的lib包中有datanucleus-api-jdo.jar,并且没有derby.jar,可以考虑替换Hive的lib为spark-client中的lib到Classpath中;
  4. 经过实验,此方案可行!

以上是关于Class org.datanucleus.api.jdo.JDOPersistenceManagerFactory was not found的主要内容,如果未能解决你的问题,请参考以下文章

未找到类 org.datanucleus.api.jdo.PersistenceManagerFactoryClass

java中class和class有啥区别

jquery中class选择器的用法,选择两个class

class和Class

无法将 'Class::operator==' 从类型 'bool (Class::)(Class*) 转换为类型 'bool [关闭]

.class文件怎么用