參考:http://blog.csdn.net/u010270403/article/details/51444677java
虛擬機中共五個centos系統,每一個系統有兩個用戶root和hadoop:cdh1,cdh2,cdh3,cdh4,cdh5node
集羣規劃shell
第一步,切換到hadoop的家目錄下,而後在hadoop家目錄下建立 tools目錄(只在一臺機器便可,以cdh1爲例)centos
建立tools目錄bash
#mkdir tools
第二步,在tools目錄下建立三個批處理文件:deploy.conf、deploy.sh、runRemoteCmd.sh(由於後續還要用Hadoop爲這三個文件賦權限,且只有Hadoop用戶會用這些文件,因此這三個文件用Hadoop用戶建立)app
建立deploy.confssh
#vi deploy.conf
cdh1,all,namenode,journalnode,resourcemanager,
cdh2,all,namenode,journalnode,slave,resourcemanager,
cdh3,all,zookeeper,slave,journalnode,datanode,nodemanager,
cdh4,all,zookeeper,slave,journalnode,datanode,nodemanager,
cdh5,all,zookeeper,slave,journalnode,datanode,nodemanager,
建立deploy.shoop
#vi deploy.sh
#!/bin/bash #set -x #判斷參數是否小於3個,由於運行deploy.sh須要有源文件(或源目錄)和目標文件(或目標目錄), #以及在MachineTag(哪些主機)上執行,這個標記就是上面deploy.conf中的標記 ,如 zookeeper、all等 #使用實例如:咱們把app目錄下的全部文件複製到遠程標記爲zookeeper的主機上的/home/hadoop/app目錄下 # ./deploy.sh /home/hadoop/app /home/hadoop/app zookeeper #執行完上述命令後,shell腳本文件就自動把CDHNode1下的app目錄中的文件複製到三個zookeeper節點的app目錄下 if [ $# -lt 3 ] then echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag" echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile" exit fi #源文件或源目錄 src=$1 #目標文件或目標目錄 dest=$2 #標記 tag=$3 #判斷是否使用deploy.conf配置文件,或者本身指定配置文件 if [ 'a'$4'a' == 'aa' ] then confFile=/home/hadoop/tools/deploy.conf else confFile=$4 fi #判斷配置文件是不是普通文本文件 if [ -f $confFile ] then #判斷原件是普通文件仍是目錄 if [ -f $src ] then #若是是普通文件就把解析出標記對應的主機名的ip for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` do scp $src $server":"${dest} #使用循環把文件複製到目標ip上的相應目錄下 echo "循環"$src $server":"${dest} done elif [ -d $src ] then for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` do scp -r $src $server":"${dest} echo "循環"$src $server":"${dest} done else echo "Error: No source file exist" fi else echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory" fi
建立runRemoteCmd.sh#vi runRemoteCmd.shspa
#!/bin/bash #set -x #判斷參數個數 #實例如:顯示全部節點的java進程,中間用引號的就是命令,這個命令將在因此節點上執行 #./runRemoteCmd.sh "jps" all if [ $# -lt 2 ] then echo "Usage: ./runRemoteCmd.sh Command MachineTag" echo "Usage: ./runRemoteCmd.sh Command MachineTag confFile" exit fi cmd=$1 tag=$2 if [ 'a'$3'a' == 'aa' ] then confFile=/home/hadoop/tools/deploy.conf else confFile=$3 fi if [ -f $confFile ] then for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` do echo "*******************$server***************************" ssh $server "source /etc/profile; $cmd" # 注意在使用的時候要根據本身設置的環境變量的配置位置,給定相應的source源 , # 如 我把環境變量設/home/hadoop/.bash_profile文件下,就須要上面這條命令改成 # ssh $server "source /home/hadoop/.bash_profile;$cmd" #上面的例子:這條命令就是在遠程標記爲tag的主機下執行這個命令jps。 done else echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory" fi
第三步,給腳本文件添加執行權限.net
#chmod u+x deploy.sh #chmod u+x runRemoteCmd.sh
第五步,在cdh1節點上,經過runRemoteCmd.sh腳本,一鍵建立全部節點的軟件安裝目錄/home/hadoop/app
# ./runRemoteCmd.sh "mkdir /home/hadoop/app" all
查看cdh1和cdh2家目錄
cdh1
cdh2
在cdh1上進入~/tools,執行runRemoteCmd.sh腳本,並查看Hadoop家目錄
cdh1
cdh2
完成!