本文介紹的是在Ubuntu下安裝用三台PC安裝完成Hadoop集群並運行好第一個Hello World的過程,軟硬件信息如下:
Ubuntu:12.04 LTS
Master: 1.5G RAM,奔騰處理器。
Slave1、Slave2:4G RAM,I3處理器。
開始
1 安裝Ubuntu : http://cdimage.ubuntu.com/releases/12.04/release/,Ubuntu的安裝過程網上有很多,這里不再贅述了,安裝之前一定要對Linux的目錄樹和Mount有所了解。另外i,安裝Ubutu過程中,三個用戶名必須是一樣的,當然你后面建用戶也行,但是不方便。另外OpenSSH一定要先裝好。
2 安裝好后,開啟root:
sudo passwd root
sudo passwd -u root
3 開始安裝jdk 1.6 ,下載地址 http://www.oracle.com/technetwork/java/javase/downloads/java-se-6u24-download-338091.html:
使用終端進入存放jdk-6u24-linux-i586.bin,我的位置是:/usr/lib。我推薦的終端軟件為:XShell和XFTP。存放后后:
第一步:更改權限;默認文件沒有可執行權限
chmod g+x jdk-6u24-linux-i586.bin
第二步: 安裝
sudo -s ./jdk-6u24-linux-i586.bin
安裝完畢,下面配置環境變量
我安裝好后java的路徑是:/usr/lib/jdk1.6.0_24
配置classpath,修改所有用戶的環境變量:
sudo vi /etc/profile
在文件最后添加
#set java environment export JAVA_HOME=/usr/lib/jdk1.6.0_24 export JRE_HOME=/usr/lib/jdk1.6.0_24/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
如果使用sudo提示不在用戶組中 則敲命令 su - ,切換到root,繼續敲 visudo ,然后
在root ALL=(ALL:ALL) ALL下
添加
hadoop ALL=(ALL:ALL) ALL (ps:hadoop是我建的用戶名。)
重新啟動計算機,用命令測試jdk的版本
java -version
顯示如下信息:成功安裝
java version "1.6.0_12" Java(TM) SE Runtime Environment (build 1.6.0_12-b04) Java HotSpot(TM) Server VM (build 11.2-b01, mixed mode)
5 hadoop安裝和運行
下載地址:http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-1.2.1/
存放目錄:/home/hadoop(hadoop是用戶名)
解壓: tar -zxvf hadoop-1.2.1.tar.gz
6 Hadoop集群配置:
1 修改三台主機的hosts文件 :
vi /etc/hosts
加入如下四行,分別修改為你的master機器和slave機器的ip地址即可
127.0.0.1 localhost
192.168.1.1 master
192.168.1.2 slave1
192.168.1.3 slave2
2 修改主機名 vi /etc/hostname
各自改為master,slave1,slave2.
3 配置master免SSH登錄slave
在master上生成密鑰:
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
然后用xftp將~/.ssh文件下的所有文件拷貝到兩台slave機器即可。然后輸入命令。
cd ~/.ssh scp authorized_keys slave1:~/.ssh/ scp authorized_keys slave2:~/.ssh/
4 修改三台主機的配置文件
vi /home/hadoop/hadoop-1.2.1/conf/hadoop-env.sh
加入:export JAVA_HOME=/usr/lib/jdk1.6.0_24 (更改為你們自己的目錄)
vi /home/hadoop/hadoop-1.2.1/conf/core-site.xml
加入:
<configuration> <property> <name>fs.default.name</name> <value>hdfs://master:9000</value> </property> </configuration>
繼續:
vi /home/hadoop/hadoop-1.2.1/conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
繼續:
vi /home/hadoop/hadoop-1.2.1/conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
</configuration>
在master機器上修改:
vi /home/hadoop/hadoop-1.2.1/conf/masters
加入master
vi /home/hadoop/hadoop-1.2.1/conf/slaves
加入
slave1
slave2
5 啟動hadoop:
cd /home/hadoop/hadoop-1.2.1 bin/hadoop namenode -format --這里是格式化 一次即可 bin/start-all.sh
6 Hello World-經典的wordcount程序
cd ~ mkdir file cd file echo "Hello World" > file1.txt echo "Hello Hadoop" > file2.txt cd /home/hadoop/hadoop-1.2.1 bin/hadoop fs -mkdir input bin/hadoop fs -ls bin/hadoop fs -put ~/file/file*.txt input bin/hadoop fs -ls input bin/hadoop jar ./hadoop-examples-1.2.1.jar wordcount input output
查看輸出結果:
bin/hadoop fs -ls output
查看最終結果:
可見,wordCount程序運行完成了。詳細執行步驟如下:
1)將文件拆分成splits,由於測試用的文件較小,所以每個文件為一個split,並將文件按行分割形成<key,value>對,如圖4-1所示。這一步由MapReduce框架自動完成,其中偏移量(即key值)包括了回車所占的字符數(Windows和Linux環境會不同)。
圖4-1 分割過程
2)將分割好的<key,value>對交給用戶定義的map方法進行處理,生成新的<key,value>對,如圖4-2所示。
圖4-2 執行map方法
3)得到map方法輸出的<key,value>對后,Mapper會將它們按照key值進行排序,並執行Combine過程,將key至相同value值累加,得到Mapper的最終輸出結果。如圖4-3所示。
圖4-3 Map端排序及Combine過程
4)Reducer先對從Mapper接收的數據進行排序,再交由用戶自定義的reduce方法進行處理,得到新的<key,value>對,並作為WordCount的輸出結果,如圖4-4所示。
圖4-4 Reduce端排序及輸出結果
這一塊:更詳細的介紹可以參考:http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html
該文是對《Hadoop實戰》最佳闡述。
后記
搭建Hadoop集群網上的文章有很多,遇到問題不斷的查找,最終總是可以解決問題的。感覺最繁碎的問題是權限,我后面一概就用root了。改起來煩。然,搭建完一個hadoop根本不算什么。搞懂hadoop適合的業務情形,搞懂Hadoop的設計思想,在寫自己程序時,可以靈活運用,達到它山之石可以攻玉的效果,那才是學習Hadoop的最終目的。