ubuntu搭建hadoop-Ver2.6.0徹底分佈式環境筆記

1 參考博文

http://my.oschina.net/kakakaka/blog/336203#OSC_h2_12html

http://blog.csdn.net/greensurfer/article/details/39450369java

http://blog.csdn.net/zwto1/article/details/41073545node

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ClusterSetup.htmllinux

一般,集羣裏的一臺機器被指定爲 NameNode,另外一臺不一樣的機器被指定爲JobTracker。這些機器是masters。餘下的機器即做爲DataNode做爲TaskTracker。這些機器是slaves\web

官方地址:(http://hadoop.apache.org)shell

2 先決條件

  1. 確保在你集羣中的每一個節點上都安裝了全部必需軟件:JDK ,ssh,Hadoopapache

3 實驗環境搭建

3.1 準備工做

操做系統:Ubuntu
部署:Vmvare
在vmvare安裝好一臺Ubuntu虛擬機後,能夠導出或者克隆出另外兩臺虛擬機。
說明:
保證虛擬機的ip和主機的ip在同一個ip段,這樣幾個虛擬機和主機之間能夠相互通訊。
爲了保證虛擬機的ip和主機的ip在同一個ip段,虛擬機鏈接設置爲橋連。
ubuntu

準備機器:一臺master,若干臺slave,配置每臺機器的/etc/hosts保證各臺機器之間經過機器名能夠互訪,例如:
192.168.100.205 node1(master)
192.168.100.206 node2 (slave1)
192.168.100.207 node3 (slave2)
主機信息:
安全

機器名 IP地址 做用
Node1 192.168.100.205 NameNode、JobTracker
Node2 192.168.100.205 DataNode、TaskTracker
Node3 192.168.100.205 DataNode、TaskTracker

爲保證環境一致先安裝好JDK和ssh:網絡

3.2 安裝JDK

3.2.1 JDK下載

  本地選擇的是 JDK  1.8.0_25下在地址爲:http://www.oracle.com/technetwork/java/javase/downloads/index.html

3.2.2 JDK安裝

  下載好後放入指定位置(如/usr/java),使用以下命令安裝

 tar zxvf jdk-xxx-linux-xxx.tar.gz


3.2.3 JDK配置

  1.進入/etc目錄

  2.將JDK配置信息加入profile文件

# The following configuration is for Java
export JAVA_HOME=/usr/java/jdk1.8.0_25
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:JAVA_HOME/lib:$JAVA_HOME/jre/lib

  3.使用下面組合命令使配置生效

chmod +x profile (這條命令須要超級權限)
source profile

  4.使用下面,驗證JDK安裝

 java -version

  若是安裝版本信息顯示則安裝成功

 5.特殊狀況:JDK版本衝突。原操做系統可能已經默認安裝JDK版本,這是會發現JDK版本爲舊版本。

 解決辦法以下:

 (1)執行下屬命令

sudo update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_25/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.8.0_25/bin/javac 300
sudo update-alternatives --install /usr/bin/jar jar /usr/java/jdk1.8.0_25/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /usr/java/jdk1.8.0_25/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /usr/java/jdk1.8.0_25/bin/javap 300 

sudo update-alternatives --config java

 (2)此時系統會列出JDK各版本以下:

有 3 個候選項可用於替換 java (提供 /usr/bin/java)。


  選擇       路徑                                    優先級  狀態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      自動模式
  1            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      手動模式
  2            /usr/lib/jvm/java-6-sun/jre/bin/java       63        手動模式
  3            /usr/java/jdk1.8.0_25/bin/java             300       手動模式


要維持當前值[*]請按回車鍵,或者鍵入選擇的編號:3

 (3)選擇後執行下面語句後,將會發現版本已切換

java -version

3.3 配置ssh公鑰祕鑰自動登陸

在hadoop集羣環境中,nameNode節點,須要可以ssh無密碼登陸訪問dataNode節點

進入SSH目錄:

[root@node1 ~]# cd .ssh                 # 若是沒有該目錄,先執行一次ssh localhost
[root@node1 .ssh]#                      # 一直按回車就能夠,生成的密鑰保存爲.ssh/id_rsa

生成公鑰密鑰對:

[root@node1 /]# ssh-keygen -t rsa


Generating public/private rsa key pair.    
Enter file in which to save the key (/root/.ssh/id_rsa):    
Enter passphrase (empty for no passphrase):    
Enter same passphrase again:    
Your identification has been saved in /root/.ssh/id_rsa.    
Your public key has been saved in /root/.ssh/id_rsa.pub.    
The key fingerprint is:    
98:3c:31:5c:23:21:73:a0:a0:1f:c6:d3:c3:dc:58:32 root@gifer    
The key's randomart image is:    
+--[ RSA 2048]----+    
|.   E.=.o                  |    
|.o = @ o .              |    
|. * * =                    |    
| o o o =                |    
|  .   = S                  |    
|       .                     |    
|                             |    
|                             |    
|                             |    
+------------------+


看到上面輸出,表示密鑰生成成功,目錄下多出兩個文件

私鑰文件:id_raa
公鑰文件:id_rsa.pub

將公鑰文件id_rsa.pub內容放到authorized_keys文件中:

cat id_rsa.pub >> authorized_keys

將公鑰文件authorized_keys分發到各dataNode節點:

scp authorized_keys  root@dataNode:/root/.ssh/

驗證ssh無密碼登陸:

[root@node1 .ssh]# ssh root@node2  
Last login: Sun Sep 21 11:38:05 2014 from 192.168.100.205

看到以上輸出,表示配置成功!若是還提示須要輸出密碼訪問,表示配置失敗!


3.4 安裝Hadoop(全部節點相同)

3.4.1 Hadoop下載

   地址爲:http://www.apache.org/dyn/closer.cgi/hadoop/common/ 

3.4.2 Hadoop安裝

   將下載下來的Hadoop放入指定目錄(/usr/hadoop),使用以下命令安裝

  tar xzf hadoop-2.6.0.tar.gz

3.4.3 Hadoop配置

   1.linux profile(路徑:/etc)配置,以下圖

# The following configuration is for hadoop
export HADOOP_INSTALL=/usr/hadoop/hadoop-2.6.0
export PATH=$PATH:$HADOOP_INSTALL/bin

  2.hadoop-env.sh(路徑:$HADOOP_HOME/etc/hadoop)中把JAVA_HOME指向JDK安裝根目錄,以下

# The java implementation to use.
export JAVA_HOME=/usr/java/jdk1.8.0_25

  3.yarn-env.sh(路徑:$HADOOP_HOME/etc/hadoop)中把JAVA_HOME指向JDK安裝根目錄,以下

# some Java parameters export
JAVA_HOME=/usr/java/jdk1.8.0_25

4.打開conf/core-site.xml(路徑:$HADOOP_HOME/etc/hadoop)文件,編輯以下:

<configuration>  
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://node1:9000</value>
    </property>
</configuration>

1)fs.defaultFS是NameNode的URL。hdfs://主機名:端口/
2)hadoop.tmp.dir :Hadoop的默認臨時路徑,這個最好配置,若是在新增節點或者其餘狀況下莫名其妙的DataNode啓動不了,就刪除此文件中的tmp目錄便可。不過 若是刪除了NameNode機器的此目錄,那麼就須要從新執行NameNode格式化的命令。

