題記
本文介紹了一個Hadoop2.2.0叢集的搭建過程,在2台4G記憶體的酷睿雙核PC機上,使用VMWare WorkStation虛拟了4個RHEL6.2(1G記憶體、單核CPU、10G硬碟),總計用10個小時的時間,完成虛拟機制作和Hadoop建立過程,總體比較順利。
本次叢集搭建過程中,主要遇到三個問題:
(1)第一個是:DataNode啟動了(使用jps可以看到程序),但是在NameNode中看不到(192.168.1.10:50070),花費大約3個小時時間查問題,根據logs目錄的日志“org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.1.10:9000”,到百度搜尋,有人遇到說是防火牆沒關的問題,但是我的防火牆都關了。最後多種方式嘗試,原來是/etc/hosts中,對于master除了對應到192.168.1.10之外,我還對應到了127.0.0.1,去掉之後,重新啟動,就都好了。
(2)第二個是:常見問題,多次format namecode造成的DataNode不啟動,删除/home/hadoop/dfs/data/current/VERSION就好了。
(3)第三個是:進入安全模式,不退出,開始我是手工退出,hadoop fs -safemode leave,後來使用hdfs fsck /,發現壞塊比例較大,70+%(機器硬碟好多年了,估計壞道較多,也可能是強制關機,一些任務異常導緻),然後強制清理了一下 hdfs fsck / -delete,重新開機hadoop,就會自動離開安全模式了。
(4)多看日志,總能解決

