一、 su命令
建議不要使用root賬戶直接登錄系統,主要考慮的是系統安全問題。通常的做法是使用su命令切換到root賬戶,完成需要的工作。如果su命令沒有任何參數,默認登錄的就是root賬戶,輸入密碼後會啓動一個root用戶的進程。su可以使一般用戶擁有超級用戶或其他用戶的權限,也可以使超級用戶以一般用戶的身分執行命令。但一般用戶使用該命令時必須輸入root用戶或其他用戶的口令。執行exit命令退出當前用戶的登陸。
執行su命令切換到root用戶的PATH環境變量值:
[root@DataNode1 yarn]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yarn/bin |
執行su–命令切換到root用戶的PATH環境變量值:
[root@DataNode1 ~]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin |
1.1 su命令的常用方法
使用su命令切換用戶主要有兩種方式,這兩種方式略有不同,命令格式如下:
下面這種方式切換用戶後,環境變量不是全部改變,如LOGNAME,登錄用戶名稱,所以不是正真意義上的登錄。
su su root su yarn |
下面的方式會發生正真的登錄,環境變量全部會更新。
su - su -l su --login su - root su - yarn su -l yarn |
對於su命令,常用的方式是切換用戶執行某個命令,當命令執行結束後立即返回當前用戶,通常是root用戶切換到其他普通用戶,使用普通用戶的權限執行命令,當命令執行結束後立即返回當前root用戶,原因是root用戶轉換成普通用戶不需要輸入普通用戶的密碼,常在腳本中使用,如下命令格式:
su - yarn -c "cd /home/yarn ; cp /mnt/hgfs/share/jdk*.gz /home/yarn" |
參數-c後面跟着命令,注意:命令要使用雙引號。
二、 sudo命令
在普通用戶沒有權限執行某個命令時,通常的做法是使用su命令,切換到root權限完成
操作,但是這樣存在的問題是,當多個用戶都使用root權限時,存在系統安全問題,很難確定某個用戶的具體操作。另外,在編寫腳本時,如果遇到普通用戶不具備的權限時,就需要使用root用戶的權限,在這種情況下,通過su命令輸入密碼的方式就無法實現了。對於上面兩個問題的解決辦法是使用sudo命令。
2.1 sudo的特點
sudo命令可以使用root用戶或者其他用戶的身份執行命令,但是需要在/etc/sudoers文件中進行配置,此文件只有root用戶有權限進行編輯,如果沒有在/etc/sudoers文件中配置,在使用sudo命令時會提示警告信息,另外要輸入使用sudo命令的用戶的密碼。
[yarn@DataNode1 ~]$ sudo mkdir /usr/local/syslog
We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:
#1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility.
[sudo] password for yarn: yarn 不在 sudoers 文件中。此事將被報告。 [yarn@DataNode1 ~]$ |
配置sudo命令的使用權限必須編輯/etc/sudoers文件,此文件只有root用戶纔可以修改,並且建議使用visudo命令進行編輯。爲什麼要使用visudo命令進行編輯有兩個原因,一是防止兩個有root權限的用戶同時修改。二是語法檢查。所以建議用visudo命令來編輯/etc/sudoers文件。
root用戶使用visudo命令打開/etc/sudoers文件:
… ## Allow root to run any commands anywhere root ALL=(ALL) ALL … |
可以看到root用戶擁有所有的權限,只有將使用sudo命令的用戶添加到下面就可以了,如將yarn用戶添加到配置文件中。
… ## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn ALL=(ALL) ALL … |
配置完成後,保存退出,yarn用戶就有了使用sudo命令執行所有命令的權限。
[yarn@DataNode1 ~]$ sudo mkdir /usr/local/syslog [sudo] password for yarn: [yarn@DataNode1 ~]$ cd /usr/local [yarn@DataNode1 local]$ ls bin games lib man sbin src vmware-tools-distrib etc include libexec pdsh-2.26 share syslog |
當然,可以通過配置文件/etc/suduers限制用戶執行sudo命令的權限,如有通過sudo執行某些命令的權限,而不是所有命令的權限,如下設置:用戶yarn只能在NameNode主機上執行mkdir命令和touch命令。
在/etc/sudoers文件只設置創建目錄和創建文件的權限:
## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn NameNode=/bin/mkdir,/bin/touch |
下面測試用戶yarn使用sudo命令的權限:
[yarn@NameNode local]$ sudo mkdir /usr/local/syslogs [sudo] password for yarn: [yarn@NameNode local]$ ls bin games libexec pdsh-2.26 share syslogs etc include lib man sbin src vmware-tools-distrib [yarn@NameNode local]$ sudo touch /usr/local/syslogs/syslog.log [yarn@NameNode local]$ cd /usr/local/syslogs [yarn@NameNode syslogs]$ ls syslog.log [yarn@NameNode syslogs]$ sudo rm -f syslog.log 對不起,用戶 yarn 無權以 root 的身份在 NameNode 上執行 /bin/rm -f syslog.log。 |
對sudo命令配置說明,第一列是使用sudo命令的用戶名稱,如果不在此文件中配置就沒有使用sudo命令的權限。第二列是用戶有權使用sudo命令的主機名稱,如果是ALL,說明在所有的主機上都可以使用sudo命令,也可以指定特定的主機,如果要指定多個主機,需要使用逗號分隔。第三列小括號中的ALL代表可以以所有用戶的身份執行命令,也可以指定特定的用戶,如果是多個用戶可以使用逗號分隔。第四列是有權使用sudo命令執行的命令,要使用命令的全路徑,如果不使用全路徑存在安全問題,因爲有同名的腳本,使用root權限執行某個同名的腳本,對系統存在安全隱患。如果是ALL有權執行所有的命令,也可以指定特定的命令,如果是多個命令要使用逗號分隔。
root ALL=(ALL) ALL yarn NameNode,DataNode1=(hadoop) /bin/mkdir,/bin/touch |
如果就一臺服務器單一的主機,只要配置主機上的/etc/sudoers文件就可以了,如果是集羣,就需要在每個主機上對/etc/sudoers文件進行配置,在特定的主機上用戶可以通過sudo命令執行特定的命令。如果在所有的主機上用戶的權限都相同,只需要在一臺主機上進行配置,然後將此文件拷貝到其他主機上就可以了,可以使用pscp命令,後面的內容會涉及到。
將NameNode主機上配置好的/etc/sudoers文件拷貝到DataNode1主機上。
[root@NameNode ~]# pdcp -w DataNode1 "/etc/sudoers" "/etc/sudoers" |
另外,sudo命令不可以使用ssh命令直接遠程執行,ssh命令後面的內容會說明,這裏只是簡單的介紹。要先使用ssh命令遠程到要執行sudo命令的主機上,然後在執行sudo命令,如下例子。
[yarn@NameNode ~]$ ssh DataNode1 "sudo mkdir /usr/local/syslogs" sudo:抱歉,您必須擁有一個終端來執行 sudo [yarn@NameNode ~]$ ssh DataNode1 Last login: Thu Oct 27 11:10:40 2016 from 192.168.230.153 [yarn@DataNode1 ~]$ sudo mkdir /usr/local/syslogs [sudo] password for yarn: [yarn@DataNode1 ~]$ |
下面的例子是用戶yarn使用hadoop用戶的身份執行命令,注意:在執行sudo命令是要使用參數-u來指定使用的用戶名稱。
下面的配置是用戶yarn在NameNode主機上可以使用hadoop用戶的身份執行指定的命令。
root ALL=(ALL) ALL yarn NameNode=(hadoop) /bin/mkdir,/bin/touch |
修改配置文件後,yarn用戶只能使用hadoop用戶的身份執行後面設置的命令,下面執行命令:
[yarn@NameNode local]$ sudo mkdir /usr/local/syslogs [sudo] password for yarn: 對不起,用戶 yarn 無權以 root 的身份在 NameNode 上執行 /bin/mkdir /usr/local/syslogs。 |
當執行命令時,系統提示警告信息,所以要使用參數-u來執行執行命令的用戶身份,如下方式,但是需要注意的是執行命令創建文件的權限還要受到hadoop用戶的權限限制:
[yarn@NameNode local]$ sudo -u hadoop mkdir /home/hadoop/data [yarn@NameNode local]$ cd /home/hadoop -bash: cd: /home/hadoop: 權限不夠 [yarn@NameNode local]$ su hadoop 密碼: [hadoop@NameNode local]$ cd /home/hadoop [hadoop@NameNode ~]$ ls data [hadoop@NameNode ~]$ |
需要注意的是每次執行sudo命令都要使用參數-u來指定用戶身份,默認情況下指定的是root用戶的身份。可以在/etc/sudoers配置文件中進行默認身份用戶設定,設定完成後執行sudo命令時就不需要使用參數-u了,如下設置:
## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn NameNode=(hadoop) /bin/mkdir,/bin/touch Defaults:yarn runas_default=hadoop |
[yarn@NameNode local]$ sudo mkdir /home/hadoop/dir [sudo] password for yarn: [yarn@NameNode local]$ su hadoop 密碼: [hadoop@NameNode local]$ cd [hadoop@NameNode ~]$ ll 總用量 8 drwxr-xr-x. 2 hadoop hadoop 4096 10月 27 12:08 data drwxr-xr-x. 2 hadoop hadoop 4096 10月 27 12:15 dir |
在上面的例子中,每次執行sudo命令都需要輸入執行sudo命令的用戶的密碼,這很不方便,如在腳本中使用某個用戶的身份執行命令時就無法輸入密碼,可以進行配置在執行sudo命令時不需要輸入用戶密碼,需要在配置文件中添加NOPASSWD關鍵字,如下配置:
## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn NameNode=(root) NOPASSWD: /bin/mkdir,/bin/touch |
上面的配置是yarn用戶可以在NameNode主機上使用root用戶的身份執行兩個命令,但是不需要輸入執行sudo命令的用戶yarn的密碼,如下測試。
[yarn@NameNode ~]$ sudo mkdir /usr/local/syslogs [yarn@NameNode ~]$ cd /usr/local [yarn@NameNode local]$ ls bin games libexec pdsh-2.26 share syslogs etc include lib man sbin src vmware-tools-distrib |
需要注意的是,使用visudo命令對/etc/sudoers文件進行配置時,如果語法錯誤保存退出時會有提示信息到控制檯,如下信息:
visudo:>>> /etc/sudoers:syntax error 在行 99 附近<<< 現在做什麼? |
鍵入e是重新編輯/etc/sudoers文件,鍵入x是不保存退出,鍵入Q是保存並退出。如果語法錯誤沒有修改保存並退出,那麼sudo將不會再運行,直到錯誤被糾正。
通常情況下用戶執行sudo命令要記錄日誌,用於檢查某個用戶執行了什麼命令在哪臺主機上等信息。但是sudo命令的日誌記錄不是自動創建的,需要root用戶配置並啓動。
使用root用戶權限在/etc/sudoers文件中進行配置,如下:
## Allow root to run any commands anywhere root ALL=(ALL) ALL yarn NameNode=(root) NOPASSWD: /bin/mkdir,/bin/touch ##配置sudo命令默認日誌文件 Defaults logfile=/var/log/sudo |
測試日誌文件記錄的sudo命令的執行信息:
[yarn@NameNode local]$ sudo mkdir /usr/local/syslogs mkdir: 無法創建目錄"/usr/local/syslogs": 文件已存在 [yarn@NameNode local]$ sudo mkdir /usr/local/syslog ... [root@NameNode log]# cat sudo Oct 27 14:22:33 : yarn : TTY=pts/0 ; PWD=/usr/local ; USER=root ; COMMAND=/bin/mkdir /usr/local/syslogs Oct 27 14:22:48 : yarn : TTY=pts/0 ; PWD=/usr/local ; USER=root ; COMMAND=/bin/mkdir /usr/local/syslog |
配置sudo日誌文件後,普通用戶執行的sudo命令都會記錄日誌,root用戶可以查看日誌文件,知道那個用戶執行了什麼命令,主要是爲了系統安全。日誌文件只有root有查看權限。
三、 SSH免認證登錄
SSH(secureshell),是一個系統管理工具,能夠讓用戶訪問遠程計算機上的Shell進程,並且可以執行各種命令,SSH使用加密通道來傳輸網絡數據,使用加密技術確認訪問用戶的身份,並且可以將主機間的通信加密,可以有效防止陌生主機的網絡***。
單機模式下是沒有Hadoop守護進程,所以不需要配置SSH。在僞分佈式和完全分佈式情況下必須啓動Hadoop守護進程,然而啓動Hadoop守護進程的前提是已經成功安裝了SSH。Hadoop運行過程中需要登錄啓動遠程節點上的Hadoop守護進程,也就是說NameNode是通過SSH來啓動和停止各個DataNode上的各種守護進程的。這就必須在節點之間執行指令的時候無需輸入密碼,因此需要安裝配置SSH,這樣NameNode使用SSH無密碼登錄並啓動其它節點上的DataNode進程。
3.1 安裝SSH工具軟件
首先檢查系統是否已經安裝下面的軟件,如果沒有安裝,需要進行安裝。
用下面的命令查看系統是否安裝了SSH服務和RSYNC服務
rpm -qa | grep openssh rpm -qa | grep rsync |
rsync是遠程數據同步工具,可以同步多臺主機間的文件。
如果沒有安裝兩個服務,採用下面命令安裝,但是安裝需要連接外網。
安裝命令是:
yum install ssh yum install rsync |
3.2 NameNode無密碼登錄DataNode1
在Hadoop啓動階段,NameNode節點需要連接到遠程所有的數據節點DataNode上來啓
動數據節點的守護進程。需要在NameNode上生成一個密鑰對,包括一個公鑰和一個私
鑰,要將公鑰複製到所有的DataNode節點上。當NameNode通過SSH服務連接DataNode
時,DataNode就會生成一個隨機數並用NameNode的公鑰對隨機數進行加密,併發送給
NameNode。NameNode收到加密後的字符串後再用私鑰解密,並將解密後的字符串回傳
給DataNode,DataNode確認無誤之後就允許NameNode進行連接了。這就是一個公鑰
認證過程,不需要用戶手工輸入密碼。
3.2.1 在NameNode上生成密碼對
Linux系統上哪個用戶配置SSH無密碼登錄,其他用戶是不能共享的,所以,如果需要多個用戶都實現SSH無密碼登錄遠程機器,那麼這些用戶都有生成密碼對並且進行配置。在我們的例子中,root用戶需要遠程複製安裝軟件,將多臺機器同步安裝配置軟件,所以root用戶需要配置SSH無密碼登錄認證,而啓動Hadoop服務需要使用yarn用戶,所以yarn用戶也需要進行配置SSH無密碼登錄認證。
集羣中所有的節點目錄結構必須相同,具有相同的用戶。注意:使用yarn用戶和root用戶分別生成密碼對,命令如下:
ssh-keygen -t rsa ssh-keygen -t rsa -f ~/.ssh/id_rsa |
注意:在生成密碼對的過程中,問是否設置密碼和文件生成目錄,直接回車,不設置密碼。使用root用戶和yarn用戶將生成的密碼公鑰複製到要遠程登錄的DataNode上,文件目錄默認。命令如下:
ssh-copy-id -i /root/.ssh/id_rsa.pub DataNode1 ssh-copy-id -i /home/yarn/.ssh/id_rsa.pub DataNode1 ssh-copy-id -i /root/.ssh/id_rsa.pub localhost ssh-copy-id -i /home/yarn/.ssh/id_rsa.pub localhost |
注意:將生成的公鑰複製到數據節點上需要對/etc/hosts文件進行配置,將所有的數據節點的ip和主機名按行進行配置,需要root用戶權限,命令如下:
vi /etc/hosts … 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.230.153 NameNode 192.168.230.154 DataNode1 … |
還可以採用下面的方式,但是沒有上面的方式簡潔。
ssh-keygen -t rsa -f ~/.ssh/id_rsa scp ~/.ssh/id_rsa.pub [email protected]:~/ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh |
3.3 SSH遠程常用方法
3.3.1 連接到遠程主機
可以通過ssh命令遠程到其他主機,前提是配置了SSH無密碼認證,通過下面的命令直接遠程到其他主機上進行命令操作。ssh命令後面可以跟IP地址或者主機名稱,但是主機名稱和IP的對應需要在/etc/hosts文件中進行配置。
[root@NameNode local]# ssh DataNode1 Last login: Wed Oct 26 17:55:44 2016 from 192.168.230.153 [root@DataNode1 ~]# pwd /root [yarn@NameNode local]$ ssh DataNode1 Last login: Wed Oct 26 18:28:38 2016 from 192.168.230.1 [yarn@DataNode1 ~]$ pwd /home/yarn … [root@NameNode local]# ssh [email protected] Last login: Wed Oct 26 19:39:38 2016 from 192.168.230.153 [root@NameNode local]# ssh root@DataNode1 Last login: Wed Oct 26 19:49:01 2016 from 192.168.230.153 [root@NameNode local]# ssh yarn@DataNode1 yarn@datanode1's password: |
通過ssh命令遠程其他主機,一旦認證成功,將會爲用戶返回一個shell連接。
3.3.2 SSH服務的默認端口號
SSH服務器默認在端口22上運行。如果SSH服務器指定的是其他的端口號。可以使用-p參數進行指定端口號,如下方式。
[root@NameNode local]# ssh DataNode1 -p 22 Last login: Wed Oct 26 19:49:29 2016 from 192.168.230.153 [root@DataNode1 ~]# |
3.3.3 在當前主機執行遠程命令
可以在當前主機中執行遠程命令,命令格式如下:
ssh 主機名 | root@主機名 | root@IP "命令" ssh 主機名 | yarn@主機名 | yarn@IP "命令" |
如下例子:
[root@NameNode local]# ssh DataNode1 "echo OK" OK [root@NameNode local]# ssh DataNode1 "echo $USER" yarn [root@NameNode local]# |
如果想要在遠程機器上一次執行多條命令,命令要用分號分隔,注意:命令要使用雙引號,如下例子:
[root@NameNode local]# ssh DataNode1 "cd /home/yarn ; mkdir logs ; cd logs ; touch syslog.log" [root@NameNode local]# ssh DataNode1 "cd /home/yarn ; rm -rf logs" [root@NameNode local]# |
3.3.4 在腳本中使用SSH
可以在腳本中使用ssh命令,如:在集羣中所有的機器上創建日誌目錄,並在目錄中創建日誌文件,首先,我們先創建一配置文件,用來保存集羣中所有的主機名稱或IP地址。
主機配置文件hosts,文件內容如下,注意:每個主機名稱佔用一行。
NameNode DataNode1 |
腳本createLogs.sh:
#!/bin/bash # 使用ssh命令爲所有的主機創建日誌文件 for line in `cat hosts` do echo "開始爲主機:$line創建日誌目錄和日誌文件..." ssh $line "cd /usr/local ; mkdir logs ; cd logs ; touch syslog.log" done ~ |
腳本執行會使用ssh命令遠程創建目錄和文件。
四、 pdsh概述
以搭建一個Hadoop集羣爲例,通常情況下多臺機器具有有同樣的配置,同樣的目錄結構,如:JDK的安裝目錄和環境變量配置文件,Hadoop的安裝目錄和配置文件。通過手工配置效率較低。
pdsh是一個開源的工具,可以在多個遠程機器上並行執行命令,pdsh的全稱是paralleldistributed shell(並行的分佈式Shell)。pdsh主要用於大批量服務器的配置、部署、文件複製等操作。在使用pdsh遠程操作時,需要配置本地主機和遠程主機間的ssh無密碼登錄服務。另外,pdsh還附帶了pdcp命令,此命令可以將本地文件批量複製到遠程的多臺主機上,在搭建集羣環境時是非常有用。
pdsh可以通過多種方式在遠程主機上運行命令,默認是rsh方式,另外也支持ssh、mrsh、qsh、mqsh、krb4、xcpu等多種rcmd模塊,這個可以在運行命令時通過參數指定。我們指定ssh服務爲遠程登錄服務。
4.1 pdsh安裝
我們還是將pdsh工具安裝到/usr/local目錄下,當然也可以是其他目錄,如果/opt目錄等等。首先將pdsh安裝包pdsh-2.26.tar.bz2從共享文件夾拷貝到/usr/local目錄下,注意:拷貝安裝過程必須使用root用戶權限。
cd /usr/local su cp /mnt/hgfs/share/pdsh/pdsh-2.26.tar.bz2 . |
使用root權限在/usr/local目錄下解壓文件:
tar -jxvf pdsh-2.26.tar.bz2 |
解壓完成後,生成一個目錄pdsh-2.26,進入目錄中,分別指向下面三條命令,注意:安裝pdsh工具軟件需要使用c編譯器gcc,如果沒有安裝,pdsh不能安裝成功,需要首先安裝gcc編譯器。
檢查系統是否安裝了gcc編譯器:
[yarn@NameNode ~]$ rpm -qa | grep gcc gcc-4.4.7-17.el6.i686 libgcc-4.4.7-17.el6.i686 |
如果沒有安裝gcc-4.4.7-17.el6.i686,要首先安裝,安裝過程需要外網,安裝命令如下:
yum install gcc |
安裝過程需要幾分鐘時間,直到命令行提示符出現,可以在執行上面的rpm命令檢查是否安裝成功。gcc安裝成功後,就可以安裝pdsh工具軟件了,按照下面的命令順序執行。
cd pdsh-2.26 ./configure --with-ssh --without-rsh --with-machines=/etc/pdsh/machines make make install |
在執行configure腳本時,“--with-ssh”參數表示啓用ssh模塊,而“--with-dshgroups”表示啓用主機組支持,啓用此參數後,就可以將一組主機列表寫入一個文件並放到~/.dsh/group或/etc/dsh/group目錄下,然後通過pdsh的“-g”參數進行調用。最後的參數“--with-machines”是“--with-dshgroups”參數的擴展,通過將所有要管理的主機列表都寫入指定的/etc/pdsh/machines文件中,接着通過pdsh的“-a”參數調用,最終完成所有主機的便捷管理。
檢測是否安裝成功,使用下面的命令。
pdsh -v |
如果顯示使用信息,說明安裝成功。
4.2 pdsh基本命令
4.2.1 pdsh命令
在一個集羣中,從一臺主機上可以通過ssh命令遠程到其他主機上執行命令,如果集羣機器很多,可以通過在腳本中使用ssh命令的方式執行,但是ssh命令還是有侷限的,如一臺機器執行結束後另一臺機器才能開始執行,而pdsh命令可以並行在多臺機器上同時執行相同的命令,當然pdsh底層使用的還是ssh或其他的遠程方式,如rsh等等。
pdsh命令格式:
pdsh [-參數選項] 命令 |
下面將pdsh命令常用參數進行舉例說明。
參數-h:顯示pdsh命令的使用說明:
[yarn@NameNode ~]$ pdsh -h Usage: pdsh [-options] command ... -S return largest of remote command return values -h output usage menu and quit -V output version information and quit -q list the option settings and quit -b disable ^C status feature (batch mode) -d enable extra debug information from ^C status -l user execute remote commands as user -t seconds set connect timeout (default is 10 sec) -u seconds set command timeout (no default) -f n use fanout of n nodes -w host,host,... set target node list on command line -x host,host,... set node exclusion list on command line -R name set rcmd module to name -M name,... select one or more misc modules to initialize first -N disable hostname: labels on output lines -L list info on all loaded modules and exit -g groupname target hosts in dsh group "groupname" -X groupname exclude hosts in dsh group "groupname" -a target all nodes available rcmd modules: ssh,exec (default: ssh) |
參數-w:指定要執行的遠程主機,可以指定多個,每個主機用逗號隔開,可以是主機名也可以是IP地址。
[yarn@NameNode ~]$ pdsh -w NameNode,DataNode1 "cd /home/yarn ; mkdir data" [yarn@NameNode ~]$ pdsh -w 192.168.230.153,192.168.230.154 "cd /home/yarn ; mkdir data" |
通常的做法是,將主機名稱配置到文件中,因爲主機很多的情況下,採用上面的方式命令會很長。上面的命令方式適合對單一的遠程主機進行操作。下面採用配置文件的方式實現上面命令的功能。
主機配置文件hosts:
NameNode DataNode1 |
或者採用主機IP地址的方式:
192.168.230.153 192.168.230.154 |
注意:將hosts文件放在執行pdsh命令的目錄下,如:在/home/yarn目錄下創建一個目錄job,將hosts文件拷貝到job目錄下,在job目錄下執行pdsh命令。
pdsh -w ^hosts "cd /home/yarn ; mkdir data" |
查看主機上的IP和主機名稱:
[yarn@NameNode job]$ pdsh -w ^hosts "echo $HOSTNAME" 192.168.230.153: NameNode 192.168.230.154: NameNode [yarn@NameNode job]$ |
參數-R:指定遠程工具名稱,pdsh默認是rsh,我們在安裝pdsh時已經重新指定了ssh,當然可以使用-R參數重新指定。
pdsh -w ^hosts -R ssh "cd /home/yarn ; mkdir data" |
參數-a:通過-a參數可以指定所有的遠程主機,在pdsh命令中使用此參數,pdsh默認會查看/etc/pdsh/目錄下的machines文件中的主機列表,目錄名稱和文件名稱在執行configure腳本時可以修改,通過“--with-machines”參數進行指定。
./configure --with-ssh --without-rsh --with-machines=/etc/pdsh/machines |
我們就以默認情況舉例,首先使用root用戶權限在/etc目錄下創建pdsh目錄,在此目錄下創建文件machines文件,文件中是主機名稱,一行一個,也可以使用IP地址,保存後退出。
su cd /etc mkdir pdsh cd pdsh vi machines NameNode DataNode1 :wq |
執行pdsh命令:
[yarn@NameNode ~]$ pdsh -a "cd /home/yarn ; touch pdsh" |
命令執行後會在兩個主機上創建文件pdsh,當使用-a參數時,就不需要使用-w參數,系統會從/etc/pdsh目錄下讀取machines文件中的主機名稱執行命令。
參數-x: 此參數和-w參數功能正好相反,用來指定不執行命令的多個或單個主機,使用方式如-w參數。
採用主機名稱的方式,NameNode主機執行命令,DataNode1主機不執行命令:
[yarn@NameNode ~]$ pdsh -w NameNode -x DataNode1 "cd /home/yarn ; touch syslogs" |
如果要是有多個主機執行命令,多個主機除外,可以採用配置文件的形式,還是上面的例子,將NameNode寫入hosts1文件,DataNode1寫入hosts2文件,以下面的方式執行。
[yarn@NameNode job]$ echo NameNode > hosts1 [yarn@NameNode job]$ echo DataNode1 > hosts2 [yarn@NameNode job]$ cat hosts1 NameNode [yarn@NameNode job]$ pdsh -w ^hosts1 -x ^hosts2 "cd /home/yarn ; touch file" |
4.2.2 pdcp命令
如果配置整個集羣,要求所有的機器安裝相同的軟件,如果逐一拷貝效率較低,通常的做法是將所有要安裝的軟件拷貝到一臺主機上,通過pdcp命令同步拷貝到其他機器上。pdcp命令格式:
pdcp [-參數] “源文件1” [源文件2...] 目標 |
下面將pdcp命令常用參數進行舉例說明,參數的用法和pdsh命令大多相同。
參數-w:指定要拷貝文件的遠程主機,多個主機用逗號隔開,可以是主機名也可以是IP地址。
[yarn@NameNode ~]$ pdcp -w DataNode2 "syslogs" "/home/yarn" |
也可以將主機名稱或IP寫入到一個配置文件,使用方式如pdsh命令。
[yarn@NameNode ~]$ pdcp -w ^hosts "syslogs" "/home/yarn" |
如果拷貝的是一個目錄,需要加上參數-r。
[yarn@NameNode ~]$ pdcp -w ^hosts -r "job" "/home/yarn" |
需要注意的是,pdcp命令後面是兩個或多個參數,要用空格分隔,建議將參數使用雙引號。
參數-x和-w正好相反,用法與pdsh命令相同。
$ pdcp -w DataNode2 -x NameNode "job/hosts1" "job/hosts2" "/home/yarn" |
參數-a的用法與pdsh命令相同,要在/etc/pdsh/machines文件中配置主機名稱或IP地址,因爲pdcp命令會讀取此文件的主機信息。
[yarn@NameNode ~]$ pdcp -a "sys" "/home/yarn" |
4.2.3 使用pdsh工具爲集羣所有的主機安裝配置JDK
首先要在所有的主機上安裝pdsh工具軟件,如果只使用pdsh命令,其他主機不需要安裝pdsh軟件,但是pdcp命令需要目標主機也安裝pdsh軟件才能拷貝成功。下面的例子是集羣安裝JDK並配置環境變量。
首先將JDK安裝包拷貝到NameNode主機上,因爲JDK要安裝在/usr/local目錄下,這個目錄只有root用戶採用權限,所以腳本的執行者是root用戶,這是通用的做法。在root用戶的工作目錄/root下創建一個目錄job,將JDK安裝包和腳本文件都放置在這個目錄下,同樣,主機名稱配置文件也放置在這個目錄下。
# yarn用戶登錄,然後切換成root用戶 su # 進入到root用戶的工作目錄 cd /root # 創建job目錄 mkdir job # 進入到job目錄 cd job # 將JDK文件拷貝到當前目錄 cp /mnt/hgfs/share/jdk*.gz . # 編輯主機配置文件 vi hosts NameNode DataNode1 :wq # 編輯執行腳本 vi install_jdk.sh |
install_jdk.sh腳本:
#!/bin/bash # 在NameNode主機上執行的腳本,將JDK安裝包先拷貝到各個數據節點上的/usr/local目錄下 # 然後在各節點使用tar命令安裝JDK,安裝完成將JDK安裝包刪除,然後在/etc/prfile.d目錄下配置JDK環境變量 # 安裝配置完成後,執行 jdk="jdk-8u51-linux-i586.tar.gz" jdkpath="/usr/local" JAVA_HOME="$jdkpath/jdk1.8.0_51" JRE_HOME="$jdkpath/jdk1.8.0_51/jre"
echo "刪除JDK相關軟件包..." pdsh -w ^hosts "rpm -e --nodeps tzdata-java-2012j-1.el6.noarch" 2>/dev/null pdsh -w ^hosts "rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.i686" 2>/dev/null pdsh -w ^hosts "rpm -e --nodeps java-1.7.0-openjdk-1.7.0.9-2.3.4.1.el6_3.i686" 2>dev/null echo "拷貝$jdk到數據節點..." pdcp -w ^hosts $jdk $jdkpath echo "在各節點安裝$jdk..." pdsh -w ^hosts "tar -xzf $jdkpath/$jdk -C $jdkpath/" echo "刪除各節點上的$jdk安裝包..." pdsh -w ^hosts "rm -f $jdkpath/$jdk" echo "配置JDK環境變量..." pdsh -w ^hosts "echo export JAVA_HOME=$jdkpath/jdk1.8.0_51 >> /etc/profile.d/java.sh" pdsh -w ^hosts "echo export JRE_HOME=$jdkpath/jdk1.8.0_51/jre >> /etc/profile.d/java.sh" pdsh -w ^hosts "echo export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH >> /etc/profile.d/java.sh" pdsh -w ^hosts "echo export CLASS_PATH=.:$JAVA_HOME/lib:$JRE_HOME/lib >> /etc/profile.d/java.sh" pdsh -w ^hosts "source /etc/profile.d/java.sh" |
需求:將NameNode主機和DataNode1主機上的JDK卸載,環境變量文件刪除。