5.打開conf/hdfs-site.xml(路徑:$HADOOP_HOME/etc/hadoop)文件,編輯以下:

<configuration>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node1:50090</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/hadoop/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/hadoop/dfs/data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
</configuration>

1) dfs.namenode.name.dir是NameNode持久存儲名字空間及事務日誌的本地文件系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable數據將會被複制到全部目錄中作冗餘備份。
2) dfs.datanode.data.dir是DataNode存放塊數據的本地文件系統路徑,逗號分割的列表。 當這個值是逗號分割的目錄列表時,數據將被存儲在全部目錄下,一般分佈在不一樣設備上。
3)dfs.replication是數據須要備份的數量,默認是3,若是此數大於集羣的機器數會出錯。

注意:此處的name一、name二、data一、data2目錄不能預先建立,hadoop格式化時會自動建立,若是預先建立反而會有問題。

6.打開conf/mapred-site.xml(路徑:$HADOOP_HOME/etc/hadoop)文件,編輯以下:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>node1:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>node1:19888</value>
    </property>

</configuration>


7.打開conf/yarn-site.xml(路徑:$HADOOP_HOME/etc/hadoop)文件,編輯以下:

<configuration>
<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>node1</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>node1:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>node1:8088</value>
    </property>
</configuration>


3.5 配置masters和slaves主從結點

