Hadoop 安裝部署

weixin_34304013發表於2011-04-09

1. Hadoop安裝部署

1.1. 機器說明
總共4臺機器:test161.sqa,test162.sqa, test163.sqa,test164.sqa
IP地址分別為:192.168.207.161 …… 192.168.207.164
作業系統:Redhat Linux
root使用者密碼:hello123

test161.sqa(192.168.207.161)作為namenode(master),其他的作為datanode(slave)

1.2. 用機器名ping通機器
用root使用者登入。
在namenode和各個slave上用機器名互相ping,ping不通的話,修改/etc/hosts檔案,加入如下內容:
192.168.207.161 test161.sqa
192.168.207.162 test162.sqa
192.168.207.163 test163.sqa
192.168.207.164 test164.sqa
這樣應該就可以用機器名ping通了。
其他datanode機器只要保證和namenode能ping通就可以了

1.3. 新建系統hadoop使用者
Hadoop要求所有機器上hadoop的部署目錄結構要相同,並且都有一個相同的使用者名稱的帳戶,所以需要每臺機器見一個同名的使用者。
在這4臺機器上建hadoop使用者,密碼:hadoop,預設路徑/home/hadoop/。

1.4. SSH設定
Hadoop需要namenode到datanode的無密碼SSH,所以需要設定namenode到其他3臺datanode的無密碼公鑰認證方式的SSH。
首先用hadoop使用者登入每臺機器(包括namenode),在/home/hadoop/目錄下建立.ssh目錄,並將目錄權設為:drwxr-xr-x,設定命令:
chmod 755 .ssh
在namenode執行入下圖命令(用新建的hadoop使用者登入):

輸入ssh-keygen -t rsa後,
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): Enter same passphrase again:
這三個專案都直接回車。
然後將id_rsa.pub的內容複製到每個機器(也包括本機)的/home/hadoop/.ssh/authorized_keys檔案中,
如果機器上已經有authorized_keys這個檔案了,就在檔案末尾加上id_rsa.pub中的內容,
如果沒有authorized_keys這個檔案,直接cp或者scp就好了,
下面的操作假設各個機器上都沒有authorized_keys檔案。
具體命令:
在namenode執行(用新建的hadoop使用者登入):
cp /home/hadoop/.ssh/id_rsa.pub /home/hadoop/.ssh/authorized_keys scp authorized_keys test162.sqa:/home/hadoop/.ssh/
此處的scp就是通過ssh進行遠端copy,此處需要輸入遠端主機的密碼,即test162.sqa機器上hadoop帳戶的密碼(hadoop),
當然,也可以用其他方法將authorized_keys檔案拷貝到其他機器上。另外2臺datanode也一樣拷貝。
scp authorized_keys test163.sqa:/home/hadoop/.ssh/scp authorized_keys test164.sqa:/home/hadoop/.ssh/
用hadoop使用者登入每臺機器,修改/home/hadoop/.ssh/authorized_keys檔案的許可權為:-rw-r–r–,設定命令:
cd /home/hadoop/.sshchmod 644 authorized_keys
設定完成後,測試一下namenode到各個節點的ssh連結,包括到本機,如果不需要輸入密碼就可以ssh登入,說明設定成功了。
其他機器一樣測試:
ssh test162.sqassh test163.sqassh test164.sqa

1.5. 安裝JDK
到sun網站下載JDK安裝包,並在每臺機器的root使用者下面安裝。下面以例項簡單描述一下如何安裝:
下載JDK的rpm包jdk-6u6-linux-i586-rpm.bin
chmod u+x ./jdk-6u6-linux-i586-rpm.bin./ jdk-6u6-linux-i586-rpm.bin rpm -ivh jdk-6u6-linux-i586.rpm
安裝軟體會將JDK自動安裝到 /usr/java/jdk1.6.0_07目錄下。安裝完成後,設定JDK的環境變數,
考慮到JDK可能會有其他系統使用者也會用到,建議將環境變數直接設定在/etc/profile中具體內容:
export JAVA_HOME=/usr/java/jdk1.6.0_07
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

1.6. 設定目錄並安裝Hadoop
用hadoop使用者登入namenode,並新建一個目錄,用於存放所有hadoop相關內容。
本例中在/home/hadoop目錄下新建HadoopInstall下載hadoop安裝包
http://apache.mirror.phpchina.com/hadoop/core/hadoop-0.16.3/hadoop-0.16.3.tar.gz,
存放到namenode的hadoop使用者的/home/hadoop/HadoopInstall並解壓縮:
tar zxvf hadoop-0.16.3.tar.gz
考慮到今後升級以及其他操作的方便性,建議建一個名稱為hadoop的連結,指向hadoop-0.16.3目錄:
ln -s hadoop-0.16.3 hadoop
新建目錄:/home/hadoop/HadoopInstall/hadoop-conf
將/home/hadoop/HadoopInstall/hadoop/conf目錄下的hadoop_site.xml,slaves,hadoop_env.sh,
masters檔案拷貝到/home/hadoop/HadoopInstall/hadoop-conf目錄
在/home/dbrg/.bashrc檔案中設定環境變數$HADOOP_CONF_DIR:
export HADOOP_CONF_DIR=$HOME/HadoopInstall/hadoop-conf/

