現在大家可以跟我一起來實現Ubuntu 12.04下Hadoop 2.2.0 集群搭建,在這里我使用了兩台服務器,一台作為master即namenode主機,另一台作為slave即datanode主機,增加更多的slave只需重復slave部分的內容即可。
系統版本:
- master:Ubuntu 12.04
- slave:Ubuntu 12.04
- hadoop:hadoop 2.2.0
- 安裝ssh服務:sudo apt-get install ssh
- 有時也要更新一下vim:sudo apt-get install vim #剛安裝的系統會出現vi 命令上下鍵變成AB的情況
1. 為master和slave機器安裝JDK環境
下載jdk,如果安裝版本“1.7.0_60”,官方下載地址為:java下載
解壓jdk: tar -xvf jdk-7u60-linux-i586.tar.gz
在/usr/local/下新建java文件夾:mkdir /usr/local/java
將解壓文件移動到創建的java/文件夾下:sudo mv jdk1.7.0_60 /usr/local/java
修改/etc/profile文件:sudo vi /etc/profile
在文件末尾添加jdk路徑:

輸入 source /etc/profile 使java生效
測試java是否完全安裝:java -version #若出現版本信息則說明安裝成功
2. 修改namenode(master)和子節點(slave)機器名:
sudo vi /etc/hostname
![]()
修改后需重啟才生效:sudo reboot
3. 修改namenode(master)節點映射ip
sudo vi /etc/hosts #添加slave和master的機器名及其對應ip

PS:master、slave分別是namenode和datanode機器名,即hostname的名字
4. 為master和slave分別創建hadoop用戶及用戶組,並賦予sudo權限
sudo addgroup hadoop
sudo adduser -ingroup hadoop hadoop #第一個hadoop是用戶組,第二個hadoop是用戶名
下面為hadoop用戶賦予sudo權限:修改 /etc/sudoers 文件
sudo vi /etc/sudoers
添加hadoop ALL=(ALL:ALL) ALL

PS:該操作需要在所有master和slave主機上進行
5. 建立ssh無密碼登陸環境
以hadoop身份登錄系統:su hadoop
生成密鑰,建立namenode與datanode的信任關系,ssh生成密鑰有rsa和dsa方式,默認采用rsa方式:
在/home/hadoop目錄下輸入: ssh-keygen -t rsa -P ""
確認信息按回車,會在/home/hadoop/.ssh下生成文件:
將id_rsa.pub追加到authorized_keys授權文件中: cat id_rsa.pub >> authorized_keys
![]()
在各個子節點也生成密鑰:ssh-keygen -t rsa -P ""
將master上的authorized_keys發送到各個子節點:
scp ~/.ssh/authorized_keys hadoop@slave1:~/.ssh/
下面測試ssh互信: ssh hadoop@slave1
如果不需要輸入密碼就可以登錄成功則表示ssh互信成功建立
6. 安裝hadoop(只需配置master主機,slave主機可以直接復制)
下載hadoop到/usr/local下:下載地址
解壓hadoop-2.2.0.tar.gz:sudo tar -zxf hadoop-2.2.0.tar.gz
將解壓出來的文件夾重命名為hadoop: sudo mv hadoop-2.2.0 hadoop
將hadoop文件夾的屬主用戶設為hadoop:sudo chown -R hadoop:hadoop hadoop
6.1 配置etc/hadoop/hadoop-env.sh文件
sudo vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
找到“export JAVA_HOME=”部分,修改為本機jdk路徑

6.2 配置etc/hadoop/core-site.xml文件
sudo vi /usr/local/hadoop/etc/hadoop/core-site.xml
在<configuration></configuration>中間添加如下內容:

PS:master為namenode主機名,即/etc/hosts文件里的名字
6.3 配置etc/hadoop/mapred-site.xml文件,若路徑下沒有此文件,則將mapred-site.xml.template重命名
sudo vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
在<configuration></configuration>中間添加如下內容:

PS:master為namenode主機名,即/etc/hosts文件里的名字
6.4 配置hdfs-site.xml文件,若路徑下沒有此文件,則將hdfs-site.xml.template重命名
sudo vi hdfs-site.xml
在<configuration></configuration>中間添加如下內容:

PS:若有多個slave節點,則將<value>間的內容可改為:
- <value>/usr/local/hadoop/datalog1,/usr/local/hadoop/datalog2,...</value>
- <value>/usr/local/hadoop/data1,/usr/local/hadoop/data2,...</value>
- <value>1</value>中間的數字表示slave節點數
6.5 向slaves文件中添加slave主機名,一行一個

7.向slave節點分發配置文件
將配置文件發送到所有slave子節點上,先將文件復制到子節點/home/hadoop/下面(子節點也用hadoop用戶登錄:su hadoop)
sudo scp /etc/hosts hadoop@slave1:/home/hadoop
scp -r /usr/local/hadoop hadoop@slave1:/home/hadoop
PS:slave1為slave子節點名,若有多個slave節點,應全部分發
在datanode機器上(slave節點)將文件移動到與master相同的路徑下
sudo mv /home/hadoop/hosts /etc/hosts (在子節點上執行)
sudo mv /home/local/hadoop /usr/local/ (在子節點上執行)
PS:若提示mv文件夾,則加上-r 參數
加入所屬用戶: sudo chown -R hadoop:hadoop hadoop (在子節點上執行)
PS:子節點datanode機器要把復制過來的hadoop里面的data1,data2和logs刪除掉!
配置完成
PS:可以將hadoop命令路徑寫入/etc/profile文件,這樣我們就可以自如使用hadoop、hdfs命令了,否則在使用命令時都要加入/bin/hadoop這樣的路徑:
sudo vi /etc/profile

輸入:source /etc/profile
8. 運行wordcount示例
首先進入/usr/local/hadoop/目錄,重啟hadoop
cd /usr/local/hadoop/sbin
./stop-all.sh
cd /usr/local/hadoop/bin
./hdfs namenode -format # 格式化集群
cd /usr/local/hadoop/sbin
./start-all.sh
可以在namenode上查看連接情況
hdfs dfsadmin -report #下面是我的機器的結果

假設有測試文件test1.txt和test2.txt,首先創建目錄/input
hadoop dfs -mkdir /input
將測試文件上傳至hadoop:
hadoop dfs -put test1.txt /input/
hadoop dfs -put test2.txt /input/
子節點離開安全模式,否則可能會導致無法讀取input的文件:
hdfs dfsadmin –safemode leave
運行wordcount程序:
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /input/ /output
查看結果
hadoop dfs -cat /output/part-r-00000
PS:再次運行時需要刪除output文件夾 :hadoop dfs -rmr /output
本文為原創博客,若轉載請注明出處。