配置$HADOOP_HOME/etc/hadoop/slaves文件來設置從結點,注意最好使用主機名,而且保證機器之間經過主機名能夠互相訪問,每一個主機名一行。

root@node1:/usr/hadoop/hadoop-2.6.0/etc/hadoop# vi slaves

輸入:
node2
node3

配置結束,把配置好的hadoop文件夾拷貝到其餘集羣的機器中,而且保證上面的配置對於其餘機器而言正確,例如:若是其餘機器的Java安裝路徑不同,要修改$HADOOP_HOME/etc/hadoop/hadoop-env.sh

$ scp -r /home/hadoop/hadoop-2.6.0 root@node2: /home/hadoop/

 

4 hadoop啓動

4.1 格式化一個新的分佈式文件系統

先格式化一個新的分佈式文件系統

$ cd hadoop-2.6.0
$ bin/hadoop namenode -format

成功狀況下系統輸出:

12/02/06 00:46:50 INFO namenode.NameNode:STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = ubuntu/127.0.1.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 0.20.203.0
STARTUP_MSG: build =http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-203-r 1099333; compiled by 'oom' on Wed May 4 07:57:50 PDT 2011
************************************************************/

12/02/0600:46:50 INFO namenode.FSNamesystem: fsOwner=root,root
12/02/06 00:46:50 INFO namenode.FSNamesystem:supergroup=supergroup
12/02/06 00:46:50 INFO namenode.FSNamesystem:isPermissionEnabled=true
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name1 has been successfully formatted.
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name2 has been successfully formatted.
12/02/06 00:46:50 INFO namenode.NameNode:SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode atv-jiwan-ubuntu-0/127.0.0.1
************************************************************/


 查看輸出保證分佈式文件系統格式化成功
執行完後能夠到master機器上看到/usr/hadoop/dfs/name目錄。在主節點master上面啓動hadoop,主節點會啓動全部從節點的hadoop。

4.2 啓動全部節點

$ sbin/start-all.sh (同時啓動HDFS和Map/Reduce)
系統輸出:

starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-ubuntu.out
node2: starting datanode, loggingto /usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node3: starting datanode, loggingto /usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node1: starting secondarynamenode,logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-ubuntu.out
starting jobtracker, logging to/usr/local/hadoop/logs/hadoop-hadoop-jobtracker-ubuntu.out
node2: starting tasktracker,logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
node3: starting tasktracker,logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
As you can see in slave's output above, it will automatically format it's storage directory(specified by dfs.data.dir) if it is not formattedalready. It will also create the directory if it does not exist yet.

行完後能夠到slave(node1,node2)機器上看到/usr/hadoop/dfs/data目錄。


4.3 關閉全部節點

從主節點master關閉hadoop,主節點會關閉全部從節點的hadoop。

$ sbin/stop-all.sh

Hadoop守護進程的日誌寫入到 ${HADOOP_LOG_DIR} 目錄 (默認是 ${HADOOP_HOME}/logs).

${HADOOP_HOME}就是安裝路徑.

5 測試

1)jps查看NameNode節點和DataNode節點服務

NameNode節點(node1)已開啓以下守護進程表示正常:

DataNode(node二、node3)節點開啓以下守護進程表示正常:

2)瀏覽NameNode和JobTracker的網絡接口,它們的地址默認爲:

NameNode - http://node1:50070/

ResourceManager - http://node1:8088/

NodeManager - http://node2:8042/

3) 使用netstat –nat查看端口:

NameNode節點(node1)啓動端口以下:

DataNode(node二、node3)節點啓動端口以下:

備註:tcp6表示ipv6網絡,Linux若禁止ipv6後將默認變動tcp無影響。

4)執行WordCount實例:

a、首先建立所需的幾個目錄

bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/hadoop

b、將etc/hadoop中的文件做爲輸入文件複製到分佈式文件系統中

bin/hdfs dfs -put etc/hadoop /user/hadoop/input

 經過查看DataNode的狀態(佔用大小有改變),輸入文件確實複製到了DataNode中

c、接着就能夠運行MapReduce做業了

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep /user/hadoop/input /user/hadoop/output 'dfs[a-z.]+'

