標籤:

Ubuntu搭建Hadoop的踩坑之旅(三)

之前的兩篇文章介紹了如何從0開始到搭建好帶有JDK的Ubuntu的過程,本來這篇文章是打算介紹搭建偽分散式集群的。但是後來想想反正偽分散式和完全分散式差不多,所幸直接介紹完全分散式了。

如果你想自己搭建偽分散式玩的話,參考:在VMware下安裝Ubuntu並部署Hadoop1.2.1分散式環境 - CSDN博客

這一篇主要參考這篇文章:Hadoop2.6.0安裝 - 集群(搭建的過程中沒截圖,大家可以到原博客看)

一、所需的環境和軟體:(以下是我們的環境,僅供參考)

1. 操作系統:Windows 10 64位

2. 內存:4G以上(4G 可以搭建,不過虛擬機的運行可能會比較慢,這種情況可以考慮雙系統)

3. VMware Workstation 12:VMware-workstation-full-12.5.7-5813279.exe

4. VMware Tools:通過VMware來安裝

5. Ubuntu12.04:ubuntu-14.04.5-desktop-amd64.iso,ubuntu-16.04.3-desktop-amd64.iso(團隊中兩種系統都有人成功,不過高版本的比較順利)

6. SSH:通過linux命令來安裝

7. JDK1.8:jdk-8u11-linux-x64.tar.gz

8. Hadoop2.6.0:hadoop-2.6.0.tar.gz

二、集群的搭建(以三台機器為例子,一台master(主機),兩台Slave(從機),在虛擬機的設置中將網路適配改為橋接)

1.為了使得機器間能夠互相連通,我們需要修改/etc/hosts文件。

首先我們要知道每一台機器的IP地址:通過 ifconfig 來查看

使用ping命令來測試能不能連通其他的機器

ping IP

使用 Ctrl+c來停止

知道了每台主機的IP之後就可以去修改hosts文件了(每一台主機做同樣的配置),sudo gedit /etc/hosts

修改成下面的樣子

192.168.31.61 Master

192.168.31.29 Slave1

192.168.31.34 Slave2

修改完之後就可以用ping Slave1來測試能否鏈接。

2、配置SSH登錄

配置SSH是為了使得每台機器之間能夠通過SSH實現無密碼登錄

安裝ssh:

apt-get install ssh

安裝好後生成ssh公鑰。

$cd ~/.ssh # 如果沒有該目錄,先執行一次ssh localhost,生成.ssh目錄

$rm ./id_rsa* # 刪除之前生成的公匙(如果有)

$ssh-keygen -t rsa # 一直按回車就可以

$cat ./id_rsa.pub >> ./authorized_keys #將公鑰加入授權

將Master 上生成的公鑰傳到各個Slave節點

$scp ~/.ssh/id_rsa.pub hadoop@Slave0:/home/hadoop/

$scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/

這裡的hadoop是指用戶名,如果你集群中的機器名字不一樣,就直接改成相應的用戶名就行了。

Master將公鑰傳輸到各個節點後,Slave 要將公鑰加入授權,這樣Master 就能通過ssh免密碼登錄各台機器了。

$cd ~/.ssh

$cat /home/hadoop/id_rsa.pub >> ./authorized_keys #將Master的公鑰加入授權,/home/hadoop/換成自己的目錄

每一台Slave機器都完成上述工作後,Master可以使用ssh登錄各台主機了。

$ssh Slave1 #登錄Slave1,成功的話是不需要密碼的,然後$前面的提示信息會變成你登錄的那台主機的信息

$ exit #退出登錄

注意:如果你的從機用戶名和hosts文件裡面的Slave1不一樣的話,直接ssh Slave1可能會登陸不了。所以這時可以改成:ssh 用戶名@Slave1

如果沒什麼問題的話,就表明ssh操作就是成功了

3、集群xml文件的配置

將Hadoop解壓所有機器統一放到同一個目錄下。(節點啟動是master通過ssh登陸到每一台從機然後在相同的目錄啟動Hadoop)

配置文件必須要配置的有5個,還有一個可能要配置。

必要的是: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。

可能:hadoop-env.sh

