Hadoop(MapReduce)入門 使用Eclipse開發
花了一天時間把Hadoop的入門弄好了,走了不少彎路,不過最後還是弄好了。主要環境是Ubuntu 16.04,Hadoop 2.7.3,Oracle JDK 7u80,Eclipse 3.8。
作業系統準備(建立使用者/SSH/JAVA)
建立使用者
安裝Ubuntu就不多說了,現在ubuntu剛安裝完真是什麼都沒有,什麼都要apt-get。首先建立個使用者,如果你安裝的時候使用者名稱不是hadoop那麼就建立一個。
$sudo useradd -m hadoop -s /bin/bash
$ sudo passwd hadoop #這裡需要給hadoop輸入個密碼,隨便什麼好了
$sudo adduser hadoop sudo
安裝openssh-server
然後登出用hadoop使用者登陸,開始安裝ssh服務端。
$sudo apt-get openssh-server
安裝完了之後測試一下sshlocalhost看看能不能登陸。如果能夠輸入密碼登陸本機的話,進行下面操作,否則先google一下你的openssh-server怎麼了。進行ssh免密碼登陸。
$ ssh-keygen -t rsa #一路回車,什麼預設位置,密碼什麼的都不要
$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
OK,然後在試試ssh localhost,看看要不要密碼了。
安裝Java
安裝完了之後需要安裝Java。兩種安裝方式。
一種用自帶的OpenJDK之內的,直接sudo apt-get install openjdk-8-jdk就行了,這時候JAVA_HOME是/usr/lib/jvm/java-8-openjdk-amd64。命令如下:
sudoapt-get install openjdk-8-jdk
還有一種從oracle官網上下載oracle的jdk。我選的是jdk-7u80-linux-x64.tar.gz。直接解壓目錄,解壓完了將目錄移到/usr/lib/jvm下面,然後改個許可權就ok了。命令如下:
$tar -zxvf jdk-7u80-linux-x64.tar.gz
$sudo mkdir -p /usr/lib/jvm
$sudo mv jdk1.7.0_80 /usr/lib/jvm
$cd /usr/lib/jvm
$sudo chown -R root:root jdk1.7.0_80
這個弄完了理論上還要弄JAVA_HOME的環境變數,後面一起弄,java安裝先放在這裡。接著需要建立hadoop使用者。
部署Hadoop
官網上下載hadoop二進位制包,官網地址:
然後放到Ubuntu機器上。
$tar -zxvf hadoop-2.7.3.tar.gz
$ vi hadoop-2.7.3/etc/hadoop/core-site.xml #修改core-site.xml配置檔案
改成這個鳥樣:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
$ vi hadoop-2.7.3/etc/hadoop/hdfs-site.xml #修改hdfs-site.xml配置檔案
改成這個鳥樣:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
網上面對於這個配置檔案有各種各樣的改法,這裡是用官方的MapReduce Tutorial中最簡單的方法,先這麼用著再說,是Pseudo-Distributed Mode(偽分散式)。然後部署到系統中。
$sudo mv hadoop-2.7.3 /usr/local/hadoop
環境變數
編輯bash的環境變數。
$vi ~/.bashrc
在前面增加:
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_80 # JAVA_HOME需要根據實際情況確定
exportPATH=$JAVA_HOME/bin:$PATH
exportCLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
exportHADOOP_HOME=/usr/local/hadoop
exportHADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar
exportHADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
然後執行:
$source ~/.bashrc
執行Hadoop
先格式化HDFS
$ $HADOOP_HOME/bin/hdfs namenode -format
如果出現下面的兩行
17/02/09 02:42:46 INFO common.Storage:Storage directory/tmp/hadoop-hadoop/dfs/name has
been successfully formatted.
和
17/02/09 02:42:46 INFO util.ExitUtil:Exiting with status 0
說明成功了,否則先解決這個問題。注意這裡可能用下面的警告(後面執行hadoop程式也會出現)。
17/02/09 02:42:39WARNutil.NativeCodeLoader: Unable
to load native-hadoop library for yourplatform... using builtin-java classes where applicable
不用管它,如果嫌他麻煩,自己重新編譯hadoop好了。執行Namenode和Datanode。
$$HADOOP_HOME/sbin/start-dfs.sh
如果沒出現Error的話,用jps命令看看有沒有NameNode和DataNode。(這裡可能出現JAVA_HOME沒設定的情況,注意.bashrc中一定要設定,profile可能不會起作用)
用瀏覽器看看http://localhost:50070能不能訪問,如果能訪問,說明成功了,進行下一步。
測試執行WordCount
首先找個WordCount的原始碼,在hadoop-2.7.3.tar.gz裡面有。路徑是:hadoop-2.7.3\share\hadoop\mapreduce\sources\hadoop-mapreduce-examples-2.7.3-sources.jar,把這個玩意兒解壓一下在org/apache/hadoop/examples下面有個WordCount.java,把它傳到你的ubuntu機器上,放在$HOME中好了,然後編譯成class檔案。
$$HADOOP_HOME/bin/hadoop com.sun.tools.javac.Main WordCount.java
這裡會出現三個class檔案。
$ls -lrt *.class
-rw-rw-r-- 1 hadoop hadoop 1790 Feb 9 00:04 WordCount$TokenizerMapper.class
-rw-rw-r-- 1 hadoop hadoop 1793 Feb 9 00:04 WordCount$IntSumReducer.class
-rw-rw-r-- 1 hadoop hadoop 1998 Feb 9 00:04 WordCount.class
這裡是hadoop自己的程式呼叫了javac而已,也可以用javac進行編譯,只不過要把classpath全都帶上,不過好在hadoop有個能夠輸出classpath字串的引數。
$javac -classpath `$HADOOP_HOME/bin/hadoop classpath` WordCount.java
效果和上面的一樣,然後用jar打個包。
$jar cf wc.jar WordCount*.class
會出現個wc.jar檔案,這個檔案最後會傳給hadoop執行。
部署輸入檔案
前面的步驟format了HDFS檔案系統,但是裡面是空的,我們得往裡面弄點資料。現在本地建立三個檔案。
$cat Hello World Bye World > file01
$cat Hello Hadoop Goodbye Hadoop > file02
$cat Hadoop Tutorial > file03
然後在HDFS中建立輸入目錄。
$$HADOOP_HOME/bin/hadoop fs -mkdir -p /WordCount/input
然後把本地檔案傳到HDFS中。
$$HADOOP_HOME/bin/hadoop fs -put file01 /WordCount/input
$$HADOOP_HOME/bin/hadoop fs -put file02 /WordCount/input
$$HADOOP_HOME/bin/hadoop fs -put file03 /WordCount/input
然後檢查一下,看看檔案上傳了沒
$$HADOOP_HOME/bin/hadoop fs -ls /WordCount/input
Found3 items
-rw-r--r-- 3 hadoop supergroup 22 2017-02-08 21:49/WordCount/input/file01
-rw-r--r-- 3 hadoop supergroup 28 2017-02-08 21:49/WordCount/input/file02
-rw-r--r-- 1 hadoop supergroup 15 2017-02-09 03:03/WordCount/input/file03
OK,準備工作全部完成了。
測試執行
執行命令
$$HADOOP_HOME/bin/hadoop jar wc.jar org.apache.hadoop.examples.WordCount/WordCount/input/ /WordCount/output/
正常情況下會有一堆輸出,看到下面這行就完成了。
17/02/09 03:19:38 INFO mapreduce.Job: map 100% reduce 100%
然後在HDFS中看結果。
$$HADOOP_HOME/bin/hadoop fs -ls /WordCount/output
Found 2 items
-rw-r--r-- 1 hadoop supergroup 0 2017-02-09 03:19/WordCount/output/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 51 2017-02-09 03:19/WordCount/output/part-r-00000
其中part-r-0000就是結果,看一下結果內容。
$$HADOOP_HOME/bin/hadoop fs -cat /WordCount/output/part-r-0000
Bye 1
Goodbye 1
Hadoop 3
Hello 2
Tutoral 1
World 2
好了,說明成功了。如果需要再次執行,需要把output目錄刪掉。
$$HADOOP_HOME/bin/hadoop rm -r -f /WordCount/output
配置eclipse
安裝外掛
首先你得有個eclipse吧,可以用ubuntu自帶的,也可以下載一個(自帶的版本是3.8,我用4.4試過的)。然後你得下載個eclipse的hadoop的外掛,網址是:
當然要是沒有翻牆的本領,我覺得還是別看這個教程了吧……然後安裝外掛。
如果用ubuntu自帶的eclipse,請將hadoop-eclipse-plugin-2.6.0.jar放到/usr/lib/eclipse/plugins下,注意把檔案所有者改成root使用者(用sudo chown)。如果是自己下載的,放到eclipse/plugins下面。
配置eclipse
然後開啟eclipse,在選單欄選擇Windows->Preference,在彈出的對話方塊左側選擇Hadoop Map/Reduce。在Hadoop installation directory:把自己的hadoop目錄給填上。
然後開啟下方的Map/Reduce Location,右擊空白處,選擇New HadoopLocation…
在彈出的對話方塊中按照如下的內容填
然後在左側的Project Explorer下面展開DFSLocations,能看見上次執行WordCount程式HDFS中的結果。
在Eclipse中寫WordCount
在選單欄中選擇File->New->Project,選擇Map/ReduceProject。
下一步
然後Finish。右擊左面的Project Explorer中的WordCount->src,選擇New->Class。
在WordCount.java中把之前的內容複製進去。
出現語法錯誤了,意思是這種multi paremeter types支援1.5版本以後的java,這是由於eclipse有自己的一套語法解析器,通過不了還沒法用javac編譯,還得配置一下工程先。右擊ProjectExplorer中的WordCount專案,選擇Properties,在開啟的對話方塊左側選擇JavaCompiler;開啟Enableproject specific settings;將Compilercompliance level調成1.7。
OK,退出,然後編輯器上的紅線就消失了,說明編譯通過了。然後打開個檔案管理器,到/usr/local/hadoop/etc/hadoop中,複製core-site.xml,hdfs-site.xml,log4j.properties三個檔案(直接選中三個檔案,按下Ctrl-C),然後右擊Eclipse左側的ProjectExplorer中的WordCount->src選Paste(或者單擊後,按下Ctrl-V),最後效果如下:
右擊WordCount.java,選擇Run As->RunConfiguations。在左側的JavaApplication新建個配置WordCount,在Arguments中把輸入和輸出位置填好了。
好了,快接近勝利了。回到之間的DFS Locations。把之前的output目錄刪掉。
然後右擊WordCount.java,選擇Run As-> Run on Hadoop。成功後下面的console會有一堆輸出,和上面一樣,如果出現了map 100%reduce 100%,說明成功了。
然後在DFS Locations中重新整理一下WrodCount目錄,會看見output了,開啟part-r-0000看看結果對不對。