運行時的信息以下所示,顯示Job的進度。可能會比較慢,但若是遲遲沒有進度,好比10分鐘都沒看到進度,那不妨重啓Hadoop再試試。

一樣能夠經過Web界面查看任務進度 http://192.168.100.205:8088/cluster

在 Web 界面點擊 「Tracking UI」 這一列的 History,可能會提示網頁沒法打開,遇到這種狀況須要手動開啓 jobhistory server,開啓以後刷新頁面再點擊就能夠打開了。

sbin/mr-jobhistory-daemon.sh start historyserver

注:執行上述語句後,jps查看JobHistoryServer進程已經開啓,經過web(http://192.168.100.205:19888/jobhistory)訪問JobHistoryServer沒有問題。可是在上面ResourceManagerWeb界面中點擊 「Tracking UI」 這一列的 History,依舊提示網頁沒法打開。

發現URL:http://node1:19888/jobhistory/job/job_1418203576437_0001/jobhistory/job/job_1418203576437_0001,使用的是機器名node1來訪問。由於我用的是hadoop集羣外部機器web訪問。須要修改該機器(win7系統)的hosts文件,修改方法以下:

進入C:\Windows\System32\drivers\etc,修改hosts文件。文件中追加以下內容(注意後面須要一個回車換行):

192.168.100.205        node1
192.168.100.206        node2
192.168.100.207        node3
 

經過這些修改若上面ResourceManagerWeb界面中點擊 「Tracking UI」 這一列的 History,依舊提示網頁沒法打開。則重啓下hadoop(守護進程),從新執行測試程序後,History網頁就能夠打開了。

d、執行完畢後的輸出結果:

bin/hdfs dfs -cat /user/hadoop/output/*

e)補充
Q: bin/hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep /user/hadoop/input /user/hadoop/output 'dfs[a-z.]+'什麼意思啊?
A: bin/hadoop jar(使用hadoop運行jar包)hadoop-mapreduce-examples-2.6.0.jar(jar包的名字) grep (要使用的類,後邊的是參數)input output 'dfs[a-z.]+'
整個就是運行hadoop示例程序中的grep,對應的hdfs上的輸入目錄爲input、輸出目錄爲output。
Q: 什麼是grep?
A: A map/reduce program that counts the matches of a regex in the input.

6 HDFS經常使用操做

hadoop dfs -ls 列出HDFS下的文件
hadoop dfs -ls in 列出HDFS下某個文檔中的文件
hadoop dfs -put test1.txt test 上傳文件到指定目錄而且從新命名,只有全部的DataNode都接收完數據纔算成功
hadoop dfs -get in getin 從HDFS獲取文件而且從新命名爲getin,同put同樣可操做文件也可操做目錄
hadoop dfs -rmr out 刪除指定文件從HDFS上
hadoop dfs -cat in/* 查看HDFS上in目錄的內容
hadoop dfsadmin -report 查看HDFS的基本統計信息,結果以下
hadoop dfsadmin -safemode leave 退出安全模式
hadoop dfsadmin -safemode enter 進入安全模式

7 添加節點

可擴展性是HDFS的一個重要特性:

1)首先在新加的節點上安裝hadoop

2)而後修改etc/hosts文件,加入 DataNode主機名

3)而後在NameNode節點上修改$HADOOP_HOME/conf/slaves文件,加入新加節點主機名

4)創建到新加節點無密碼的SSH鏈接

5)NameNode節點上運行啓動命令:start-all.sh

而後能夠經過http://(Masternode的主機名):50070查看新添加的DataNode

8 負載均衡

start-balancer.sh,可使DataNode節點上選擇策略從新平衡DataNode上的數據塊的分佈

9 結束語

遇到問題時,先查看logs,頗有幫助,查看log方法以下:

cat /usr/hadoop/hadoop-2.6.0/logs/*.log

若是日誌在更新,如何實時查看 tail -f /usr/hadoop/hadoop-2.6.0/logs/*.log

還可使用 watch -d -n 1 cat /usr/hadoop/hadoop-2.6.0/logs/*.log

-d表示高亮不一樣的地方,-n表示多少秒刷新一次。

該指令,不會直接返回命令行,而是實時打印日誌文件中新增長的內容,這一特性,對於查看日誌是很是有效的。若是想終止輸出,按 Ctrl+C 便可。

相關文章
相關標籤/搜索