1. 程式人生 > >命令列執行hadoop例項wordcount程式

命令列執行hadoop例項wordcount程式

需要說明的有以下幾點。

1.如果wordcount程式不含層次,即沒有package

那麼使用如下命令:

hadoop jar wordcount.jar WordCount2 /home/hadoop/input/20418.txt /home/hadoop/output/wordcount2-6

該命令列的意思大致是:執行hadoop 程式,該程式在wordcount.jar中。該wordcount.jar包含以下幾個class檔案,分別是WordCount.java編譯產生的3個class檔案:

  • WordCount.class
  • WordCount$Map.class
  • WordCount$Reduce.class

和WordCount2.java編譯產生的四個claas檔案:

  •  classWordCount2.class
  • WordCount2$IntSumReducer.class
  • WordCount2$IntWritableDecreasingComparator.class 
  • WordCount2$TokenizerMapper.class

並且這幾個.class檔案是在jar包的根目錄下。將上述七個class檔案打包成jar檔案的方法如下:假設上述七個class檔案在同一個目錄WordCount資料夾下,使用命令列進入到該級目錄,然後通過如下命令打包:

jar cvf WordCount.jar *.class

2.如果wordcount程式含有層次

那麼使用如下命令(錯誤)

$ hadoop jar wordcount.jar WordCount2 /home/hadoop/input/20418.txt /home/hadoop/output/wordcount2-7
會報錯,錯誤如下:(具體原因可以參考部落格:http://blog.csdn.net/xw13106209/article/details/6861855
Exception in thread "main" java.lang.ClassNotFoundException: WordCount2
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at org.apache.hadoop.util.RunJar.main(RunJar.java:149)
正確命令如下:
$ hadoop jar WordCount.jar org.apache.hadoop.examples.WordCount2 /home/hadoop/input/20418.txt /home/hadoop/output/wordcount2-7

這裡唯一的不同色jar包的不同,上一條命令的jar包是wordcount.jar,而這裡的java包是WordCount.jar。WordCount.jar把是對org/apache/hadoop/examples整個目錄打包得到的。

3.編譯WordCount.java程式

在參考1中使用了類似以下的命令來編譯WordCount.java
javac -classpath /home/hadoop/program/hadoop-0.20.1/hadoop-0.20.1-core.jar WordCount.java -d /home/hadoop/WordCount/

這條命令的指定了classspath為 /home/hadoop/program/hadoop-0.20.1/hadoop-0.20.1-core.jar 。其實我們可以修改環境變數來省去這些內容。

具體方法為:

 sudo gedit /etc/profile
修改
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export HADOOP_HOME=/home/hadoop/program/hadoop-0.20.1
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH:$HADOOP_HOME/hadoop-0.20.1-core.jar
這樣的話,就可以直接使用如下命令來編譯WordCount.java程式了
javac  WordCount.java -d /home/hadoop/WordCount/

注意:這裡的WordCount.java可以有包名,也可以沒有包名。如果沒有包名的話,在/home/hadoop/WordCount/目錄下就有幾個編譯完成的.class檔案。如果有包名的話,那麼在/home/hadoop/WordCount/目錄下還會生成包的結構目錄。

4.出現無法編譯WordCount.java程式的情況

在使用同樣的編譯命令的時候

javac WordCount2.java -d /home/hadoop/WordCount/
會提示如下錯誤:
WordCount2.java:93: 無法訪問 org.apache.commons.cli.Options
未找到 org.apache.commons.cli.Options 的類檔案
String[] otherArgs = new GenericOptionsParser(conf, args)
^
1 錯誤
查了一些資料,這個錯誤主要是因為WordCount2.java裡面用到了一些類,而這些類沒有在classpath路徑下注冊。所以會產生這樣的錯誤。因為在eclipse中,我們的bulid path中的library中新增的jar包不單單隻有hadoop-0.20.1-core.jar一個jar,還有其他許多的jar,如果要通過命令列將這些jar包全部打出來,非常麻煩。這裡推薦使用ant來進行編譯。具體如何使用ant,可能會在後面的部落格中提及。我們可以使用eclipse來幫我們編譯。參考部落格:eclipse編譯java檔案