1. 列出使用的機(jī)器
普通PC,要求:
cpu: 750M-1G
mem: >128M
disk: >10G
不需要太昂貴的機(jī)器。
機(jī)器名:
finewine01
finewine02
finewine03
將finewine01設(shè)為主節(jié)點(diǎn),其它的機(jī)器為從節(jié)點(diǎn)。
2. 下載和生成
從這里checkout,我選擇trunk
http://svn./repos/asf/lucene/hadoop/
使用ant進(jìn)行生成
3. 部署前的準(zhǔn)備工作
在主節(jié)點(diǎn)的start-all.sh腳本執(zhí)行后,主節(jié)點(diǎn)和從節(jié)點(diǎn)的所有服務(wù)運(yùn)行。即這個腳本將啟動主節(jié)點(diǎn)的服務(wù),并ssh到從所有的節(jié)點(diǎn),繼而啟動從節(jié)點(diǎn)的服務(wù)。
start-all.sh這個腳本假定hadoop被安裝在所有機(jī)器的同一個位置,每一臺機(jī)器都用同一個路徑存放hadoop的數(shù)據(jù)。
我們需要在每臺機(jī)器上創(chuàng)建同樣的目錄結(jié)構(gòu)。
/hadoop
/hadoop-install/hadoop-0.10.0 hadoop的0.10.0版的安裝位置
/filesystem hadoop文件系統(tǒng)的根
/home 用戶hadoop的主目錄
以root登錄到所有的機(jī)器,創(chuàng)建hadoop用戶和目錄結(jié)構(gòu)。
ssh -l root finewine01
mkdir /hadoop
mkdir /hadoop/hadoop-install
mkdir /hadoop/filesystem
mkdir /hadoop/home
groupadd hadoop
useradd -d /hadoop/home -g hadoop hadoop
chown -R hadoop:hadoop /hadoop
passwd hadoop hadooppassword
start-all.sh腳本要啟動所有機(jī)器的服務(wù),需要對所有的機(jī)器進(jìn)行ssh無密碼的登錄的能力。因此我們需要在每臺機(jī)器上創(chuàng)建一個ssh key。在這個例子中,主節(jié)點(diǎn)也需要啟動自己的服務(wù),因此主節(jié)點(diǎn)同樣需要做無密碼的ssh登錄設(shè)置。
用vi編輯/hadoop/hadoop-install/hadoop-0.10.0/conf/hadoop-env.sh,將下面的環(huán)境變量設(shè)置:
export HADOOP_HOME=/hadoop/hadoop-install/hadoop-0.10.0
export JAVA_HOME=/usr/java/jdk1.5.0_06
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves
這個文件還有很多變量,這些變量的設(shè)定影響hadoop的運(yùn)行。比如你以后執(zhí)行腳本時(shí)發(fā)生ssh錯誤,就需要調(diào)整其中的HADOOP_SSH_OPTS變量。
同時(shí)需要注意的是,在初始的拷貝操作后,需要在設(shè)置hadoop-env.sh文件中的HADOOP_MASTER變量,這樣程序才能通過rsync同步主節(jié)點(diǎn)的改變到所有的從節(jié)點(diǎn)上。
在主節(jié)點(diǎn)上創(chuàng)建ssh keys,然后復(fù)制到各個從節(jié)點(diǎn)上。這些操作必須由先前創(chuàng)建的hadoop用戶完成。不要su成hadoop用戶來做。開啟一個新shell,以hadoop用戶的身份登錄來完成這些操作。
cd /hadoop/home
ssh-keygen -t rsa (Use empty responses for each prompt)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /hadoop/home/.ssh/id_rsa.
Your public key has been saved in /hadoop/home/.ssh/id_rsa.pub.
The key fingerprint is:
a6:5c:c3:eb:18:94:0b:06:a1:a6:29:58:fa:80:0a:bc nutch@localhost
在主節(jié)點(diǎn)上,拷貝剛才創(chuàng)建的公共key到一個名為authorized_keys的文件:
cd /hadoop/home/.ssh
cp id_rsa.pub authorized_keys
只需在主節(jié)點(diǎn)上運(yùn)行ssh-kegen程序。其他節(jié)點(diǎn)的目錄結(jié)構(gòu)創(chuàng)建后,將剛才在主節(jié)點(diǎn)創(chuàng)建的keys通過scp拷貝到從節(jié)點(diǎn)的同樣的目錄上。
scp /hadoop/home/.ssh/authorized_keys hadoop@finewine02:/hadoop/home/.ssh/authorized_keys
第一次,你需要輸入hadoop用戶的密碼。第一次登錄到其他的機(jī)器上,ssh提示你是否選擇將機(jī)器加入到已知的機(jī)器列表中,選擇yes。這個keys文件拷貝后,以hadoop的身份從主節(jié)點(diǎn)到從節(jié)點(diǎn)的登錄就不需要密碼了。
可以從主節(jié)點(diǎn)上以hadoop的身份測試:
ssh finewine02
接下來一個命令提示符將直接出現(xiàn),不需要密碼的。
一旦成功在所有機(jī)器上創(chuàng)建ssh keys后,就可以開始在從節(jié)點(diǎn)上部署hadoop。
4. 部署hadoop到一個機(jī)器上
首先,我們部署hadoop到一個節(jié)點(diǎn)上(主節(jié)點(diǎn))。確保運(yùn)行正常后,加入其他從節(jié)點(diǎn)。下面所有的操作都是由登錄后的hadoop用戶進(jìn)行的。
cp -R /path/to/build/* /hadoop/hadoop-install/hadoop-x.x.x
然后確保這些shell腳本文件都是unix格式,并且是可執(zhí)行的(這些文件分別在/bin和/conf目錄中)。
一個hadoop-site.xml的例子:
fs.default.name
finewine01:9000
The name of the default file system. Either the literal string
“local” or a host:port for NDFS.
mapred.job.tracker
finewine01:9001
The host and port that the MapReduce job tracker runs at. If
“local”, then jobs are run in-process as a single map and
reduce task.
mapred.map.tasks
2
define mapred.map tasks to be number of slave hosts
mapred.reduce.tasks
2
define mapred.reduce tasks to be number of slave hosts
dfs.name.dir
/hadoop/filesystem/name
dfs.data.dir
/hadoop/filesystem/data
mapred.system.dir
/hadoop/filesystem/mapreduce/system
mapred.local.dir
/hadoop/filesystem/mapreduce/local
dfs.replication
1
fs.default.name // 缺省的文件系統(tǒng) “local”或者”host:port”
hadoop包含兩個組件,分別是分布式文件系統(tǒng)和mapreduce功能。分布式文件系統(tǒng)允許你在多臺普通機(jī)器上存儲和復(fù)制文件。mapreduce可以讓你很容易就執(zhí)行并行程序任務(wù)。
分布式文件系統(tǒng)包含名字節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)。當(dāng)一個客戶想操作一個在文件系統(tǒng)上的文件時(shí),它首先和名字節(jié)點(diǎn)聯(lián)系,名字節(jié)點(diǎn)將告訴它在那個數(shù)據(jù)節(jié)點(diǎn)上可以取得文件。名字節(jié)點(diǎn)負(fù)責(zé)調(diào)度和保存那些數(shù)據(jù)塊保存和復(fù)制到在那些機(jī)器上。數(shù)據(jù)節(jié)點(diǎn)是數(shù)據(jù)倉庫,保存真實(shí)的文件數(shù)據(jù)塊。當(dāng)你在同一臺機(jī)器上運(yùn)行名字節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)的服務(wù)時(shí),它同樣會通過sockets來通訊,如同在不同機(jī)器上一樣。
mapreduce是一種分布式運(yùn)算,就如分布式文件系統(tǒng)一樣,只不過分布的一個運(yùn)算操作,而不是文件。負(fù)責(zé)mapreduce調(diào)度服務(wù)器叫做mapreduce job tracker。每一個執(zhí)行運(yùn)算操作的節(jié)點(diǎn)都有一個守護(hù)叫task tracker,task tracker運(yùn)行并且和job tracker通信。
主節(jié)點(diǎn)和從節(jié)點(diǎn)的通信以連續(xù)的heartbeat(5-10秒)的方式進(jìn)行。如果從節(jié)點(diǎn)的heartbeat停止,主節(jié)點(diǎn)將假定該從節(jié)點(diǎn)失效并不再使用該節(jié)點(diǎn)。
mapredu.job.traker // mapreduce的主節(jié)點(diǎn),”local”或者”host:port”
mapred.map.tasks和mapred.reduce.tasks用于設(shè)定并行任務(wù)的數(shù)量。
dfs.name.dir // 名字節(jié)點(diǎn)用于存儲數(shù)據(jù)節(jié)點(diǎn)的跟蹤和調(diào)度信息
dfs.data.dir // 數(shù)據(jù)節(jié)點(diǎn)用于存儲實(shí)際的數(shù)據(jù)塊
mapred.system.dir // mapreduce tasker 存儲自己的數(shù)據(jù),僅僅在tasker所在的機(jī)器上,不在mapreduce主機(jī)上
mpred.local.dir // mapreduce 在節(jié)點(diǎn)上存儲自己的本地?cái)?shù)據(jù)。mapreduce使用巨大的本地空間來執(zhí)行它的tasks。tasks退出時(shí),mapreduce產(chǎn)生的中間文件并沒有被刪除。在每個節(jié)點(diǎn)上,這個屬性是一樣的。
dfs.replication // 冗余,單個文件將被拷貝到多少機(jī)器上。這個值不能高于的所有的數(shù)據(jù)節(jié)點(diǎn)的數(shù)量。否則守護(hù)啟動時(shí)會看見很多錯誤信息。
在你啟動hadoop服務(wù)之前,確保格式化名字節(jié)點(diǎn)
bin/hadoop namenode -format
現(xiàn)在可以啟動hadoop服務(wù)了
bin/start-all.sh
停止hadoop服務(wù)可以使用下面的命令
bin/stop-all.sh
如果設(shè)置正確,會看到正常的輸出信息
5. 部署Hadoop到多臺機(jī)器上
一旦你在一臺機(jī)器上成功運(yùn)行hadoop,就可以將配置文件拷貝到其他的機(jī)器上。
如:
scp -r /hadoop/hadoop-install/hadoop-x.x.x hadoop@finewine02:/hadoop/hadoop-install/
對每臺從節(jié)點(diǎn)機(jī)器都執(zhí)行這個操作。然后編輯slaves文件,增加每一個slave到這個文件中,每行一個。編輯hadoop-site.xml的值,修改map和reduce的task的數(shù)量。修改replication屬性。
6. 分布式搜索
產(chǎn)品系統(tǒng)一般每個索引庫存100萬條記錄。50個服務(wù)器每秒處理20多個請求。
多處理器、多磁盤的系統(tǒng),每個服務(wù)使用一個獨(dú)立的磁盤和索引,這樣機(jī)器的費(fèi)用可以降低50%,電力解約到75%。一個多磁盤的機(jī)器并不能像單磁盤機(jī)器一樣每秒處理那么多查詢,但是它能處理更大的索引數(shù)量,因此平均起來效率更高一些。
7. 同步代碼到從節(jié)點(diǎn)上
hadoop提供同步代碼到從節(jié)點(diǎn)的能力。這個功能是可選的,因?yàn)樗鼤p慢服務(wù)啟動的速度,并且有時(shí)候你并不想同步改變到從節(jié)點(diǎn)上。
雖然從節(jié)點(diǎn)可以和主節(jié)點(diǎn)同步,但在第一次,你仍然需要基本的安裝到從節(jié)點(diǎn)上,以至同步的腳本生效。這些工作上面我們在上面已經(jīng)做了,所以不需要做改變。
同步的啟動是由主節(jié)點(diǎn)ssh到從節(jié)點(diǎn)上,并執(zhí)行bin/hadoop-daemon.sh腳本。這個腳本調(diào)用rsync來同步主節(jié)點(diǎn)。這表示你需要能以無密碼的方式由從節(jié)點(diǎn)登錄到主節(jié)點(diǎn)。前面,我們設(shè)置了從主節(jié)點(diǎn)到從節(jié)點(diǎn)的無密碼登錄,現(xiàn)在則設(shè)置反向登錄。
如果是由于rsync選項(xiàng)引起了問題,查看bin/hadoop-daemon.sh腳本,大約在82行有rsync的選項(xiàng)。
那么,首先第一件事情就是在conf/hadoop-env.sh文件中,設(shè)置hadoop主節(jié)點(diǎn)變量。如:
export HADOOP_MASTER=finewine01:/hadoop/hadoop-install/hadoop-x.x.x
然后拷貝到所有從節(jié)點(diǎn)上,scp /hadoop/hadoop-installl/hadoop-x.x.x/conf/hadoop-env.sh hadoop@finewine02:/hadoop/hadoop-install/hadoop-x.x.x/hadoop-env.sh
最終,你需要登錄到所有的從節(jié)點(diǎn)上,為每臺機(jī)器創(chuàng)建一個ssh key。然后拷貝回到主節(jié)點(diǎn),并追加到文件/hadoop/home/.ssh/authorized_keys文件中。在每個從節(jié)點(diǎn)上進(jìn)行如下操作:
ssh -l nutch finewine02
cd /hadoop/home/.ssh
ssh-keygen -t rsa (Use empty responses for each prompt)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /hadoop/home/.ssh/id_rsa.
Your public key has been saved in /hadoop/home/.ssh/id_rsa.pub.
The key fingerprint is:
a6:5c:c3:eb:18:94:0b:06:a1:a6:29:58:fa:80:0a:bc nutch@localhost
scp id_rsa.pub hadoop@finewine01:/hadoop/home/finewine02.pub
在每臺從節(jié)點(diǎn)機(jī)器完成上面的操作后,追加所有的文件到主節(jié)點(diǎn)的authorized_keys文件。
cd /hadooop/home
cat finewine*.pub >> .ssh/authorized_keys
當(dāng)這些操作完成后,每次運(yùn)行bin/start-all.sh腳本,文件都會從主節(jié)點(diǎn)同步的每一個從節(jié)點(diǎn)。
8. 查看狀況
端口 : 50070
dfs的狀態(tài)
端口:50060
tracker狀態(tài)
50030
map/reduce管理
其他端口:
dfs.secondary.info.port 50090
dfs.datanode.port 50010
dfs.info.port 50070
mapred.job.tracker.info.port 50030
mapred.task.tracker.report.port 50050
tasktracker.http.port 50060




