這裡一共有三台機器,系統為ubuntu 14.04.2,其中一台為master 其餘兩台為slave
首先用adduser指令添加一個普通使用者,指令如下:
修改 /etc/sudoers 檔案,找到下面一行,把前面的注釋(#)去掉
這裡設定三台機器的使用者名統一為lq
/etc/hostname檔案中存放的是主機名,修改檔案後儲存然後重新開機機器,重新登陸後主機名生效 這裡設定master機器主機名為rfidlabmaster 其餘兩台機器主機名分别為rfidlabslave1、rfidlabslave2
配置hosts 在三台機器上分别修改/etc/hosts檔案,如在master機器上修改:
用以下形式添加
在master機器下
一直回車。.ssh目錄下多出兩個檔案
私鑰檔案:id_rsa公鑰檔案:id_rsa.pub
複制id_rsa.pub檔案為authorized_keys
将公鑰檔案authorized_keys分發到節點rfidlabslave1、rfidlabslave2上:
注意:如果目前使用者目錄下沒有.ssh目錄,可以自己建立一個該目錄,該目錄的權限最好設定為700,authorized_keys權限最好設定為600
驗證ssh無密碼登入:
由于master機器上已經安裝過java,安裝目錄為/usr/lib/jvm/jdk1.8.0_60,是以直接将安裝目錄發到其他的slave節點,如果沒有java,就要去官網下載下傳解壓。
修改/etc/profile檔案 配置java環境變量
<a href="http://hadoop.apache.org/releases.html">hadoop下載下傳位址</a>
可以選擇一個自己需要的版本,這裡選擇的是hadoop-2.5.2
先下載下傳一個到master伺服器的/opt/tools路徑下,如果該路徑不存在就自己建立一個該目錄
修改hadoop xml檔案配置
修改etc/conf/core-site.xml 配置如下
修改etc/conf/mapred-site.xml 配置如下
conf/hdfs-site.xml 配置如下,注意檔案路徑中不要包含一些點、逗号等特殊字元,檔案路徑需要寫成完全路徑,以file:開頭
修改etc/hadoop/yarn-site.xml
修改 etc/hadoop/slaves
etc/hadoop/hadoop-env.sh和yarn-env.sh中配置java環境變量
使用scp 直接把以上配置copy到另外的叢集上
修改/etc/profile檔案 配置hadoop環境變量
分布式hadoop環境搭建完畢
(1)格式化檔案系統
如果啟動失敗 則需要手動建立目錄
成功會顯示 info common.storage: storage directory /home/lq/hadoop/dfs/name has been successfully formatted.
(2) 啟動hadoop
輸出:
如果出現以下輸出使其卡着不動,則要在/etc/ssh/ssh_config 檔案中添加
stricthostkeychecking no 然後重新開機ssh服務/etc/init.d/ssh restart
去其他slave節點輸入 jps 檢視
fatal org.apache.hadoop.hdfs.server.datanode.datanode: initialization failed for block pool (datanode uuid unassigned) service to master/xxx. exiting. java.io.ioexception: incompatible clusterids
問題定位:所有namenode目錄、所有datanode目錄、從節點臨時目錄
問題原因:
1) 主節點的namenode clusterid與從節點的datanode clusterid不一緻
2) 多次格式化了namenode跟datanode之後的結果,格式化之後從節點生成了新的id,造成不一緻
解決辦法:
在格式化之前,先把所有的服務停掉(stop-dfs.sh、stop-yarn.sh或者stop-all.sh),確定都停掉了之後,分别到所有節點的namenode目錄、datanode目錄、臨時目錄,把以上目錄裡面的所有内容都删除掉。然後再重新啟動就可以了。一個個機器删除比較麻煩 附上一個腳本可以在各台機器上批量删除,參考該部落格改寫的
建立腳本:allcmd.sh
建立完執行chmod +x allcmd.sh
建立指令檔案 cmdlist
建立伺服器清單檔案 serverlist
使用方法:在腳本所在目錄下建立cmdlist檔案和serverlist
然後調用:./allcmd.sh serverlist cmdlist 即可