Hadoop錯誤集:Could not find the main class: org.apache.hadoop.*


  在搭建Hadoop機群的時候,之前遇見了很多次找不到類的錯誤,因為對Hadoop了解不深,所以就在網上漫無目的的找解決方案,所以這里總結下我用的方法。

解決辦法一:

我之前遇到了找不到

org.apache.hadoop.hdfs.tools.GetConf

org.apache.hadoop.hdfs.qjournal.server.JournalNode

org.apache.hadoop.hdfs.server.namenode.NameNode

對於上面的類,Hadoop是Java寫的,那么肯定需要JDK,啟動的時候首先會在CLASSPATH中找到jre lib,其次,還會在hadoop-config.sh中增加一些CLASSPATH,例如

# put mapred in classpath if present AND different from YARN
if [ "$HADOOP_MAPRED_HOME" = "" ]; then
  if [ -d "${HADOOP_PREFIX}/$MAPRED_DIR" ]; then
    export HADOOP_MAPRED_HOME=$HADOOP_PREFIX
  fi
fi

if [ "$HADOOP_MAPRED_HOME/$MAPRED_DIR" != "$HADOOP_YARN_HOME/$YARN_DIR" ] ; then
  if [ -d "$HADOOP_MAPRED_HOME/$MAPRED_DIR/webapps" ]; then
    CLASSPATH=${CLASSPATH}:$HADOOP_MAPRED_HOME/$MAPRED_DIR
  fi

  if [ -d "$HADOOP_MAPRED_HOME/$MAPRED_LIB_JARS_DIR" ]; then
    CLASSPATH=${CLASSPATH}:$HADOOP_MAPRED_HOME/$MAPRED_LIB_JARS_DIR'/*'
  fi

  CLASSPATH=${CLASSPATH}:$HADOOP_MAPRED_HOME/$MAPRED_DIR'/*'
fi

所以,我之前的解決辦法是,將找不到類的Jar包,拷貝到Java JRE的ext文件夾中。。。

/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext

將所有Hadoop-開頭的JAR,如下,都拷貝到JRE下面,這樣就回在找到相應的類了。這種方式,Hadoop能正常運行,但是后來不熟HBase的時候就出問題了,所以是有可能有潛在問題的

hadoop-annotations-2.5.0.jar
hadoop-archives-2.5.0.jar
hadoop-auth-2.5.0.jar
hadoop-common-2.5.0.jar
hadoop-common-2.5.0-tests.jar
hadoop-datajoin-2.5.0.jar
hadoop-distcp-2.5.0.jar
hadoop-extras-2.5.0.jar
hadoop-gridmix-2.5.0.jar
hadoop-hdfs-2.5.0.jar
hadoop-hdfs-2.5.0-tests.jar
hadoop-hdfs-nfs-2.5.0.jar
hadoop-mapreduce-client-app-2.5.0.jar
hadoop-mapreduce-client-common-2.5.0.jar
hadoop-mapreduce-client-core-2.5.0.jar
hadoop-mapreduce-client-hs-2.5.0.jar
hadoop-mapreduce-client-hs-plugins-2.5.0.jar

解決辦法二:

如前面所講,hadoop會在hadoop-config.sh中增加相關jar的路徑,如

HADOOP_COMMON_DIR=${HADOOP_COMMON_DIR:-"share/hadoop/common"}
HADOOP_COMMON_LIB_JARS_DIR=${HADOOP_COMMON_LIB_JARS_DIR:-"share/hadoop/common/lib"}
HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_COMMON_LIB_NATIVE_DIR:-"lib/native"}
HDFS_DIR=${HDFS_DIR:-"share/hadoop/hdfs"}
HDFS_LIB_JARS_DIR=${HDFS_LIB_JARS_DIR:-"share/hadoop/hdfs/lib"}
YARN_DIR=${YARN_DIR:-"share/hadoop/yarn"}
YARN_LIB_JARS_DIR=${YARN_LIB_JARS_DIR:-"share/hadoop/yarn/lib"}
MAPRED_DIR=${MAPRED_DIR:-"share/hadoop/mapreduce"}
MAPRED_LIB_JARS_DIR=${MAPRED_LIB_JARS_DIR:-"share/hadoop/mapreduce/lib"}

可以看到上面的路徑,包括了common、hdfs、yarn、mapreduce的lib路徑

我上面遇到了找不到org.apache.hadoop.hdfs.qjournal.server.JournalNode 這個類,這個類的路徑是HADOOP_HOME/share/hadoop/hdfs/×。但是我的hadoop-config.sh導出的CLASSPATH中沒有hdfs/×這個路徑,所以我需要自己加上。要查看hadoop導出的classpath可以如下

hadoop classpath

大概是如下樣子

/home/hadoop/software/cloud/hadoop-2.6.0/etc/hadoop:/home/hadoop/software/cloud/hadoop-2.6.0/share/hadoop/common/lib/*:/home/hadoop/software/cloud/hadoop-2.6.0/share/hadoop/common/*:/home/hadoop/software/cloud/hadoop-2.6.0/share/hadoop/hdfs/lib/*:/home/hadoop/software/cloud/hadoop-2.6.0/share/hadoop/yarn/lib/*:/home/hadoop/software/cloud/hadoop-2.6.0/share/hadoop/yarn/*:/home/hadoop/software/cloud/hadoop-2.6.0/share/hadoop/mapreduce/lib/*:/home/hadoop/software/cloud/hadoop-2.6.0/share/hadoop/mapreduce/*:/home/hadoop/software/cloud/hadoop-2.6.0/contrib/capacity-scheduler/*.jar:/home/hadoop/software/cloud/hadoop-2.6.0/share/hadoop/hdfs/*

因為沒有HADOOP_HOME/share/hadoop/hdfs/× 這個路徑,所以我在hadoop-XX\libexec\hadoop-config.sh最后自己加上

## 因為它的classpath中沒有hdfs的路徑,所以手動添加
CLASSPATH=${CLASSPATH}:$HADOOP_HDFS_HOME'/share/hadoop/hdfs/*'

這樣導出的classpath中就包含了所需要的jar包。

解決辦法三:

在查資料的過程中,很多人說在hadoop-env.sh中加上HADOOP_COMMON_HOME或者是HADOOP_PREFIX,但是我試了好像不太管用

#export HADOOP_COMMON_HOME=/home/hadoop/software/cloud/hadoop-2.6.0
#export HADOOP_PREFIX=/home/hadoop/software/cloud/hadoop-2.6.0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM