使用命令行編譯打包運行自己的MapReduce程序 Hadoop2.6.0
網上的 MapReduce WordCount 教程對於如何編譯 WordCount.java 幾乎是一筆帶過… 而有寫到的,大多又是 0.20 等舊版本版本的做法,即 javac -classpath /usr/local/hadoop/hadoop-1.0.1/hadoop-core-1.0.1.jar WordCount.java
,但較新的 2.X 版本中,已經沒有 hadoop-core*.jar 這個文件,因此編輯和打包自己的MapReduce程序與舊版本有所不同。
本文以 Hadoop 2.6.0 單機模式環境下的 WordCount 實例來介紹 2.x 版本中如何編輯自己的 MapReduce 程序。
Hadoop 2.x 版本中的依賴 jar
Hadoop 2.x 版本中 jar 不再集中在一個 hadoop-core*.jar 中,而是分成多個 jar,如使用 Hadoop 2.6.0 運行 WordCount 實例至少需要如下三個 jar:
- $HADOOP_HOME/share/hadoop/common/hadoop-common-2.6.0.jar
- $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0.jar
- $HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar
實際上,通過命令 hadoop classpath
我們可以得到運行 Hadoop 程序所需的全部 classpath 信息。
編譯、打包 Hadoop MapReduce 程序
我們將 Hadoop 的 classhpath 信息添加到 CLASSPATH 變量中,在 ~/.bashrc 中增加如下幾行:
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
別忘了執行 source ~/.bashrc
使變量生效,接着就可以通過 javac
命令編譯 WordCount.java 了(使用的是 Hadoop 源碼中的 WordCount.java,源碼在文本最后面):
- javac WordCount.java
編譯時會有警告,可以忽略。編譯后可以看到生成了幾個 .class 文件。
使用Javac編譯自己的MapReduce程序
接着把 .class 文件打包成 jar,才能在 Hadoop 中運行:
- jar -cvf WordCount.jar ./WordCount*.class
打包完成后,運行試試,創建幾個輸入文件:
- mkdir input
- echo "echo of the rainbow" > ./input/file0
- echo "the waiting game" > ./input/file1
創建WordCount的輸入
如果讀者Hadoop的環境是單機模式,請跳過此步驟。如果讀者的Hadoop環境已經配置成偽分布式,那么讀者還需要進行執行下列操作命令:
- # 把本地文件上傳到偽分布式HDFS上
- /usr/local/hadoop/bin/hadoop fs -put ./input input
開始運行。直接運行/usr/local/hadoop/bin/hadoop jar WordCount.jar WordCount input output
,可能會出現找不到類的錯誤:
這是因為我們在代碼中設置了package包名,這里也要寫全,正確的命令如下。
- /usr/local/hadoop/bin/hadoop jar WordCount.jar org/apache/hadoop/examples/WordCount input output
正確運行后的結果如下:
查看結果