環境及目標:
- 系統:VMWare / Ubuntu 12.04
- Hadoop版本:0.20.2
- 我的節點配置 (完全分布式集群)
Master (job tracker) |
192.168.221.130 |
h1 |
Slave (task tracker/data node) |
192.168.221.141 |
h2 |
Slave (task tracker/data node) |
192.168.221.142 |
h3 |
- 用戶: hadoop_admin
- 目標:成功啟動hadoop,http://localhost:50030,http://localhost:50070,正確顯示進程
因為是Linux零基礎安裝過程舉步維艱,在群友們的幫助下,用了好幾天裝好了(大俠們別笑),下面有些細節對IT運維的太基礎,也肯定會有遺漏的知識甚至理解不正確的,有一些甚至不加理解跟步驟執行的,希望不吝指點。(除了黃老師講的,網上這種過程文章非常多, 比如apache hadoop wiki中的Running Hadoop On Ubuntu Linux (Multi-Node Cluster) ,這兒只是記錄下我自己安裝中出現的問題和步驟)
基本過程,我分成以下幾點
使用VMWare安裝Ubuntu
我用的是Ubuntu 12,先准備好一些軟件/工具(鏈接均為新浪微盤)。
· VMWare Workstation (去官網免費下)
· ubuntu-12.04.1-desktop-i386.iso
· 因老師再三強調hadoop不同版本間的差異大,新手最好與老師使用相同版本的hadoop,即 hadoop-0.20.2.tar.gz
· WinSCP (我用到的) , PuTTY或SecureCRT 以將jdk, hadoop傳送到ubuntu
安裝Ubuntu
基本沒有任何可以注明的,安裝完成后我的是默認進入命令行模式,startx進入GUI圖形界面模式
Ubuntu可以調display分辨率使得GUI大小舒服點,搜索terminal可打開命令行工具,ctrl+alt+f1~f6,在命令行模式下alt + 左右鍵可切換不同桌面。
配置網絡 (非hadoop安裝必須步驟)
因為群里面有朋友是用的橋接必須用同一網段,所以我們借機會玩了一下網絡設置(注:我想這個不是hadoop安裝的必須步驟)。Ubuntu因為有network-manager的緣故,一進去不需要任何設置就可以上網了,打開settings > network就可看到網絡配置,但這個因為基於DHCP。我通過sudo vi /etc/network/interfaces設置的IP,重啟后又被network-manager改回去了,在這篇文章中提到這兩種方法是相互沖突的,里面有講到如何處理這種情況,我直接粗爆的使用 sudo apt-get autoremove network-manager -- purge把它給卸載了。
autoremove : 'autoremove' removes all package that got automatically installed to satisfy, --purge option makes apt-get to remove config files
步驟:配置靜態IP > DNS > host name > hosts
配置靜態IP
在VM > settings > network中可以看出我使用的是VMWare默認的NAT方式(這兒解釋為:使用NAT可以使虛擬機和宿主機可以相互ping,其他主機無法ping虛擬機),使用這種確實無須HOST和VM使用同一網段IP卻仍能做到相互ping通。
這三者的區別,有興趣的可以搜索 “VMWare 橋接,NAT,Host Only的區別”。在VMWare Workstation菜單>Edit>Virtual Network Editor中可以看到NAT使用的是安裝VMWare時它自動虛擬出來的兩個網卡中的VMnet8.
點擊NAT Settings可以看到
得到如下信息:
網關: 192.168.221.2
IP網段:192.168.221.128~254
子網掩碼:255.255.255.0
:sudo vi /etc/network/interfaces
(關於vi/vim,見鳥哥的《鳥哥的 Linux 私房菜》中 vim 程式編輯器)
auto lo #localhost iface lo inet loopback #這一段配置的是localhost/127.0.0.1,可保留 #加上eth0, 網卡0的配置 auto eth0 iface eth9 inet static #靜態ip address 192.168.221.130 netmask 255.255.255.0 gateway 192.168.221.2 dns-nameserver 192.168.221.2 8.8.8.8 #dns-search test.com 這個新學的,默認會自動給host加到.test.com |
重啟網絡
:sudo /etc/init.d/networking restart #重啟后,才能establish eth0
:whereis ifup #...
:sudo /sbin/ifup eth0 #手動修改eth0后必須啟用eth0才有效,此文有講
:sudo /sbin/ifdown eth0
:sudo /etc/init.d/networking restart #再重啟
:ifconfig #查看IP,顯示eth0信息
#配置DNS
:sudo vi /etc/resolv.conf
加如下 google的公共DNS,
nameserver 192.168.221.2
nameserver 8.8.8.8
這個會被network-manager覆蓋,所以后者要KO掉
:sudo apt-get autoremove network-manager –purge
#配置HOST
:sudo vi /etc/hosts
加上
192.168.221.130 h1
192.168.221.141 h2
192.168.221.142 h3
#配置host name
:whereis hostname
:sudo vi /etc/hostname
寫上h1
運行
:sudo hostname h1
到現在網絡就成功配置好了,非CLONE的話,就三台servers一路執行吧(手酸),/etc/hosts建議scp過去
為hadoop創建特定操作用戶
為hadoop創建特定操作用戶,之后集群節點服務器也需創建,以使得節點服務器間能夠通過這些特定用戶及其RSA公鑰信息通過SSH連接互通。
(在這兒我吃了比較大的彈子,useradd和adduser是兩個不同的命令,使用起來也不同,這一篇講得比較清楚)
我使用的是
:sudo useradd hadoop_admin
:sudo passwd hadoop_admin
結果用它來login后,發現沒有home信息,顯示的是
$:
然后我切回root用戶,自作主張創建了/home/hadoop_admin目錄(於是這個目錄就只有root有權限)
開始發現的問題是在生成rsa ssh key時提示目錄無寫入權限
查了下相關資料,列出用戶對home的權限,發現host是root
繼續
發現權限為0,說明這個用戶創建得有問題,群友讓我用chmod再手動設置權限(使用sudo chown -R hadoop_admin /home/hadoop_admin,這也是使用useradd需做的),我覺得太麻煩,查了下,決定重新建用戶(這個在IT運維一定是不可以的吧 =O=)
:sudo deluser hadoop_admin
:sudo adduser hadoop_admin –home /home/hadoop_admin –u 545
現在正常了
1. 創建用戶
:sudo adduser hadoop_admin –home /home/hadoop_admin –u 545
2. 將用戶加入到可以執行sudo的用戶列表
:sudo vi /etc/sudoers
將如下信息加入到文件中
3. 為用戶生成SSH KEY(下講)
安裝SSH並生成RSA KEY
1. 安裝OpenSSH
知識點:關於debian軟件包和apt-get,看這兒
:sudo apt-get install openssh-server
完成后,理論上ssh就啟動了,現在可以使用WinSCP explore模式進行文件傳輸了,將JDK,HADOOP都拷過去
可以看一看ssh的配置,有助於下面理解節點服務器之間通過SSH公鑰無密碼連接,我這種零基礎的人覺得whereis命令異常方便..
因為安裝hadoop時經常出現是否要將host加入know_host,所以這一行變得很有趣
Ubuntu debian默認打開了~/.ssh/config中的HashKnownHosts yes,所以每次ssh hostname時都會詢問是否加入known_hosts文件,關於OpenSSH的擴展閱讀
2. 為hadoop_admin生成私鑰及公鑰文件
#以hadoop_admin登陸並切換到~/主目錄
:cd ~/
:ssh-keygen –t rsa #以RSA加密算法生成SSH keys –t 設置算法類型
這樣就會自動在用戶主目錄下生成.ssh文件夾及id_rsa(prive key)和id_rsa.pub(public key)兩個文件
:cd ~/.ssh
:cp id_rsa.pub authorized_keys #通過上面對SSH的了解,這個authorized_keys存放SSH識別能自動通過驗證的公鑰信息,信息串在我的實驗中都是以login_name@hostname結尾的
(可以將其它user的公鑰也扔進去)
安裝JDK
前前后后折騰了好幾種安裝方法,有從Ubuntu Software Center搜索JDK安裝了OpenJDK的,有通過修改debian source list使用sudo apt-get install java-6-sun的,都不好用,最簡單的方法就是下載Sun的jdk -> 解壓 -> 修改JAVA_HOME信息。
1. 准備好JDK文件
上面有講,下載地址以及通過ssh將文件拷到VM系統中
2. 安裝JDK
我是安裝到/usr/lib/jvm/jdk1.7.0_21下 (這個目錄最好在所有server中都統一,不然搞死人了~)
:sudo tar xvf ~/Downloads/[jdk].tar.gz –C /usr/lib/jvm
:cd /usr/lib/jvm
:ls
進去看看
3. 設置JAVA_PATH等信息
:sudo vi /etc/profile
#加上如下信息設置環境變量
export JAVA_HOME=/usr/lib/ jvm/jdk1.7.0_21
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH:$JRE_HOME/lib
#執行一下使之有效
:source /etc/profile
#執行一下驗證
:cd $JAVA_HOME
#若能正確定位,則設置完畢
安裝hadoop
1. 准備hadoop文件
上面有講過,將hadoop.0.20.2通過ssh傳輸到目標機器上
2. 安裝hadoop
解壓到hadoop_admin的目錄下(Q: 一定要在這個目錄嗎) ->
:sudo tar xvf [hadoop.tar.gz路徑] –C /home/hadoop_admin/hadoop/
3. 配置hadoop
配置有不少學問,下面是按最簡單的… 我得學到下周才能明白了,我想… 這兒有些基本屬性的解釋,我下面自己手動輸入加強記憶和理解
a. 設置環境變量HADOOP_HOME,方便使用
:sudo vi /etc/profile
export HADOOP_HOME=/home/hadoop_admin/hadoop-0.20.2
export JAVA_HOME=/usr/lib/syveen_jvm/jdk1.7.0_21
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH:$JRE_HOME/lib:$HADOOP_HOME/bin
:source /etc/profile #執行,使之有效
:cd $HADOOP_HOME
:cd /conf/
:cd ls
b. 設置jdk路徑,將JAVA_HOME加入到環境配置中
:sudo vi /JAVA_HOME加入到/hadoop-env.sh
不記得JDK路徑的可以
:echo $JAVA_HOME
c. core-site.xml
設置name node的HDFS路徑 。fs.default.name: 設置集群的name node的URI(協議hdfs,主機名/IP,端口號),集群中的每台機器都需要知道name node信息。
<configuration>
<property><name>fs.default.name</name><value>hdfs://h1:9001</value></property>
</configuration>
d. hdfs-site.xml
設置name node的文件數據(file system)的存儲路徑及拷貝份數(replication),說實話因為現在沒有實際應用hadoop所以對這個namenode和datanode的目錄設置及replication沒有實際理解,只能依葫蘆畫瓢,之后再更新這部分吧
<property><name>dfs.name.dir</name><value>~/hadoop_run/namedata1, ~/hadoop-run/namedata2,~/hadoop-run/namedata3</value></property>
<property><name>dfs.data.dir</name><value>~/hadoop-0.20.2/data</value></property>
<property><name>dfs.replication</name><value>3</value></property>
e. mapred-site.xml
mapred: map-reduce的jobtracker信息
<property><name>mapred.job.tracker</name><value>h1:9001</value></property>
f. masters
加入master節點信息,這兒是h1
g. slaves
加入從屬節點信息, 這兒是h2, h3
4. 配置h2, h3節點服務器
漫長的旅程啊,我是重新VMWare安裝h2,h3,重復以上所有環境以達到二次鞏固的目的,並沒有使用clone模式復制image,這其中暴露出來的問題很多,比如jdk和hadoop的安裝目錄不一樣(完全是拼寫錯誤之類),導致后來更改文件都累死~ 所以象我這樣的初學者還是都統一吧,包括hadoop_admin這樣的操作用戶名稱也最好統一了。
4.1 安裝及配置h2,h3節點服務器
重復創建hadoop_admin用戶,安裝ssh並生成key,到這兒就stop
4.2 將h2,h3的公鑰信息導入到h1的authorized_keys中,以方便之后無密碼SSH文件傳輸
方法為將h2,h3的文件先scp(secure copy)傳輸到h1目錄中
在h2上 sudo scp ~/.ssh/id_rsa.pub hadoop_admin@h1:~/h2pub
在h3上 sudo scp ~/.ssh/id_rsa.pub hadoop_admin@h1:~/h3pub
在h1上
:sudo cat ~/.ssh/id_rsa.pub ~/h2pub ~/h3pub > ~/.ssh/authorized_keys #將自己的,h2和h3的公鑰聚合(concatenate)在一起
:sudo scp ~/.ssh/authorized_keys hadoop_admin@h2:~/.ssh/authorized_keys #好吧,然后再拷回去(Q: slave需要嗎)
:sudo scp ~/.ssh/authorized_keys hadoop_admin@h3:~/.ssh/authorized_keys
4.3 從h1直接安裝JDK,HADOOP到h2,h3
a. 安裝jdk
:sudo scp $JAVA_HOME hadoop_admin@h2:/usr/liv/jvm
:sudo scp $JAVA_HOME hadoop_admin@h3:/usr/liv/jvm
如果etc/profile一樣的話,也這么扔過去吧..
:sudo scp /etc/profile h2:/etc/profile
:sudo scp /etc/profile h3:/etc/profile
b. 安裝hadoop
:sudo scp $HADOOP_HOME hadoop_admin@h2:~/hadoop-0.20.2
:sudo scp $HADOOP_HOME hadoop_admin@h3:~/hadoop-0.20.2
c. 如果etc/hosts一樣的話,把它們也搞過去吧..
:sudo scp /etc/hosts h2:/etc/hosts
:sudo scp /etc/hosts h3:/etc/hosts
檢查上述步驟,互相ping一樣都能互通,使用ssh [hostname]都能不需要密碼互通,那這三個服務器也應該就配置完成了,hadoop啥的也不需要額外配置。
5. 格式化name node
arr.. 這個東西到底是做了啥呢? 很感興趣,直接搜索了一把,還真有人看進源碼。TBD了,之后再深入研究時會看。
6. 啟動hadoop
理論上,如果java home, 用戶及權限,host, IP, ssh無密碼互通之類的全部配置正確的話,這兒可以悠哉的等結果了(但實際上,很多問題啊… 各種配置粗心大意的)
:sudo $HADOOP_HOME/bin/start-all.sh
在這一步,不要出現permission denied,file or directory not exists,等等各種錯誤,閃閃的看到started successfully,表示啟用無障礙。
7. 檢驗是否成功
a. 進程正常
:sudo $JAVA_HOME/bin/jps
name node 4個進程
data node 3個進程
OYEAH! 至少表面看來一切良好,看到這兒,表示您已經成功安裝hadoop完全分布式集群!后續工作會更復雜,期待吧!