1. 程式人生 > >偽分散式環境下命令列正確執行hadoop示例wordcount

偽分散式環境下命令列正確執行hadoop示例wordcount

首先確保hadoop已經正確安裝、配置以及執行。

1.     首先將wordcount原始碼從hadoop目錄中拷貝出來。

[[email protected] logs]# cp /usr/local/hadoop-1.1.2/src/examples/org/apache/hadoop/examples/WordCount.java ~/ygch/hadoop/

因為在編譯過程中需要將jave原始檔和class類檔案分離,所以在~/ygch/hadoop下還要有一個class目錄。

2.     編譯WordCount.java檔案:

[[email protected] src]#javac -classpath /usr/local/hadoop-1.1.2/hadoop-core-1.1.2.jar:/usr/local/hadoop-1.1.2/lib/commons-cli-1.2.jar WordCount.java -d class

該命令的特別之處是利用-classpath選項指定WordCount需要的jar包。一開始我們可能不知道WordCount需要什麼jar包,我們可以通過搜尋hadoop的目錄來搜尋相關jar包。hadoop目錄下存放jar包的位置有兩個:根目錄和/lib目錄。然後我們可以通過jar tvf  *.jar檢視jar包內容,進而可以知道WordCount需要的是哪幾個jar包。

-d選項指定生成的類檔案的位置,在編譯的時候這個選項必須重新指定,不能讓class檔案生成在當前目錄下。這是因為WordCount.java內包含package資訊,如果我們不加-d選項,則編譯的時候會將package資訊丟失,導致能編譯通過,但是後續不能找到類檔案的錯誤。

此時我們直接呼叫java命令執行生成的WordCount:

[[email protected] classes]# java org.apache.hadoop.examples.WordCount

則會報錯:

Exceptionin thread "main" java.lang.NoClassDefFoundError:org/apache/hadoop/conf/Configuration

        atorg.apache.hadoop.examples.WordCount.main(WordCount.java:52)

        Caused by:java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration

        atjava.net.URLClassLoader$1.run(URLClassLoader.java:366)

        atjava.net.URLClassLoader$1.run(URLClassLoader.java:355)

        at java.security.AccessController.doPrivileged(NativeMethod)

        atjava.net.URLClassLoader.findClass(URLClassLoader.java:354)

        atjava.lang.ClassLoader.loadClass(ClassLoader.java:424)

        atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

        ... 1 more

錯誤提示表明java找不到我們在編譯時新增的jar包,這時即使用-classpath選項新增相關jar包也不能正確執行。正確的方式是,將class檔案打包成jar包。

3.     將class檔案打包成一個jar包:

[[email protected] hadoop]# jar cvf WordCount.jar -C classes/ .

注意不要忘記最後有一個點,否則jar命令報錯。該點指示jar命令的檔案列表,表示指定目錄下的所有檔案。這裡不能用*,否則會新增除了指定目錄還有當前目錄下的所有檔案。

        我們也可以首先cd到指定目錄,然後利用命令:

[[email protected] class]# jar cvf WordCount.jar *

來執行打包命令。

        打包的結果是在執行jar命令的目錄下生成一個WordCount.jar。

4.     生成input檔案:

由於執行hadoop時指定的輸入檔案只能是HDFS檔案系統中的檔案,所以我們必須將要進行wordcount的檔案從本地檔案系統拷貝到HDFS檔案系統中。

[[email protected] hadoop]# hadoop fs -mkdir input
[[email protected] hadoop]# hadoop fs -put testfile input

5.     執行jar包:

[[email protected] hadoop]#hadoop jar WordCount.jar org.apache.hadoop.examples.WordCount input output

在執行命令中由於WordCount.java中包括package資訊,所以我們在指定類時要包含package的完整資訊。

6.     檢視結果

在hadoop程式執行完後,結果會放在output目錄下,該目錄是自動生成的。檢視命令為:

[[email protected] hadoop]# hadoop fs -cat output/part-r-00000

至此,hadoop下的WordCount例項執行結束。