命令列運行hadoop執行個體wordcount程式

來源:互聯網
上載者:User
文章目錄
  • 1.如果wordcount程式不含層次,即沒有package
  • 2.如果wordcount程式含有層次
  • 3.編譯WordCount.java程式
  • 4.出現無法編譯WordCount.java程式的情況

參考1:http://www.cnblogs.com/flying5/archive/2011/05/04/2078408.html

需要說明的有以下幾點。

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: WordCount2at 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.1export 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檔案。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.