Hadoop集群搭建之SSH無密碼登錄配置
在多臺電腦上搭建Hadoop集群已經有一段時間了,SSH無密碼登錄服務配置成了一道無法逾越的鴻溝,在啟動hadoop集群時,老是讓輸入datanode也就是slave的密碼,但是輸入密碼但卻總是提示permission denied,啟動不了datanode。看了網上有關hadoop集群搭建之ssh服務總是千篇一律,不得其法,由于本人是菜鳥一枚,也無法自行快速解決,十分糾結。機緣巧合,我遇到一個對SSH較為熟知的大牛,從他那里獲得啟發,終于完成了ssh無密碼登錄的配置。在這里向他致敬。廢話不多說,下面就對ssh密碼登錄其他主機做一個粗略的說明(我使用的系統是Ubuntu12.04 lts,linux 3.2的內核,不過這個對ssh配置應該沒有什么影響)。
特別說明:為使在啟動Hadoop集群時不用輸入datanode的密碼,***將所有機器的用戶名設為同一個名字,我會在文章***給出解釋。我這里用兩臺機器做為實例,兩臺機器的用戶名都是hadoop,主節點的ip為121.49.110.32,一臺為192.168.0.2。
1.ssh的安裝與配置(兩臺機器做同樣的設置)
1.1 ssh服務的安裝
打開終端,輸入:
sudo apt-get install openssh-server
程序自動安裝。
1.2 ssh服務的配置
有的網友說在配置ssh前需要關閉防火墻,我照做了,不過關閉也應該沒有問題。關閉防火墻的命令“sudo ufw disable”.然后在終端輸入:
ssh-keygen
遇到提示輸入文件名或是密碼的地方不用管,只需按回車鍵即可。完成之后,在/home/username(“username”是登錄名)目錄下會有生成 一個".ssh"目錄,“ls .ssh”之后會發現里面有兩個文件,一個是id_rsa,另一個是id_rsa.pub,前者是私鑰,后者是公鑰。
在終端輸入:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
建立信任連接列表
在終端輸入:
ssh localhost
如果有錯誤提示,類似"ssh: connect to host localhost port22: Connection refused",說明你沒有安裝ssh-client,此時只需要在終端輸入:
sudo apt-get install openssh-client
安裝完成后,再輸入“ssh localhost”就應該沒有問題了。按照提示輸入相關信息就可以了。
2.無密碼登錄另一臺主機(121.49.110.32無密碼登錄192.168.0.2)
在ip為121.49.110.32主機終端中輸入:
sudo gedit /etc/hosts
在***鍵入:
192.168.0.2Hadoop
保存退出。并在終端中鍵入:
scp ~/.ssh/id_rsa.pubHadoop@192.168.0.2:/home/hadoop/
這里可能會讓輸入Hadoop@192.168.0.2的主機密碼,輸入就可以了。
在ip為192.168.0.2的主機終端中鍵入:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
建立信任列表。然后回到121.49.110.32的主機上,終端鍵入:
sshHadoop@192.168.0.2
如果有輸入密碼的提示,直接輸入ip為192.168.0.2的主機密碼就可以了。實際上,如果你鍵入:
ssh 192.168.0.2
程序也可能會提示你輸入Hadoop@192.168.0.2密碼,輸入即可。到此已經完成了ssh無密碼登錄的配置工作,如果hadoop集群已經好了,在終端中切換到hadoop的安裝目錄下,并輸入:
bin/start-all.sh
你會發現程序先是啟動namenode,然后啟動192.168.0.2上的job tracker,但不會讓用戶鍵入192.168.0.2的密碼。但是如果你兩臺主機的用戶名不一樣,比如說121.49.110.32主機的用戶名為namenode,而192.168.0.2主機的用戶名為datanode,系統將讓你輸入“namenode@192.168.0.2”的密碼。此時,你怎么輸入密碼都不能成功啟動datanode,這是為什么呢?請看下面:
ssh在登錄其他主機時采用的“ ssh 目的主機用戶名@目的主機的ip”的模式,如這里“sshHadoop@192.168.0.2”,ip確定唯一主機,用戶名確定主機上的有效用戶,密碼用于切換到該用戶目錄下。在hadoop的集群中,slave文件中給的是datanode的主機ip,在啟動hadoop的時候,hadoop會依照該文件提供的ip地址逐個啟動datanode節點上的tasktracker和datanode守護進程,但是由于沒有提供datanode主機的用戶名,因而ssh默認以當前用戶(假設為namenode)做為目標主機的用戶(假設為datanode),但ssh不會檢測目標主機是否存在該用戶(這顯然不是它的工作),在本機~/.ssh/known_hosts中沒有存放有namenode@datanode‘s ip,因而需要輸入密碼,但是由于目標主機沒有namenode用戶,因而無論怎么輸入密碼都是錯的,或者提示權限不夠。
所以,如果要搭建Hadoop集群,***將所有機器的用戶名改成同一個用戶,這樣會方便很多。當然,這也是我的片面之詞請勿噴我!如果有朋友不這樣做也能將多臺機器的hadoop集群搭建成功也歡迎分享,供大家選擇。歡迎大家積極交流,一個人抗爭,能力,精力始終有限^_^。