先按照上一篇安裝與配置好CentOS以及zookeeper
http://www.cnblogs.com/dopeter/p/4609276.html
本章介紹在CentOS搭建Hadoop集群環境
一、 安裝Hadoop
1. 解壓文件
tar -zxvf hadoop-2.7.0-x64.tar.gz -C /opt #解壓Hadoop
2. 編輯全局變量
vi /etc/profile
增加以下全局變量
export HADOOP_HOME=/opt/hadoop-2.7.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export YARN_LOG_DIR=$HADOOP_LOG_DIR
source /etc/profile #即時生效
二、 配置Hadoop
cd /opt/hadoop-2.7.0/etc/hadoop
vi core-site.xml
<configuration> <!--HDFS路徑邏輯名稱--> <property> <name>fs.defaultFS</name> <value>hdfs://hcluster</value> </property> <!--Hadoop存放臨時文件位置--> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/tmp</value> </property> <!--使用的zookeeper集群地址--> <property> <name>ha.zookeeper.quorum</name> <value>HSlave0:2181,HSlave1:2181,HSlave2:2181</value> </property> </configuration>
vi hdfs-site.xml
<configuration> <property> <name>dfs.nameservices</name> <value>hcluster</value> </property> <!--NameNode地址集群標識(hcluster),最多兩個--> <property> <name>dfs.ha.namenodes.hcluster</name> <value>HMaster0,HMaster1</value> </property> <!--HDFS文件系統數據存儲位置,可以分別保存到不同硬盤,突破單硬盤性能瓶頸,多個位置以逗號隔開--> <property> <name>dfs.data.dir</name> <value>/home/hadoop/hdfs/data</value> </property> <!--數據副本數量,根據HDFS台數設置,默認3份--> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.rpc-address.hcluster.HMaster0</name> <value>HMaster0:9000</value> </property> <!--RPC端口--> <property> <name>dfs.namenode.rpc-address.hcluster.HMaster1</name> <value>HMaster1:9000</value> </property> <!--NameNode HTTP訪問地址--> <property> <name>dfs.namenode.http-address.hcluster.HMaster0</name> <value>HMaster0:50070</value> </property> <property> <name>dfs.namenode.http-address.hcluster.HMaster1</name> <value>HMaster1:50070</value> </property> <!--NN存放元數據和日志位置--> <property> <name>dfs.namenode.name.dir</name> <value>file:/home/hadoop/name</value> </property> <!--同時把NameNode元數據和日志存放在JournalNode上(/home/hadoop/journal/hcluster)--> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://HSlave0:8485;HSlave1:8485;HSlave2:8485/hcluster</value> </property> <!--JournalNode上元數據和日志存放位置--> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/journal</value> </property> <!--開啟NameNode失敗自動切換--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!--NameNode失敗自動切換實現方式--> <property> <name>dfs.client.failover.proxy.provider.hcluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--隔離機制方法,確保任何時間只有一個NameNode處於活動狀態--> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence(hdfs) shell(/bin/true)</value> </property> <!--使用sshfence隔離機制要SSH免密碼認證--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> </configuration>
vi yarn-site.xml
<configuration> <!--啟用RM高可用--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--RM集群標識符--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>rm-cluster</value> </property> <property> <!--指定兩台RM主機名標識符--> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!--RM故障自動切換--> <property> <name>yarn.resourcemanager.ha.automatic-failover.recover.enabled</name> <value>true</value> </property> <!--RM故障自動恢復 <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> --> <!--RM主機1--> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>HMaster0</value> </property> <!--RM主機2--> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>HMaster1</value> </property> <!--RM狀態信息存儲方式,一種基於內存(MemStore),另一種基於ZK(ZKStore)--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!--使用ZK集群保存狀態信息--> <property> <name>yarn.resourcemanager.zk-address</name> <value>HSlave0:2181,HSlave1:2181,HSlave2:2181</value> </property> <!--向RM調度資源地址--> <property> <name>yarn.resourcemanager.scheduler.address.rm1</name> <value>HMaster0:8030</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>HMaster1:8030</value> </property> <!--NodeManager通過該地址交換信息--> <property> <name>yarn.resourcemanager.resource-tracker.address.rm1</name> <value>HMaster0:8031</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm2</name> <value>HMaster1:8031</value> </property> <!--客戶端通過該地址向RM提交對應用程序操作--> <property> <name>yarn.resourcemanager.address.rm1</name> <value>HMaster0:8032</value> </property> <property> <name>yarn.resourcemanager.address.rm2</name> <value>HMaster1:8032</value> </property> <!--管理員通過該地址向RM發送管理命令--> <property> <name>yarn.resourcemanager.admin.address.rm1</name> <value>HMaster0:8033</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm2</name> <value>HMaster1:8033</value> </property> <!--RM HTTP訪問地址,查看集群信息--> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>HMaster0:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>HMaster1:8088</value> </property> </configuration>
vi mapred-site.xml
<configuration> <!--指定MR框架為YARN--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 配置 MapReduce JobHistory Server地址 ,默認端口10020 --> <property> <name>mapreduce.jobhistory.address</name> <value>0.0.0.0:10020</value> </property> <!-- 配置 MapReduce JobHistory Server HTTP地址, 默認端口19888 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>0.0.0.0:19888</value> </property> </configuration>
vi hadoop-env.sh
將export JAVA_HOME=${JAVA_HOME}修改為安裝的JDK路徑 export JAVA_HOME=/usr/java/jdk1.8.0_45
vi slaves
HSlave0
HSlave1
HSlave2
三、拷貝至每個節點
scp -r /opt/hadoop-2.7.0 hmaster1:/opt
...
直到slave2
四、 啟動Hadoop集群
1. 對NameNode(HMaster0)節點進行格式化
hadoop namenode -format
如果有錯誤發生可以在/opt/hadoop/logs下的hadoop-root-namenode-localhost.localdomain.log文件中查看日志
說明2種常見錯誤:
1. 在hadoop的hdfs-site.xml配置中,有這個屬性dfs.namenode.shared.edits.dir,值為qjournal://HSlave0:8485;HSlave1:8485;HSlave2:8485/hcluster
錯誤會報連接HSlave0:8485被積極拒絕,在每個Slave節點機器上運行命令
hadoop-daemon.sh start journalnode
該命令運行后,在Slave節點機器上會開啟監聽8485端口的Socket,再次格式化NameNode,就不會報這個錯了
2. 有時DataNode會無法啟動,查看錯誤日志是NameNode機器(Master機器)和DataNode機器(Slave機器)namespaceID或者clusterID不一致,有2種解決方案
第一種解決方案是修改VERSION文件中不一致,VERSION文件在hdfs-site,xml配置中該屬性dfs.namenode.name.dir定義的路徑下的current文件夾中
第二種解決方案即是刪除current文件夾以及DataNode機器的tmp文件夾,有可能文件夾在NameNode機器和DataNode機器下相對路徑不一樣,但根路徑都一樣,在第一種解決方案中有說明,再次格式化NameNode就OK了
2. 啟動HMaster0(active)節點NameNode
hadoop-daemon.sh start namenode
3. HMaster1節點上同步(HMaster0)元數據
hdfs namenode -bootstrapStandby #實際上是將HMaster0機器上的current文件夾同步過來
4. 啟動HMaster1(standby)節點NameNode
hadoop-daemon.sh start namenode
5. 在HMaster0格式化ZKFC
hdfs zkfc -formatZK
6. 在HMaster0節點啟動HDFS集群
start-dfs.sh
7. 啟動ResourceManager(HMaster0機器)
start-yarn.sh
8. 在standby節點啟動ResourceManager(HMaster1機器)
yarn-daemon.sh start resourcemanager
驗證集群是否成功
2015-7-7
運行wordcount示例時,遇到的錯誤問題
org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService:mapreduce_shuffle does not exist
cd /opt/hadoop-2.7.0/ect/hadoop
vim yarn-site.xml
增加2個配置
<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>
<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>
2015-7-23
1. 如果是在Windows上Eclipse連接Hadoop集群,Windows的用戶名最好和Linux上運行Hadoop的用戶名一樣,不然Eclipse上會報很多莫名其妙的錯誤,應該是權限的問題
2. Liunx的主機名,如果用虛擬機,Copy虛擬機的文件至另外機器時,虛擬機的系統主機名可能會改變,使用hostnamectl status 查看,如果和Hadoop中配置的主機名不再一樣,hostnamectl set-hostname xxx來改變主機名
2015-8-28
如果節點機器從其他虛擬機Clone而來,最好修改網卡的MAC地址,否則局域網內是通的,但有可能不能上外網。
