參考:http://blog.csdn.net/u010270403/article/details/51444677node
虛擬機中共五個centos系統,每一個系統有兩個用戶root和hadoop:cdh1,cdh2,cdh3,cdh4,cdh5web
集羣規劃shell
第一步,切換到hadoop的家目錄下,把已經下載好的hadoop放到/home/hadoop/app目錄下並解壓(以cdh1爲例)apache
#tar zxvf hadoop-2.6.0-cdh5.4.5.tar.gz
第二步,刪除hadoop的壓縮文件bootstrap
# rm -rf hadoop-2.6.0-cdh5.4.5.tar.gz
第三步,配置環境變量centos
# vi /home/hadoop/.bash_profile(hadoop用戶)瀏覽器
# vi /etc/profile(root用戶,全部節點都須要配置)bash
添加:app
HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.4.5 export PATH=$PATH:$HADOOP_HOME/bin
第四步,使環境變量文件即時生效ssh
# source /home/hadoop/.bash_profile(Hadoop用戶)
# source /etc/profile(root用戶)
第五步,進入~/app/hadoop-2.6.0-cdh5.4.5/etc/hadoop目錄,修改配置文件
配置hadoop-env.sh
原配置JAVA_HOME改成:
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
配置core-site.xml
添加:
<property> <name>fs.defaultFS</name> <value>hdfs://cluster1</value> </property> <!-- 這裏的值指的是默認的HDFS路徑 ,取名爲cluster1 --> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/data/tmp</value> </property> <!-- hadoop的臨時目錄,若是須要配置多個目錄,須要逗號隔開,data目錄須要咱們本身建立 --> <property> <name>ha.zookeeper.quorum</name> <value>cdh3:2181,cdh4:2181,cdh5:2181</value> </property> <!-- 配置Zookeeper 管理HDFS -->
配置hdfs-site.xml
添加:
<property> <name>dfs.replication</name> <value>3</value> </property> <!-- 數據塊副本數爲3 --> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <!-- 權限默認配置爲false --> <property> <name>dfs.nameservices</name> <value>cluster1</value> </property> <!-- 命名空間,它的值與fs.defaultFS的值要對應,namenode高可用以後有兩個namenode,cluster1是對外提供的統一入口 --> <property> <name>dfs.ha.namenodes.cluster1</name> <value>nn1,nn2</value> </property> <!-- 指定 nameService 是 cluster1 時的nameNode有哪些,這裏的值也是邏輯名稱,名字隨便起,相互不重複便可 --> <property> <name>dfs.namenode.rpc-address.cluster1.nn1</name> <value>cdh1:9000</value> </property> <!-- CDHNode1 rpc地址 --> <property> <name>dfs.namenode.http-address.cluster1.nn1</name> <value>cdh1:50070</value> </property> <!-- CDHNode1 http地址 --> <property> <name>dfs.namenode.rpc-address.cluster1.nn2</name> <value>cdh2:9000</value> </property> <!-- CDHNode2 rpc地址 --> <property> <name>dfs.namenode.http-address.cluster1.nn2</name> <value>cdh2:50070</value> </property> <!-- CDHNode2 http地址 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 指定NameNode的元數據在JournalNode上的存放位置 journalnode在集羣規劃中屬於全部節點 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://cdh1:8485;cdh2:8485;cdh3:8485;cdh4:8485;cdh5:8485/cluster1</value> </property> <!-- 指定journal --> <property> <name>dfs.client.failover.proxy.provider.cluster1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 指定JournalNode在本地磁盤存放數據的位置--> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/data/journaldata/jn</value> </property> <!-- 指定JournalNode集羣在對nameNode的目錄進行共享時,本身存儲數據的磁盤路徑 --> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>60000</value> </property> <!-- 默認配置 --> <property> <name>dfs.namenode.handler.count</name> <value>100</value> </property>
配置slaves(配置子節點的位置,也就是datanode的位置)
YARN安裝配置
配置mapred-site.xml
首先複製mapred-site文件:# cp mapred-site.xml.template mapred-site.xml
配置mapred-site.xml
添加:
<!-- 指定運行mapreduce的環境是Yarn,與hadoop1不一樣的地方 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
配置yarn-site.xml
添加:
<property> <name>yarn.resourcemanager.connect.retry-interval.ms</name> <value>2000</value> </property> <!-- 超時的週期 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 打開高可用 --> <property> <name>yarn.resourcemanager.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 啓動故障自動恢復 --> <property> <name>yarn.resourcemanager.ha.automatic-failover.embedded</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-rm-cluster</value> </property> <!-- 給yarn cluster 取個名字yarn-rm-cluster --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 給ResourceManager 取個名字 rm1,rm2 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>cdh1</value> </property> <!-- 配置ResourceManager rm1 hostname --> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>cdh2</value> </property> <!-- 配置ResourceManager rm2 hostname --> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!-- 啓用resourcemanager 自動恢復 --> <property> <name>yarn.resourcemanager.zk.state-store.address</name> <value>cdh3:2181,cdh4:2181,cdh5:2181</value> </property> <!-- 配置Zookeeper地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>cdh3:2181,cdh4:2181,cdh5:2181</value> </property> <!-- 配置Zookeeper地址 --> <property> <name>yarn.resourcemanager.address.rm1</name> <value>cdh1:8032</value> </property> <!-- rm1端口號 --> <property> <name>yarn.resourcemanager.scheduler.address.rm1</name> <value>cdh1:8034</value> </property> <!-- rm1調度器的端口號 --> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>cdh1:8088</value> </property> <!-- rm1 webapp端口號 --> <property> <name>yarn.resourcemanager.address.rm2</name> <value>cdh2:8032</value> </property> <!-- rm2端口號 --> <property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>cdh2:8034</value> </property> <!-- rm2調度器的端口號 --> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>cdh2:8088</value> </property> <!-- rm2 webapp端口號 --> <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> <!-- 執行MapReduce須要配置的shuffle過程 -->
第六步,在cdh1上經過命令deploy.sh將Hadoop安裝目錄拷貝到其餘四個節點
查看cdh2的~/app目錄
在cdh1的~/tools目錄下執行deploy.sh批處理命令
#./deploy.sh ~/app/hadoop-2.6.0-cdh5.4.5/ ~/app/ slave
驗證cdh2的~/app目錄
第七步,在cdh1的~/tools目錄下經過遠程命令runRemoteCmd.sh在全部節點按照目錄的規劃建立存儲數據目錄 (cdh1-cdh5)
#./runRemoteCmd.sh "mkdir -p /home/hadoop/data/name" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/hdfs/edits" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/datanode" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/journaldata/jn" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/tmp/dfs/name " all #./runRemoteCmd.sh "touch /home/hadoop/app/hadoop-2.6.0-cdh5.4.5/etc/hadoop/excludes" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/pid" all
在cdh1的~/tools目錄下執行以上批處理命令
在其餘節點上驗證是否建立成功,以cdh2爲例
當初始化過程當中出錯時,要把相關目錄的文件刪除,而後再從新初始化
在cdh1的~/tools目錄下執行以上批處理命令:
#./runRemoteCmd.sh "rm -rf /home/hadoop/data/name/*" all #./runRemoteCmd.sh "rm -rf /home/hadoop/data/hdfs/edits/*" all #./runRemoteCmd.sh "rm -rf /home/hadoop/data/datanode/*" all #./runRemoteCmd.sh "rm -rf /home/hadoop/data/journaldata/jn/*" all #./runRemoteCmd.sh "rm -rf /home/hadoop/data/tmp/*" all
第八步,集羣初始化
啓動全部節點上面的Zookeeper進程
在cdh3的~/tools目錄下執行以上批處理命令:
#./runRemoteCmd.sh "~/app/zookeeper-3.4.5-cdh5.4.5/bin/zkServer.sh start" zookeeper
查看zookeeper進程
# ./runRemoteCmd.sh "jps" zookeeper
啓動全部節點上面的journalnode進程
在cdh1的~/tools目錄下執行以上批處理命令:
# ./runRemoteCmd.sh "~/app/hadoop-2.6.0-cdh5.4.5/sbin/hadoop-daemon.sh start journalnode" all
查看journalnode進程
# ./runRemoteCmd.sh "jps" all
在主節點上(cdh1)執行格式化
進入腳本目錄(如下命令從文檔直接複製若是出錯,則手動輸入便可)
# cd ~/app/hadoop-2.6.0-cdh5.4.5/bin/
Namenode格式化
# hdfs namenode –format
格式化高可用
hdfs zkfc –formatZK
啓動namenode
hdfs namenode
執行完上述命令後,cdh1程序就會處於等待狀態
在cdh1等待過程當中,進入cdh2執行#hdfs namenode –bootstrapStandby進行數據同步,等到cdh2執行完成後,返回cdh1按住ctrl+c退出便可。
進入~/tools目錄,關閉全部journalnode節點
./runRemoteCmd.sh "~/app/hadoop-2.6.0-cdh5.4.5/sbin/hadoop-daemon.sh stop journalnode" all
第九步,若是上面操做沒有問題,接着能夠一鍵啓動hdfs全部相關進程
進入/home/hadoop/app/hadoop-2.6.0-cdh5.4.5/sbin目錄,執行如下命令
#./start-dfs.sh
第十步,查看Hadoop進程
進入~/tools目錄下,執行
./runRemoteCmd.sh "jps" all
第十一步,殺掉active的namenode,驗證是否能夠完成namenode的切換
在本地(window系統)C:\Windows\System32\drivers\etc\hosts目錄下添加:
192.168.150.101 cdh1 192.168.150.102 cdh2 192.168.150.103 cdh3 192.168.150.104 cdh4 192.168.150.105 cdh5
在瀏覽器輸入:http://cdh1:50070/和http://cdh2:50070/
查看兩個namenode的狀態
查看cdh1節點namenode的進程號
#jps
殺掉active狀態的cdh1節點的namenode
#kill -9 進程id
刷新http://cdh1:50070/和http://cdh2:50070/頁面
由上看出,cdh1:50070已經沒法訪問了,說明cdh1的namenode已經掛掉了,cdh2:50070的namenode狀態已經變成了active,說明成功完成了切換。
從新啓動cdh1的namenode#hdfs namenode,而後查看cdh1和cdh2兩個節點namenode的狀態
由上看出,cdh1啓動後狀態變成了standby。
第十二步,環境測試
上傳文件到HDFS系統
首先新建一個文件:
在hdfs上建立一個文件目錄
# hadoop dfs -mkdir /datafs
把world.txt上傳到hdfs
#hadoop dfs -put ~/world.txt /datafs
查看world.txt是否上傳成功
# hadoop dfs -ls /datafs
若是上面操做沒有問題說明hdfs配置成功。
第十三步,啓動YARN
在cdh2進入~/app/hadoop-2.6.0-cdh5.4.5/sbin/目錄,執行./start-yarn.sh
本步在啓動的時候,提示我cdh四、cdh5的known_hosts文件須要配置其餘節點的祕鑰,用scp known_hosts hadoop@cdh3:~/.ssh/拷貝一份到這兩個節點便可。
在cdh1進入~/app/hadoop-2.6.0-cdh5.4.5/sbin/目錄,執行./yarn-daemon.sh start resourcemanager(啓動完成後cdh1和cdh2的resourcemanager就都起來了)
打開http://cdh1:8088和http://cdh2:8088兩個web界面
在打開cdh1:8088界面時,會首先提示「此爲standby的RM,將跳轉到active的cdh2:8088」,而後會自動跳轉到cdh2:8088界面
經過上述web界面提示能夠看出,cdh1是RM的standby,因此殺掉cdh2的resourcemanager進程,看一下效果
# ./yarn-daemon.sh stop resourcemanager
從新查看cdh1:8088界面
從新啓動cdh2的RM
#./yarn-daemon.sh start resourcemanager
而後在cdh1和cdh2上查看ResourceManager狀態
#yarn rmadmin -getServiceState rm1
由上能夠看出,cdh1變成了active,說明resourcemanager完成了切換。
第十四步,Wordcount示例測試
在cdh1上執行如下語句
# hadoop jar /home/hadoop/app/hadoop-2.6.0-cdh5.4.5/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.4.5.jar wordcount /datafs/world.txt /datafs/out/
登陸http://cdh2:50070查看執行結果
第十五步,集羣關啓順序 關閉cdh1的resourcemanager,進入cdh1節點的~/app/hadoop-2.6.0-cdh5.4.5/sbin目錄,執行./yarn-daemon.sh stop resourcemanager #cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin #./yarn-daemon.sh stop resourcemanager 關閉yarn(也會關閉cdh2的resourcemanager),進入cdh2節點的~/app/hadoop-2.6.0-cdh5.4.5/sbin目錄,執行./stop-yarn.sh #cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin # ./stop-yarn.sh 關閉HDFS,進入cdh1節點的~/app/hadoop-2.6.0-cdh5.4.5/sbin目錄,執行./stop-dfs.sh # cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin #./stop-dfs.sh 關閉zookeeper,進入cdh3節點的~/tools目錄 #cd ~/tools/ #./runRemoteCmd.sh "~/app/zookeeper-3.4.5-cdh5.4.5/bin/zkServer.sh stop" zookeeper 查看進程,進入cdh1的~/tools目錄下 #cd ~/tools/ #./runRemoteCmd.sh "jps" all 再次啓動集羣 啓動zookeeper,進入cdh3節點的~/tools目錄 #cd ~/tools/ #./runRemoteCmd.sh "~/app/zookeeper-3.4.5-cdh5.4.5/bin/zkServer.sh start" zookeeper 啓動HDFS,進入cdh1節點的~/app/hadoop-2.6.0-cdh5.4.5/sbin目錄,執行./start-dfs.sh # cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin #./start-dfs.sh 啓動YARN,進入cdh1節點的~/app/hadoop-2.6.0-cdh5.4.5/sbin目錄,執行./start-yarn.sh # cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin #./start-yarn.sh 啓動resourcemanager,進入cdh2節點的~/app/hadoop-2.6.0-cdh5.4.5/sbin目錄 # cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin # ./yarn-daemon.sh start resourcemanager 查看進程,進入cdh1的~/tools目錄下 #cd ~/tools/ #./runRemoteCmd.sh "jps" all
至此,hadoop 的徹底分佈式集羣搭建完畢。
完成!