Hive啓動時,報錯無法找到class,如java.lang.NoClassDefFoundError
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/ql/CommandNeedRetryException
at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:274)
at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.ql.CommandNeedRetryException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 3 more
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:274)
at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 3 more
分析:
這類問題很可能是由環境配置導致導致的問題,回想最近都沒有改動Hive的相關配置文件,動的只有hadoop 裏的配置。
想起之前用hadoop編譯Java 文件測試,修改過hadoop/conf/ 下的 hadoop-env.sh ,增加了以下內容:
export HADOOP_CLASSPATH=/home/suh/hadoop-1.2.1/myclass
確實問題就是由這個引發的,hive連接到hadoop集羣需要找到類,這個類包的路徑就是通過HADOOP_CLASSPATH 環境變量來指定的,我將其指向了個空目錄,啓動hive的時候當然就包各種類無法找到的問題。
解決方案:
修改配置文件hadoop/conf/ hadoop-env.sh,將HADOOP_CLASSPATH原來的值改爲如下,重啓hadoop集羣,然後啓動hive,啓動成功。
export HADOOP_CLASSPATH=.:$CLASSPATH:$HADOOP_CLASSPATH:$HADOOP_HOME/bin