Hadoop運作過程中需要管理遠端Hadoop守護程序,在Hadoop啟動以後,NameNode是通過SSH(Secure Shell)來啟動和停止各個DataNode上的各種守護程序的。這就必須在節點之間執行指令的時候是不需要輸入密碼的形式,故我們需要配置SSH運用無密碼公鑰認證的形式,這樣NameNode使用SSH無密碼登入并啟動DataName程序,同樣原理,DataNode上也能使用SSH無密碼登入到NameNode
安裝和啟動SSH協定
我們需要兩個服務:ssh和rsync,現在需要檢視是否已經安裝。可以通過下面指令檢視結果顯示如下:
[[email protected] java]# rpm -qa | grep openssh
openssh-askpass-p1-el6.x86_64
openssh-p1-el6.x86_64
openssh-server-p1-el6.x86_64
openssh-clients-p1-el6.x86_64
[[email protected] java]# rpm -qa | grep rsync
rsync--el6_4.x86_64
假設沒有安裝ssh和rsync,可以通過下面指令進行安裝。
yum install ssh //安裝SSH協定
yum install rsync //(rsync是一個遠端資料同步工具,可通過LAN/WAN快速同步多台主機間的檔案)
service sshd restart //啟動服務
配置Master無密碼登入所有Salve
SSH無密碼原理
Master(NameNode | JobTracker)作為用戶端,要實作無密碼公鑰認證,連接配接到伺服器Salve(DataNode | Tasktracker)上時,需要在Master上生成一個密鑰對,包括一個公鑰和一個私鑰,而後将公鑰複制到所有的Slave上。當Master通過SSH連接配接Salve時,Salve就會生成一個随機數并用Master的公鑰對随機數進行加密,并發送給Master。Master收到加密數之後再用私鑰解密,并将解密數回傳給Slave,Slave确認解密數無誤之後就允許Master進行連接配接了。這就是一個公鑰認證過程,其間不需要使用者手工輸入密碼。重要過程是将用戶端Master複制到Slave上。
Master機器上生成密碼對
用普通使用者權限在Master節點上執行以下指令:
[[email protected] ~]$ ssh-keygen -t rsa -P ''
Generating public/private rsa key pair.
Enter file in which to save the key (/home/cls/.ssh/id_rsa):
Your identification has been saved in /home/cls/.ssh/id_rsa.
Your public key has been saved in /home/cls/.ssh/id_rsa.pub.
The key fingerprint is:
e9::d:c6:c6:eb:::f6:b:e7:e2:c7::f: [email protected]
The key's randomart image is:
+--[ RSA ]----+
| |
| |
| |
| o o . |
| B S . |
| o ++.o o E |
| .+.o.=.o |
| .. ..oo+ |
| .. .o+. |
+-----------------+
該操作會預設在”/home/cls/”下生成”.ssh”檔案夾,且”.ssh”檔案下包含兩個剛生産的無密碼密鑰對。
然後是修改檔案夾”.ssh”的使用者權限,把他的權限修改為”700”,用下面指令執行:
備注:如果不進行,即使你按照前面的操作設定了”authorized_keys”權限,并配置了”/etc/ssh/sshd_config”,還重新開機了sshd服務,在Master能用”ssh localhost”進行無密碼登入,但是對Slave1.Hadoop進行登入仍然需要輸入密碼,就是因為”.ssh”檔案夾的權限設定不對。這個檔案夾”.ssh”在配置SSH無密碼登入時系統自動生成時,權限自動為”700”,如果是自己手動建立,它的組權限和其他權限都有,這樣就會導緻RSA無密碼遠端登入失敗。
接着在Master節點上做如下配置,把id_rsa.pub追加到授權的key裡面去。
[[email protected] .ssh]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[[email protected] .ssh]# ls
authorized_keys id_rsa id_rsa.pub
在驗證前,需要做兩件事兒。第一件事兒是修改檔案”authorized_keys”權限(權限的設定非常重要,因為不安全的設定安全設定,會讓你不能使用RSA功能),另一件事兒是用root使用者設定”/etc/ssh/sshd_config”的内容。使其無密碼登入有效。
修改檔案”authorized_keys”
操作如下:
cls@Master .ssh]$ chmod ~/.ssh/authorized_keys
[cls@Master .ssh]$ ll
total
-rw-------. cls cls Dec : authorized_keys
-rw-------. cls cls Dec : id_rsa
-rw-r--r--. cls cls Dec : id_rsa.pub
如果不進行設定,在驗證時,仍然提示你輸入密碼。
設定SSH配置
用root使用者登入伺服器修改SSH配置檔案”/etc/ssh/sshd_config”的下列内容。
RSAAuthentication yes //啟用 RSA 認證
PubkeyAuthentication yes //啟用公鑰私鑰配對認證方式
AuthorizedKeysFile .ssh/authorized_keys //公鑰檔案路徑(和上面生成的檔案同)
設定完之後記得重新開機SSH服務,才能使剛才設定有效。
[[email protected] .ssh]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
退出root登入,使用hadoop普通使用者驗證是否成功。
[[email protected] .ssh]$ ssh localhost
The authenticity of host 'localhost (::)' can't be established.
RSA key fingerprint is :c:::c::dd:::c:a4:e:d:::f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Last login: Sun Dec :: from localhost
從以上内容中得知無密碼登入本級已經設定完畢,之後我們需要在每個節點上執行以上操作。
最後我們需要将每個節點中的id_rsa.pub追加到其他節點的檔案中,以Mster.hadoop機器為例:
[cls@Master .ssh]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[cls@Master .ssh]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[cls@Master .ssh]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
其他節點以此類推,最後達到的效果是:叢集内任何一個節點都能無密碼登入上叢集中的任意節點。