在第一篇關于hadoop叢集的文章中主要是講了關于叢集的一些基礎原理知識,以及準備了三台獨立的虛拟機。
在正式進行叢集部署時,我們還需要做一點點的準備,那就是ssh的安裝,那為什麼要在叢集部署中安裝ssh呢? 請留意後面做出的解釋
scp(完全拷貝)
試想一下這樣一個場景:當你在hadoop100虛拟機上有一個scp_test檔案夾,這時候你要拷貝到其他兩台虛拟機上,第一種方法就是直接拷貝,用u盤複制出來,這種辦法顯然不是我們程式員該做的;第二種辦法就是利用scp指令行進行拷貝。
基于文法
scp -r scp_test [email protected]:work/

參數說明:
-r :遞歸拷貝,在拷貝檔案夾時候必須添加
scp_test :需要拷貝的目标檔案夾,這是我事先建立好的測試檔案夾
leon:是我的一個使用者名,這是最開始第一章中我們建立好的,它的權限和root一樣;
hadoop99:目标主機名,這裡本來是要寫目标主機的ip,為什麼可以寫主機名?其實是做了一些設定後,它其實也是表示目标虛拟機的ip位址;
work:這就是要拷貝到的目的地檔案夾;
主機名設定
在之前的scp指令中,為什麼可以使用hadoop99表示主機,其實是經過了一個簡單的設定,具體設定如下:
第一步:設定每個主機的主機名
sudo vim /etc/hostname
打開後在裡面寫上我們的主機名為hadoop99就可以了,這時hadoop99主機名就表示這台虛拟機的ip位址,以後用誰都可以找到這台虛拟機了。
但是這隻是指定了主機名,隻有自己才知道自己的名字,那其他的主機如何知道我這台主機的主機名呢?那就需要做一個公示?也就是第二步。
第二步:主機名公示
sudo vim /etc/hosts
隻有在這裡公示主機名,三台機子才可以互相知道對方的主機名。
rsync(部分拷貝)
為什麼要将rsync呢,肯定是因為之前的scp同步有缺陷,scp的缺陷在于:每次拷貝都會完全拷貝,倘若我們隻修改了一個小檔案,但是用scp同步時,就需要同步整個檔案,耗時耗力,這時候rsync出現,rsync會自動識别出修改過的檔案,在整個檔案的同步時,隻同步修改過的那些檔案,針對性強。快速且不耗費資源。
基本文法
rsync -av works [email protected]:works
參數說明:
-av :遞歸拷貝,在拷貝檔案夾時候必須添加
works :需要拷貝的源檔案夾,這是我事先建立好的測試檔案夾,如果隻是拷貝具體檔案夾下的某個檔案,比如1.txt,隻需要works/1.txt就行。
leon:使用者名,自己設定
hadoop98:要拷貝到的目标檔案名,注意前面的@是不能丢的。
works:和前面的一樣,是目标檔案。
ssh免密設定
ssh免密設定的必要性
首先我們在學習的時候,一定是需要他才學,那這裡為什麼要進行ssh的免密設定呢,還是先回顧一下,上一步的将的rsync。
1、rsync解決了一個什麼問題呢?他實作了部份拷貝,隻同步修改過的内容,而不是像scp一樣全部拷貝,但是它有什麼問題呢?
2、如果要用rsync将hadoop100下的一整個works檔案拷貝到hadoop98下,這個時候,我們必須到hadoop98下先mkdir建立相應的檔案夾,才能使用rsync。
3、這時候如果不想切換主機,就需要用ssh遠端登陸,我們隻需要在hadoop100下遠端登入hadoop98,然後建立相應的works檔案夾。但是這時候又有什麼問題呢?
4、問題就在于,每次ssh遠端登入時候,都需要輸入密碼,這樣就會很煩?那這時候就需要進行ssh免密設定。
ssh免密原理
這裡不做很深入的了解,我僅以個人的了解做個簡單的記錄,ssh首先是分為公鑰和私鑰,如果我們要實作免密登入,隻需要将自己的公鑰提供給其他主機就行了。
注意,你有多少台伺服器,每一台伺服器都要知道其他的伺服器的公鑰,才可以實作免密登入。
第一步:進入到.ssh目錄,這個目錄在home目錄下,有可能你跳轉到home目錄下是看不到.ssh目錄,但是沒關系,你隻需要直接跳轉就行。
第二步:生成公鑰和私鑰
ssh-keygen -t rsa
第三步:将公鑰拷貝到其他主機上
這裡沿用上一個章節中講到的hadoop100,hadoop99,hadoop98。
從hadoop100中,将公鑰拷貝到其他兩個主機
ssh-copy-id hadoop98
ssh-copy-id hadoop99
注意:其他的兩台伺服器上,也需要用同樣的辦法,拷貝公鑰到另外兩台伺服器。
基本上就實作了ssh的免密登入了。
xsync同步分發腳本
既然ssh免密登入我們都設定好了,那我們就可以通過同一個腳本直接完成到所有伺服器的同步拷貝
#! /bin/bash
#1.判斷參數個數
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2.周遊叢集所有機器
for host in hadoop100 hadoop99 hadoop98
do
echo ======================== $host =============================
#3.周遊所有目錄,挨個發送
for file in [email protected]
do
#4.判斷檔案是否存在
if [ -e $file ]
then
#.擷取目錄
pdir=$(cd -P $(dirname $file); pwd)
#6.擷取目前檔案的名稱
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
對以上腳本不做過多解釋,隻是在學shell腳本時,一定要注意空格的使用,不要像c語言或者其他語言一樣,總喜歡加空格作為對其,顯得代碼整潔。shell腳本可不一樣,每個空格都是比較嚴格的。
下一篇則會将,具體hadoop叢集的部署。