今天終於把hadoop集群環境給搭建起來了,能夠運行單詞統計的示例程序了。
集群信息如下:
主機名 |
Hadoop角色 |
Hadoop jps命令結果 |
Hadoop用戶 |
Hadoop安裝目錄 |
master |
Master slaves |
NameNode DataNode JobTracker TaskTracker SecondaryNameNode |
創建相同的用戶的組名:hadoop。 安裝hadoop-0.20.2時使用hadoop用戶,並且hadoop的文件夾歸屬也是hadoop:hadoop |
/opt/hadoop |
slave1 |
slaves |
DataNode TaskTracker |
||
slave2 |
slaves |
DataNode TaskTracker |
注:master即使master又是slave.
搭建步驟如下:
一、首先是搞好master
1、創建用戶組
groupadd hadoop 添加一個組
useradd hadoop -g hadoop 添加用戶
2、jdk的安裝
這里安裝的版本是jdk-7u9-linux-i586.tar.gz ,使用 tar -zsvf jdk-7u9-linux-i586.tar.gz -C /opt/ 命令將其解壓到/opt目錄下,並將解壓后的文件夾jdk-7u9-linux-i586改名為java.
jdk安裝好就要配置環境變量了,使用vi /etc/profile命令編輯添加如下內容:
export JAVA_HOME=/opt/java/jdk
exprot PATH=$JAVA_HOME/bin:$PATH
配置好之后要用命令source /etc/profile使配置文件生效,這樣jdk就安裝完畢了。安裝完之后不要忘了將所有者設置為hadoop。
使用命令chown -R hadoop:hadoop java/
3.hadoop的安裝
hadoop的版本是hadoop-0.20.2.tar.gz,也把它解壓到/opt目錄下面,改名為hadoop。
hadoop也要設置環境變量,使用vi /etc/profile命令編輯添加如下內容:
export HADOOP_HOME=/opt/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
同樣也要執行source /etc/profile使配置文件生效,然后執行命令使用命令chown -R hadoop:hadoop hadoop/將其所有者改為hadoop
4、修改地址解析文件/etc/hosts,加入
192.168.137.110 master
192.168.137.111 slave1
192.168.137.112 slave2
5、修改hadoop的配置文件
首先切換到hadoop用戶,su hadoop
①修改hadoop目錄下的conf/hadoop-env.sh文件
加入java的安裝路徑export JAVA_HOME=/opt/java/jdk
②把hadoop目錄下的conf/core-site.xml文件修改成如下:
1 <property> 2 <name>hadoop.tmp.dir</name> 3 <value>/hadoop</value> 4 </property> 5 <property> 6 <name>fs.default.name</name> 7 <value>hdfs://master:9000</value> 8 </property> 9 <property> 10 <name>dfs.name.dir</name> 11 <value>/hadoop/name</value> 12 </property>
③把hadoop目錄下的conf/ hdfs-site.xml文件修改成如下:
1 <property> 2 <name>dfs.replication</name> 3 <value>3</value> 4 </property> 5 <property> 6 <name>dfs.data.dir</name> 7 <value>/hadoop/data</value> 8 </property>
④把hadoop目錄下的conf/ mapred-site.xml文件修改成如下:
1 <property> 2 <name>mapred.job.tracker</name> 3 <value>master:9001</value> 4 </property> 5 <property> 6 <name>mapred.system.dir</name> 7 <value>/hadoop/mapred_system</value> 8 </property> 9 <property> 10 <name>mapred.local.dir</name> 11 <value>/hadoop/mapred_local</value> 12 </property>
⑤把hadoop目錄下的conf/ masters文件修改成如下:
master
⑥把hadoop目錄下的conf/ slaves文件修改成如下:
master
slave1
slave2
6、復制虛擬機
我使用Virtual Box的克隆功能,將主機master完全克隆兩份:slave1和slave2,並修改相應的主機名和IP地址,這樣就可以簡單地保持hadoop環境基本配置相同。
7、SSH設置無密碼驗證
切換到Hadoop用戶,在Hadoop家目錄下面創建.ssh目錄,並在master節點上生成密鑰對:ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa 。然后一直按[Enter]鍵,按默認的選項生成密鑰對保存在.ssh/id_rsa文件中。
然后執行如下命令:
$ ssh ~/.ssh
$ cp id_rsa.pub authorized_keys
$ scp authorized_keys slave1:/home/hadoop/.ssh
$ scp authorized_keys slave2:/home/hadoop/.ssh
執行遠程復制文件的時候記得要把slave1和slave2的防火牆關掉。復制完畢后記得要到slave1和slave2去修改該文件的權限。
從master向slave1和slave2發起SSH連接,第一次登錄時需要輸入密碼,以后就不需要了。
$ ssh slave1
$ ssh slave2
我們只需要配置從master向slaves發起SSH連接不需要密碼就可以了,但這樣只能在master(即在主機master)啟動或關閉hadoop服務。
8、運行hadoop
使用Hadoop用戶,切換到hadoop/bin目錄下
格式化分布式文件系統./hadoop namenode -format
執行命令./start-all.sh啟動hadoop
在master上執行jps命令查看運行的進程如下:
[hadoop@master hadoop]$ jps
3200 SecondaryNameNode
3271 JobTracker
3370 TaskTracker
3002 NameNode
3106 DataNode
5687 Jps
在slave1和slave2上執行jps結果如下:
[hadoop@slave1 ~]$ jps
1477 DataNode
3337 Jps
1547 TaskTracker
訪問http://master:50070可以查看分布式文件系統的狀態
9、運行單詞統計程序
WordCount是hadoop自帶的實例,統計一批文本文件中各單詞出現的資料,輸出到指定的output目錄中,輸出目錄如果已經存在會報錯。
$ cd /opt/hadoop
$ hadoop fs -mkdir input
$ hadoop fs -copyFromLocal /opt/hadoop/*.txt input/
$ hadoop jar hadoop-0.20.2-examples.jar wordcount input output
$ hadoop fs -cat output/* #最后查看結果
運行結果如下:
13/06/16 19:32:26 INFO input.FileInputFormat: Total input paths to process : 4
13/06/16 19:32:26 INFO mapred.JobClient: Running job: job_201306161739_0002
13/06/16 19:32:27 INFO mapred.JobClient: map 0% reduce 0%
13/06/16 19:32:35 INFO mapred.JobClient: map 50% reduce 0%
13/06/16 19:32:36 INFO mapred.JobClient: map 100% reduce 0%
13/06/16 19:32:47 INFO mapred.JobClient: map 100% reduce 100%
13/06/16 19:32:49 INFO mapred.JobClient: Job complete: job_201306161739_0002
13/06/16 19:32:49 INFO mapred.JobClient: Counters: 18
13/06/16 19:32:49 INFO mapred.JobClient: Job Counters
13/06/16 19:32:49 INFO mapred.JobClient: Launched reduce tasks=1
13/06/16 19:32:49 INFO mapred.JobClient: Rack-local map tasks=2
13/06/16 19:32:49 INFO mapred.JobClient: Launched map tasks=4
13/06/16 19:32:49 INFO mapred.JobClient: Data-local map tasks=2
13/06/16 19:32:49 INFO mapred.JobClient: FileSystemCounters
13/06/16 19:32:49 INFO mapred.JobClient: FILE_BYTES_READ=179182
13/06/16 19:32:49 INFO mapred.JobClient: HDFS_BYTES_READ=363457
13/06/16 19:32:49 INFO mapred.JobClient: FILE_BYTES_WRITTEN=358510
13/06/16 19:32:49 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=133548
13/06/16 19:32:49 INFO mapred.JobClient: Map-Reduce Framework
13/06/16 19:32:49 INFO mapred.JobClient: Reduce input groups=10500
13/06/16 19:32:49 INFO mapred.JobClient: Combine output records=10840
13/06/16 19:32:49 INFO mapred.JobClient: Map input records=8968
13/06/16 19:32:49 INFO mapred.JobClient: Reduce shuffle bytes=179200
13/06/16 19:32:49 INFO mapred.JobClient: Reduce output records=10500
13/06/16 19:32:49 INFO mapred.JobClient: Spilled Records=21680
13/06/16 19:32:49 INFO mapred.JobClient: Map output bytes=524840
13/06/16 19:32:49 INFO mapred.JobClient: Combine input records=47258
13/06/16 19:32:49 INFO mapred.JobClient: Map output records=47258
13/06/16 19:32:49 INFO mapred.JobClient: Reduce input records=10840
運行該程序一定得注意將slave1和slave2的防火牆給關閉,否則會報異常的。