先說hadoop-env.sh這個文件,為什麼是可能呢?因為如果每一台機子的JDK路徑不同的話需要在文件中加入JDK路徑:

紅框部分:你的JDK路徑。

slaves文件:

將作為 DataNode 的主機名寫入該文件,每行一個,默認為 localhost,所以在偽分散式配置時,節點即作為 NameNode 也作為 DataNode。分散式配置可以保留 localhost,也可以刪掉,讓 Master 節點僅作為 NameNode 使用。;例如直接將 Slave1 和 Slave2 都加入其中。

core-site.xml文件

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

hdfs-site.xml文件:

<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>Master:50090</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>

dfs.replication是hdfs數據塊的複製份數一般默認為3,但是這裡只有兩台機器,所以改為2.

mapred-site.xml 文件(默認文件名為 mapred-site.xml.template,需要將文件名改成mapred-site.xml),然後配置修改如下:

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

yarn-site.xml文件

<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>Master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>

ok配置完成

4、對從機的每一台主機做同樣的配置

把/usr/local/hadoop文件夾拷貝到每一台從機上面可以用U盤或者遠程拷貝

$cd /usr/local$sudo rm -r ./hadoop/tmp # 刪除 Hadoop 臨時文件$sudo rm -r ./hadoop/logs/* # 刪除日誌文件$tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先壓縮再複製$cd ~$scp ./hadoop.master.tar.gz Slave0:/home/hadoop

copy結束後,在Slave1和Slave2節點上直接將copy過來的目錄解壓即可(Master節點需要和Slave節點有相同的配置)。

$sudo rm -r /usr/local/hadoop # 刪掉舊的(如果存在)$sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local3 $sudo chown -R hadoop /usr/local/hadoop

5、啟動Hadoop集群(在Master上啟動):

$cd /usr/local/hadoop #你的Hadoop文件夾$hdfs namenode -format #格式化namenode$start-dfs.sh #啟動hdfs$start-yarn.sh #啟動yarn框架$mr-jobhistory-daemon.sh start historyserver

然後用JPS查看每個節點的守護進程:

Master節點

樓主沒截圖,圖片取自原參考博客

Slave1

樓主沒截圖,圖片取自原參考博客

Slave2

樓主沒截圖,圖片取自原參考博客

這時可以上web頁面查看節點狀態

1. 訪問 http://localhost:50070 可以查看Hadoop集群的節點數、NameNode及整個分散式系統的狀態等(live node是存活幾點個數,不為0則成功)。

2. 訪問 http://localhost:50030 可以查看JobTracker的運行狀態,如Job運行的速度、Map個數、Reduce個數等。

3.訪問 http://localhost:8088 可以查看節點狀態等

6、停止集群

$stop-yarn.sh$stop-dfs.sh$mr-jobhistory-daemon.sh stop historyserver

*備註:遇到問題查看日誌文件一個很好的選擇

坑:

9000埠:jps顯示有datenode,但是livenode為0。9000埠真的是一個很詭異的問題,一度在這裡卡了很久。查過很多方法,最後大致是這麼解決的:

卸載防火牆:

sudo apt-get remove iptable

/etc/hosts文件做如下改動

127.0.0.1 localhost

127.0.1.1 localhost.localdomain localhost

0.0.0.0 Master

還有的是這樣:

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

10.20.77.172 hadoop-master

10.20.77.173 hadoop-slave1

10.20.77.174 hadoop-slave2

10.20.77.175 hadoop-slave3

網上各種版本,我也依舊不是很確定,大家試著吧。

datenode未啟動:

將所有機器的hadoop下的tmp文件夾內的東西刪掉就好


推薦閱讀:

做好機器學習,數學要學到什麼程度?
有沒有trace hadoop運行詳細流程的工具,可以profiling hadoop的性能瓶頸,或者可以監控比如提交job在hadoop中如何調度,相關的好工具包推薦大家也推薦下
穩定和性能如何兼顧?58大數據平台的技術演進與實踐
Apache Hadoop mapreduce 的Shuffle過程詳解
虛擬機安裝部署hadoop集群記錄

TAG:Hadoop |