Hadoop是什麼
Hadoop是Lucene創始人Doug Cutting,根據Google的相關内容山寨出來的分布式檔案系統和對海量資料進行分析計算的基礎架構系統,其中包含MapReduce程式,hdfs系統等。
名詞解釋
(1)Hadoop:Apache開源的分布式架構。
(2)HDSF:Hadoop的分布式檔案系統。
(3)NameNode:Hadoop HDFS中繼資料主節點伺服器,負責儲存DataNode 檔案存儲中繼資料資訊,這個伺服器是單點的。
(4)JobTracker:Hadoop的Map/Reduce排程器,負責與TaskTracker通信配置設定計算任務并跟蹤任務進度,這個伺服器也是單點的。
(5)DataNode:Hadoop資料節點,負責存儲資料。
(6)TaskTracker:Hadoop排程程式,負責Map,Reduce任務的啟動和執行。
Hadoop1的叢集部署結構圖
Hadoop1的元件依賴關系圖
Hadoop2的Yarn架構圖
安裝RHEL環境
使用VMWare WorkStation安裝虛拟機:
http://blog.csdn.net/puma_dong/article/details/17889593#t0
http://blog.csdn.net/puma_dong/article/details/17889593#t1
安裝Java環境:
http://blog.csdn.net/puma_dong/article/details/17889593#t10
安裝完畢之後,4台虛拟機IP及機器名稱如下:
192.168.1.10 master
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
可以通過vim /etc/hosts檢視。注意:在/etc/hosts中,不要把機器名字,同時對應到127.0.0.1這個位址,會導緻資料節點連接配接不上命名節點,報錯如下:
org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.1.10:9000
安裝完畢之後,Java位置如下:/usr/jdk1.6.0_45 ,可以通過echo $JAVA_HOME檢視。
配置Hadoop環境
建立Hadoop賬号
(1)建立Hadoop使用者組:groupadd hadoop
(2)建立Hadoop使用者:useradd hadoop -g hadoop
(3)設定Hadoop使用者密碼:passwd 密碼hadoop
(4)給hadoop賬戶增加sudo權限: vim /etc/sudoers ,增加内容:hduser ALL=(ALL) ALL
注意:以上對于每一台機器都要執行
建立master到slave的無密碼登入
(1)切換到Hadoop 使用者下:su hadoop cd /home/hadoop/
(2)生成公鑰和私鑰:ssh-keygen -q -t rsa -N "" -f /home/hadoop/.ssh/id_rsa
(3)檢視密鑰内容:cd /home/hadoop/.ssh cat id_rsa.pub
(4)複制id_rsa.pub公鑰到 authorized_keys 檔案:cat id_rsa.pub > authorized_keys
(5)修改master公鑰權限:chmod 644 /home/hadoop/.ssh/authorized_keys
(6)把 master 機器上的 authorized_keys 檔案 copy 到 node1 節點上:
scp /home/hadoop/.ssh/authorized_keys node1:/home/hadoop/.ssh/
如果node1/node2/node3機器上沒有.ssh目錄,則建立,并chmod 700 /home/hadoop/.ssh
安裝Hadoop
安裝目錄
Hadoop安裝目錄:/home/hadoop/hadoop-2.2.0
檔案目錄:/home/hadoop/dfs/name ,/home/hadoop/dfs/data ,/home/hadoop/tmp
安裝步驟
注意:以下步驟使用hadoop賬号操作。
(1)轉到 home/hadoop目錄:cd /home/hadoop
(2)下載下傳hadoop:wget http://mirror.esocc.com/apache/hadoop/common/stable2/hadoop-2.2.0.tar.gz
(3)解壓hadoop并放到計劃安裝位置:tar zxvf hadoop-2.2.0.tar.gz
(4)建立檔案目錄:mkdir -p /home/hadoop/dfs/name /home/hadoop/dfs/data /home/hadoop/tmp
(5)修改7個配置檔案,檔案位置:/home/hadoop/hadoop-2.2.0/etc/hadoop/,檔案名稱:hadoop-env.sh、yarn-evn.sh、slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
配置檔案hadoop-env.sh
如果系統環境變量有設定$JAVA_HOME,則這個檔案不用修改,否則要修改${JAVA_HOME}為:/usr/jdk1.6.0_45
配置檔案yarn-env.sh
如果系統環境變量有設定$JAVA_HOME,則這個檔案不用修改,否則要修改${JAVA_HOME}為:/usr/jdk1.6.0_45
配置檔案slaves
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/slaves,修改内容為所有的DataNode的機器名字,每個機器一行,這篇文章的配置如下:
node1
node2
node3
配置檔案core-site.xml
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/core-site.xml,修改configuration内容如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
hadoop.tmp.dir的預設值:/tmp/hadoop-${user.name}
配置檔案hdfs-site.xml
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/hdfs-site.xml,修改configuration内容如下:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
dfs.namenode.name.dir的預設值:file://${hadoop.tmp.dir}/dfs/name
dfs.namenode.data.dir的預設值:file://${hadoop.tmp.dir}/dfs/data
配置檔案mapred-site.xml
mv /home/hadoop/hadoop-2.2.0/etc/hadoop/mapred-site.xml.template /home/hadoop/hadoop-2.2.0/etc/hadoop/mapred-site.xml
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/mapred-site.xml,修改configuration内容如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
配置節點yarn-site.xml
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/yarn-site.xml,修改configuration内容如下:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>
複制Hadoop到其他節點
(1)scp -r /home/hadoop/hadoop-2.2.0 [email protected]:~/
(2)scp -r /home/hadoop/hadoop-2.2.0 [email protected]:~/
(3)scp -r /home/hadoop/hadoop-2.2.0 [email protected]:~/
啟動Hadoop
(1)切換到hadoop使用者:su hadoop
(2)進入安裝目錄: cd ~/hadoop-2.2.0/
(3)格式化namenode:./bin/hdfs namenode –format ,格式化後會在$dfs.namenode.name.dir/current生成一系列目錄
(4)啟動hdfs: ./sbin/start-dfs.sh
(5)jps檢視,此時master有程序:NameNoce SecondaryNameNode,node1/node2/node3上有程序:DataNode
(6)啟動yarn: ./sbin/start-yarn.sh
(7)jps檢視,此時master有程序:NameNoce SecondaryNameNode ResourceManager,node1/node2/node3上有程序:DataNode NodeManager
(8)檢視叢集狀态:./bin/hdfs dfsadmin -report
(9)檢視檔案塊組成: ./bin/hdfs fsck / -files -blocks
(10)Web檢視HDFS: http://192.168.1.10:50070
(11)Web檢視RM(Resource Manager): http://192.168.1.10:8088
(12)Web檢視NM(Node Manager):http://192.168.1.11:8042
(13)啟動JobHistory Server:mr-jobhistory-daemon.sh start historyserver,可以通過:http://192.168.1.10:19888/ 檢視任務執行曆史資訊,終止JobHistory Server,執行如下指令:mr-jobhistory-daemon.sh stop historyserver 。
HADOOP_HOME環境變量
在運作友善,我們設定一個HADOOP_HOME環境變量,并加入PATH目錄,步驟如下:
(1)vim /etc/profile.d/java.sh #因為hadoop必用java,所有我們把使用這個檔案即可。
(2)增加内容:
export HADOOP_HOME=/home/hadoop/hadoop-2.2.0
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
運作Hadoop計算任務
WordCount
(1)/home/hadoop目錄下有兩個文本檔案file01.txt和file02.txt,檔案内容分别為:
file01.txt:
kongxianghe
kong
yctc
Hello World
file02.txt:
11
2222
kong
Hello
yctc
(2)将這兩個檔案放入hadoop的HDFS中:
hadoop fs -ls //檢視hdfs目錄情況
hadoop fs -mkdir -p input
hadoop fs -put /home/hadoop/file*.txt input
hadoop fs -cat input/file01.txt //檢視指令
(3)計算并檢視結果:
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount input output
hadoop fs -ls output
hadoop fs -cat output/part-r-00000
可以看到資料都已經被統計出來了。
hadoop fs,或者使用hdfs dfs,但是不要使用hadoop dfs,因為已經不推薦使用了,會有警告。
基準測試排序
Hadoop自帶一些基準測試程式,用來測試叢集性能。例如:
如下的這個程式,會現在每個節點生成10個G的随機數字,然後排序出結果:
(1)./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar randomwriter rand
(2)./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar sort rand sort-rand
第一個指令會在rand 目錄的生成沒有排序的資料。第二個指令會讀資料,排序,然後寫入rand-sort 目錄。
例如,hadoop_*_test.jar TestDFSIO,用來測試IO性能;其他常用的還有:
(1)MRBench(使用mrbench選項)會多次運作一個小型作業,以檢驗小型作業能否快速的相應。
(2)NNBench(使用nnbench選項)專門用于測試namenode硬體的負載。
(3)Gridmix是一個基準測試程式套裝。通過模拟一些真實常見的資料通路模式,能逼真地為一個叢集的負載模組化。
常見錯誤
(1)Name node is in safe mode
運作hadoop程式時, 異常終止了,然後再向hdfs加檔案或删除檔案時,出現Name node is in safe mode錯誤:
rmr: org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode
解決的指令:
hdfs dfsadmin -safemode leave #關閉safe mode
(2)DataNode 無法啟動
我遇到過兩種情況的DataNode無法啟動:第一種是/etc/hosts裡面機器名字除了和IP對應之外,還和127.0.0.1對應,導緻DataNode連接配接NameNode的9000端口一直連接配接不上;第二種是多次format namenode 造成namenode 和datanode的clusterID不一緻,通過檢視NameNode和DataNode的/home/hadoop/dfs/data/current/VERSION,發現确實不一緻。
總之,遇到錯誤不要慌,多看看$HADOOP_HOME/logs下面的日志,就能找到問題。