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異常,出現如標題所示的異常。
軟件版本

軟件 版本
HDP 2.6.4.0-91
Spark 1.6.3
Hadoop 2.7.3

1. 思路第一步

  1. 首先查找此類,此類是在datanucleus-api-jdo.jar中的,如下圖所示;
    JDOPersistenceManagerFactory
  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. 經過實驗,此方案可行!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章