題記
本文介紹了一個(gè)Hadoop2.2.0集群的搭建過程,在2臺4G內(nèi)存的酷睿雙核PC機(jī)上,使用VMWare WorkStation虛擬了4個(gè)RHEL6.2(1G內(nèi)存、單核CPU、10G硬盤),總計(jì)用10個(gè)小時(shí)的時(shí)間,完成虛擬機(jī)制作和Hadoop建立過程,總體比較順利。
本次集群搭建過程中,主要遇到三個(gè)問題:
(1)第一個(gè)是:DataNode啟動(dòng)了(使用jps可以看到進(jìn)程),但是在NameNode中看不到(192.168.1.10:50070),花費(fèi)大約3個(gè)小時(shí)時(shí)間查問題,根據(jù)logs目錄的日志“org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.1.10:9000”,到百度搜索,有人遇到說是防火墻沒關(guān)的問題,但是我的防火墻都關(guān)了。最后多種方式嘗試,原來是/etc/hosts中,對于master除了對應(yīng)到192.168.1.10之外,我還對應(yīng)到了127.0.0.1,去掉之后,重新啟動(dòng),就都好了。
(2)第二個(gè)是:常見問題,多次format namecode造成的DataNode不啟動(dòng),刪除/home/hadoop/dfs/data/current/VERSION就好了。
(3)第三個(gè)是:進(jìn)入安全模式,不退出,開始我是手工退出,hadoop fs -safemode leave,后來使用hdfs fsck /,發(fā)現(xiàn)壞塊比例較大,70+%(機(jī)器硬盤好多年了,估計(jì)壞道較多,也可能是強(qiáng)制關(guān)機(jī),一些任務(wù)異常導(dǎo)致),然后強(qiáng)制清理了一下 hdfs fsck / -delete,重啟hadoop,就會(huì)自動(dòng)離開安全模式了。
(4)多看日志,總能解決
Hadoop是什么
Hadoop是Lucene創(chuàng)始人Doug Cutting,根據(jù)Google的相關(guān)內(nèi)容山寨出來的分布式文件系統(tǒng)和對海量數(shù)據(jù)進(jìn)行分析計(jì)算的基礎(chǔ)框架系統(tǒng),其中包含MapReduce程序,hdfs系統(tǒng)等。
名詞解釋
(1)Hadoop:Apache開源的分布式框架。
(2)HDSF:Hadoop的分布式文件系統(tǒng)。
(3)NameNode:Hadoop HDFS元數(shù)據(jù)主節(jié)點(diǎn)服務(wù)器,負(fù)責(zé)保存DataNode 文件存儲(chǔ)元數(shù)據(jù)信息,這個(gè)服務(wù)器是單點(diǎn)的。
(4)JobTracker:Hadoop的Map/Reduce調(diào)度器,負(fù)責(zé)與TaskTracker通信分配計(jì)算任務(wù)并跟蹤任務(wù)進(jìn)度,這個(gè)服務(wù)器也是單點(diǎn)的。
(5)DataNode:Hadoop數(shù)據(jù)節(jié)點(diǎn),負(fù)責(zé)存儲(chǔ)數(shù)據(jù)。
(6)TaskTracker:Hadoop調(diào)度程序,負(fù)責(zé)Map,Reduce任務(wù)的啟動(dòng)和執(zhí)行。
Hadoop1的集群部署結(jié)構(gòu)圖
Hadoop1的組件依賴關(guān)系圖
Hadoop2的Yarn架構(gòu)圖
安裝RHEL環(huán)境
使用VMWare WorkStation安裝虛擬機(jī):
http://blog.csdn.net/puma_dong/article/details/17889593#t0 http://blog.csdn.net/puma_dong/article/details/17889593#t1 |
安裝Java環(huán)境:
http://blog.csdn.net/puma_dong/article/details/17889593#t10 |
安裝完畢之后,4臺虛擬機(jī)IP及機(jī)器名稱如下:
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中,不要把機(jī)器名字,同時(shí)對應(yīng)到127.0.0.1這個(gè)地址,會(huì)導(dǎo)致數(shù)據(jù)節(jié)點(diǎn)連接不上命名節(jié)點(diǎn),報(bào)錯(cuò)如下:
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環(huán)境
創(chuàng)建Hadoop賬號
(1)創(chuàng)建Hadoop用戶組:groupadd hadoop
(2)創(chuàng)建Hadoop用戶:useradd hadoop -g hadoop
(3)設(shè)置Hadoop用戶密碼:passwd 密碼hadoop
4)給hadoop賬戶增加sudo權(quán)限: vim /etc/sudoers ,增加內(nèi)容:hduser ALL=(ALL) ALL
注意:以上對于每一臺機(jī)器都要執(zhí)行
創(chuàng)建master到slave的無密碼登錄
(1)切換到Hadoop 用戶下:su hadoop cd /home/hadoop/
(2)生成公鑰和私鑰:ssh-keygen -q -t rsa -N "" -f /home/hadoop/.ssh/id_rsa
(3)查看密鑰內(nèi)容:cd /home/hadoop/.ssh cat id_rsa.pub
(4)復(fù)制id_rsa.pub公鑰到 authorized_keys 文件:cat id_rsa.pub > authorized_keys
(5)修改master公鑰權(quán)限:chmod 644 /home/hadoop/.ssh/authorized_keys
(6)把 master 機(jī)器上的 authorized_keys 文件 copy 到 node1 節(jié)點(diǎn)上:
scp /home/hadoop/.ssh/authorized_keys node1:/home/hadoop/.ssh/ |
如果node1/node2/node3機(jī)器上沒有.ssh目錄,則創(chuàng)建,并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)轉(zhuǎn)到 home/hadoop目錄:cd /home/hadoop
(2)下載hadoop:wget http://mirror.esocc.com/apache/hadoop/common/stable2/hadoop-2.2.0.tar.gz
(3)解壓hadoop并放到計(jì)劃安裝位置:tar zxvf hadoop-2.2.0.tar.gz
(4)創(chuàng)建文件目錄:mkdir -p /home/hadoop/dfs/name /home/hadoop/dfs/data /home/hadoop/tmp
(5)修改7個(gè)配置文件,文件位置:/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
如果系統(tǒng)環(huán)境變量有設(shè)置$JAVA_HOME,則這個(gè)文件不用修改,否則要修改${JAVA_HOME}為:/usr/jdk1.6.0_45
配置文件yarn-env.sh
如果系統(tǒng)環(huán)境變量有設(shè)置$JAVA_HOME,則這個(gè)文件不用修改,否則要修改${JAVA_HOME}為:/usr/jdk1.6.0_45
配置文件slaves
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/slaves,修改內(nèi)容為所有的DataNode的機(jī)器名字,每個(gè)機(jī)器一行,這篇文章的配置如下:
node1 node2 node3 |
配置文件core-site.xml
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/core-site.xml,修改configuration內(nèi)容如下:
<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的默認(rèn)值:/tmp/hadoop-${user.name}
配置文件hdfs-site.xml
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/hdfs-site.xml,修改configuration內(nèi)容如下:
<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的默認(rèn)值:file://${hadoop.tmp.dir}/dfs/name
dfs.namenode.data.dir的默認(rèn)值:file://${hadoop.tmp.dir}/dfs/data
配置文件mapred-site.xml
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/mapred-site.xml,修改configuration內(nèi)容如下:
<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> |
配置節(jié)點(diǎn)yarn-site.xml
vim /home/hadoop/hadoop-2.2.0/etc/hadoop/yarn-site.xml,修改configuration內(nèi)容如下:
<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> |
復(fù)制Hadoop到其他節(jié)點(diǎn)
(1)scp -r /home/hadoop/hadoop-2.2.0 hadoop@node1:~/
(2)scp -r /home/hadoop/hadoop-2.2.0 hadoop@node2:~/
(3)scp -r /home/hadoop/hadoop-2.2.0 hadoop@node3:~/
啟動(dòng)Hadoop
(1)切換到hadoop用戶:su hadoop
(2)進(jìn)入安裝目錄: cd ~/hadoop-2.2.0/
(3)格式化namenode:./bin/hdfs namenode –format ,格式化后會(huì)在$dfs.namenode.name.dir/current生成一系列目錄
(4)啟動(dòng)hdfs: ./sbin/start-dfs.sh
(5)jps查看,此時(shí)master有進(jìn)程:NameNoce SecondaryNameNode,node1/node2/node3上有進(jìn)程:DataNode
(6)啟動(dòng)yarn: ./sbin/start-yarn.sh
(7)jps查看,此時(shí)master有進(jìn)程:NameNoce SecondaryNameNode ResourceManager,node1/node2/node3上有進(jìn)程:DataNode NodeManager
(8)查看集群狀態(tài):./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)啟動(dòng)JobHistory Server:mr-jobhistory-daemon.sh start historyserver,可以通過:http://192.168.1.10:19888/ 查看任務(wù)執(zhí)行歷史信息,終止JobHistory Server,執(zhí)行如下命令:mr-jobhistory-daemon.sh stop historyserver 。
HADOOP_HOME環(huán)境變量
在運(yùn)行方便,我們設(shè)置一個(gè)HADOOP_HOME環(huán)境變量,并加入PATH目錄,步驟如下:
(1)vim /etc/profile.d/java.sh #因?yàn)閔adoop必用java,所有我們把使用這個(gè)文件即可。
(2)增加內(nèi)容:
export HADOOP_HOME=/home/hadoop/hadoop-2.2.0 export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH |
運(yùn)行Hadoop計(jì)算任務(wù)
WordCount
(1)/home/hadoop目錄下有兩個(gè)文本文件file01.txt和file02.txt,文件內(nèi)容分別為:
file01.txt: kongxianghe kong yctc Hello World file02.txt: 11 2222 kong Hello yctc |
(2)將這兩個(gè)文件放入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)計(jì)算并查看結(jié)果:
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 |
可以看到數(shù)據(jù)都已經(jīng)被統(tǒng)計(jì)出來了。
hadoop fs,或者使用hdfs dfs,但是不要使用hadoop dfs,因?yàn)橐呀?jīng)不推薦使用了,會(huì)有警告。
基準(zhǔn)測試排序
Hadoop自帶一些基準(zhǔn)測試程序,用來測試集群性能。例如:
如下的這個(gè)程序,會(huì)現(xiàn)在每個(gè)節(jié)點(diǎn)生成10個(gè)G的隨機(jī)數(shù)字,然后排序出結(jié)果:
(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
第一個(gè)命令會(huì)在rand 目錄的生成沒有排序的數(shù)據(jù)。第二個(gè)命令會(huì)讀數(shù)據(jù),排序,然后寫入rand-sort 目錄。
例如,hadoop_*_test.jar TestDFSIO,用來測試IO性能;其他常用的還有:
(1)MRBench(使用mrbench選項(xiàng))會(huì)多次運(yùn)行一個(gè)小型作業(yè),以檢驗(yàn)小型作業(yè)能否快速的相應(yīng)。
(2)NNBench(使用nnbench選項(xiàng))專門用于測試namenode硬件的負(fù)載。
(3)Gridmix是一個(gè)基準(zhǔn)測試程序套裝。通過模擬一些真實(shí)常見的數(shù)據(jù)訪問模式,能逼真地為一個(gè)集群的負(fù)載建模。
常見錯(cuò)誤
(1)Name node is in safe mode
運(yùn)行hadoop程序時(shí), 異常終止了,然后再向hdfs加文件或刪除文件時(shí),出現(xiàn)Name node is in safe mode錯(cuò)誤:
rmr: org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode |
解決的命令:
hdfs dfsadmin -safemode leave #關(guān)閉safe mode |
(2)DataNode 無法啟動(dòng)
我遇到過兩種情況的DataNode無法啟動(dòng):第一種是/etc/hosts里面機(jī)器名字除了和IP對應(yīng)之外,還和127.0.0.1對應(yīng),導(dǎo)致DataNode連接NameNode的9000端口一直連接不上;第二種是多次format namenode 造成namenode 和datanode的clusterID不一致,通過查看NameNode和DataNode的/home/hadoop/dfs/data/current/VERSION,發(fā)現(xiàn)確實(shí)不一致。
總之,遇到錯(cuò)誤不要慌,多看看$HADOOP_HOME/logs下面的日志,就能找到問題。
Copyright? 2012-2013 TATAIT.COM All Rights Reserved 深圳塔塔咨詢服務(wù)有限公司 版權(quán)所有 深圳網(wǎng)站建設(shè):沙漠風(fēng)
塔塔IT—高端IT培訓(xùn)領(lǐng)導(dǎo)品牌,專注于IT前沿技術(shù)的傳播與應(yīng)用。專業(yè)創(chuàng)造價(jià)值,服務(wù)贏得口碑!