1.7. Hadoop環境變數設定和配置檔案修改
在/home/hadoop/HadoopInstall/hadoop-conf/hadoop_env.sh檔案中設定環境變數:
export JAVA_HOME=/usr/java/jdk1.6.0_06export HADOOP_HOME=/home/hadoop/HadoopInstall/hadoop
在/home/hadoop/HadoopInstall/hadoop-conf/masters檔案中設定namenode:
檔案內容:
test161.sqa
在/home/hadoop/HadoopInstall/hadoop-conf/slaves檔案中設定datanode:
檔案內容:
test162.sqatest163.sqatest164.sqa
在/home/hadoop/HadoopInstall/hadoop-conf/ hadoop-site.xml檔案中設定hadoop配置:

fs.default.name
test161.sqa:9000The name of the default file system. Either the literal
string “local” or a host:port for DFS. mapred.job.tracker
test161.sqa:9001The 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. hadoop.tmp.dir/home/hadoop/HadoopInstall/tmp
A base for other temporary directories. dfs.name.dir
/home/hadoop/HadoopInstall/filesystem/nameDetermines where on the local filesystem
the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table
is replicated in all of the directories, for redundancy. dfs.data.dir
/home/hadoop/HadoopInstall/filesystem/dataDetermines where on the local filesystem
an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored
in all named directories, typically on different devices. Directories that do not exist are ignored. dfs.replication1Default block replication.
The actual number of replications can be specified when the file is created. The default is used if replication is
not specified in create time.
1.8. 部署datanode節點
將namenode上安裝配置完成的hadoop檔案拷貝到所有datanode:
scp -r /home/hadoop/HadoopInstall test162.sqa:/home/hadoop/scp -r /home/hadoop/HadoopInstall
test163.sqa:/home/hadoop/scp -r /home/hadoop/HadoopInstall test164.sqa:/home/hadoop/
1.9. 啟動Hadoop
格式化namenode
/home/hadoop/HadoopInstall/hadoop/bin/hadoop namenode -format
在/home/hadoop/HadoopInstall/hadoop/bin/下面有很多啟動指令碼,可以根據自己的需要來啟動:
* start-all.sh 啟動所有的Hadoop守護。包括namenode, datanode, jobtracker, tasktrack
* stop-all.sh 停止所有的Hadoop。
* start-mapred.sh 啟動Map/Reduce守護。包括Jobtracker和Tasktrack。
* stop-mapred.sh 停止Map/Reduce守護
* start-dfs.sh 啟動Hadoop DFS守護.Namenode和Datanode
* stop-dfs.sh 停止DFS守護

 

在這裡,簡單啟動所有守護
bin/start-all.sh
同樣,如果要停止hadoop,則
bin/stop-all.sh

1.10. HDFS測試
執行bin/目錄的hadoop命令,可以檢視Haoop所有支援的操作及其用法,這裡以幾個簡單的操作為例。
在HDFS建立目錄:
bin/hadoop dfs -mkdir testdir
在HDFS中建立一個名為testdir的目錄

複製檔案到HDFS:
bin/hadoop dfs -put /home/hadoop/large.zip testfile.zip
把本地檔案large.zip拷貝到HDFS的根目錄/user/hadoop/下,檔名為testfile.zip

檢視HDFS的現有檔案
bin/hadoop dfs -ls

1.11. C++測試程式
分別用c++編寫mapper和reducer程式,完成對檔案中的單詞數量的統計:

mapper.cpp:
// c++ map reduce Mapper
// word count example
// 2008.4.18
// by iveney
#include
#include
using namespace std;

int main()
{
string buf;
while( cin>>buf )
cout< return 0;
}

reducer.cpp:
#include
#include
#include
using namespace std; int main()
{
map dict;
map::iterator iter;
string word;
int count;
while( cin>>word>>count )
dict[word]+=count;
iter = dict.begin();
while( iter != dict.end() )
{
cout<first<<”\t”<second< iter++;
}
return 0;
}

來自:Hadoop安裝部署

編譯兩個原始檔:
g++ mapper.cpp -o mapperg++ reducer.cpp -o reducer
簡單測試一下這兩個程式:echo "ge abc ab df " | ./mapper | ./reducer
輸出:ab 1abc 1df 1hadoop
執行測試bin/hadoop dfs -mkdir inputbin/hadoop dfs -put /home/hadoop/ap_base_session_fatmt0.txt
inputbin/hadoop jar contrib/streaming/hadoop-0.16.3-streaming.jar -mapper
/home/hadoop/hdfile/mapper -reducer /home/hadoop/hdfile/reducer -input input/ap_base_session_fatmt0.txt -output output
注意:
1、 用streaming方式執行測試程式,執行的是本地檔案,所以要講mapper和reducer
兩個程式拷貝到namenode和每個datanode的相同目錄下。本例是將mapper和reducer拷貝到每臺機器的
/home/hadoop/hdfile目錄下。
2、 處理的文字檔案要先傳到HDFS中,本例是將ap_base_session_fatmt0.txt傳到HDFS的input目錄下。
3、 如果要重新執行測試,需要將HDFS上的output目錄刪除,否則會報output目錄已經存在的錯誤。
刪除命令:bin/hadoop dfs -rmr output

相關文章