1. 程式人生 > >Hadoop(MapReduce)入門 使用Eclipse開發

Hadoop(MapReduce)入門 使用Eclipse開發

花了一天時間把Hadoop的入門弄好了,走了不少彎路,不過最後還是弄好了。主要環境是Ubuntu 16.04Hadoop 2.7.3Oracle JDK 7u80Eclipse 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官網上下載oraclejdk。我選的是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好了。執行NamenodeDatanode

$$HADOOP_HOME/sbin/start-dfs.sh

如果沒出現Error的話,用jps命令看看有沒有NameNodeDataNode。(這裡可能出現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執行。

部署輸入檔案

前面的步驟formatHDFS檔案系統,但是裡面是空的,我們得往裡面弄點資料。現在本地建立三個檔案。

$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試過的)。然後你得下載個eclipsehadoop的外掛,網址是:

當然要是沒有翻牆的本領,我覺得還是別看這個教程了吧……然後安裝外掛。

如果用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目錄給填上。


點選eclipse右上角的切換到MapReduce的檢視。


然後開啟下方的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.xmlhdfs-site.xmllog4j.properties三個檔案(直接選中三個檔案,按下Ctrl-C),然後右擊Eclipse左側的ProjectExplorer中的WordCount->srcPaste(或者單擊後,按下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看看結果對不對。