環(huán)境需要:
linux系統(tǒng)(當(dāng)前使用Centos6.5)、jdk、hadoop2.4.1、zookeeper-3.4.6侯勉、ssh
概念簡(jiǎn)單介紹
NameNode
Namenode 管理者文件系統(tǒng)的Namespace。它維護(hù)著文件系統(tǒng)樹(shù)(filesystem tree)以及文件樹(shù)中所有的文件和文件夾的元數(shù)據(jù)(metadata)铝阐。管理這些信息的文件有兩個(gè)址貌,分別是Namespace 鏡像文件(Namespace image)和操作日志文件(edit log),這些信息被Cache在RAM中徘键,當(dāng)然芳誓,這兩個(gè)文件也會(huì)被持久化存儲(chǔ)在本地硬盤(pán)。Namenode記錄著每個(gè)文件中各個(gè)塊所在的數(shù)據(jù)節(jié)點(diǎn)的位置信息啊鸭,但是他并不持久化存儲(chǔ)這些信息锹淌,因?yàn)檫@些信息會(huì)在系統(tǒng)啟動(dòng)時(shí)從數(shù)據(jù)節(jié)點(diǎn)重建。
客戶端(client)代表用戶與namenode和datanode交互來(lái)訪問(wèn)整個(gè)文件系統(tǒng)赠制÷赴冢客戶端提供了一些列的文件系統(tǒng)接口挟憔,因此我們?cè)诰幊虝r(shí),幾乎無(wú)須知道datanode和namenode烟号,即可完成我們所需要的功能绊谭。
DataNode
Datanode是文件系統(tǒng)的工作節(jié)點(diǎn),他們根據(jù)客戶端或者是namenode的調(diào)度存儲(chǔ)和檢索數(shù)據(jù)汪拥,并且定期向namenode發(fā)送他們所存儲(chǔ)的塊(block)的列表达传。
集群中的每個(gè)服務(wù)器都運(yùn)行一個(gè)DataNode后臺(tái)程序,這個(gè)后臺(tái)程序負(fù)責(zé)把HDFS數(shù)據(jù)塊讀寫(xiě)到本地的文件系統(tǒng)迫筑。當(dāng)需要通過(guò)客戶端讀/寫(xiě)某個(gè) 數(shù)據(jù)時(shí)宪赶,先由NameNode告訴客戶端去哪個(gè)DataNode進(jìn)行具體的讀/寫(xiě)操作,然后脯燃,客戶端直接與這個(gè)DataNode服務(wù)器上的后臺(tái)程序進(jìn)行通 信搂妻,并且對(duì)相關(guān)的數(shù)據(jù)塊進(jìn)行讀/寫(xiě)操作。
DFSZKFailoverController
驅(qū)動(dòng)整個(gè)ZKFC的運(yùn)轉(zhuǎn)辕棚,通過(guò)向HealthMonitor和ActiveStandbyElector注冊(cè)回調(diào)函數(shù)的方式欲主,subscribe HealthMonitor和ActiveStandbyElector的事件,并做相應(yīng)的處理
ResourceManager
YARN中的資源管理器(Resource Manager)負(fù)責(zé)整個(gè)系統(tǒng)的資源管理和調(diào)度逝嚎,并內(nèi)部維護(hù)了各個(gè)應(yīng)用程序的ApplictionMaster信息扁瓢,NodeManager信息,資源使用信息等NodeManager
NodeManager(NM)是YARN中每個(gè)節(jié)點(diǎn)上的代理补君,它管理Hadoop集群中單個(gè)計(jì)算節(jié)點(diǎn)引几,包括與ResourceManger保持通信,監(jiān)督Container的生命周期管理赚哗,監(jiān)控每個(gè)Container的資源使用(內(nèi)存她紫、CPU等)情況硅堆,追蹤節(jié)點(diǎn)健康狀況屿储,管理日志和不同應(yīng)用程序用到的附屬服務(wù)(auxiliary service)。
JorunalNode
journalNode的作用是存放EditLog的,在MR1中editlog是和fsimage存放在一起的然后SecondNamenode做定期合并,Yarn在這上面就不用SecondNamanode了
QuorumPeerMain
zookeeper獨(dú)立的進(jìn)程
1.集群規(guī)劃
主機(jī) | IP | 軟件 | 運(yùn)行進(jìn)程 |
---|---|---|---|
server01 | 192.168.1.101 | hadoop渐逃、ssh | NameNode够掠、DFSZKFailoverController(zkfc) |
server02 | 192.168.1.102 | hadoop、ssh | NameNode茄菊、DFSZKFailoverController(zkfc) |
server03 | 192.168.1.103 | hadoop疯潭、ssh | ResourceManager |
server04 | 192.168.1.104 | hadoop、ssh | ResourceManager |
server05 | 192.168.1.105 | hadoop面殖、ssh竖哩、zookeeper | DataNode、NodeManager脊僚、JournalNode相叁、QuorumPeerMain |
server06 | 192.168.1.106 | hadoop、ssh、zookeeper | DataNode椿访、NodeManager虑润、JournalNode、QuorumPeerMain |
server07 | 192.168.1.107 | hadoop拳喻、ssh哭当、zookeeper | DataNode舞蔽、NodeManager、JournalNode渗柿、QuorumPeerMain |
本環(huán)境中个盆,將有兩個(gè)NameNode組成,一個(gè)處于Active狀態(tài)颊亮,一個(gè)處于StandBy狀態(tài)陨溅。Active NameNode將對(duì)外提供服務(wù),StandBy NameNode不對(duì)外提供服務(wù)雹有,僅同步Active NameNode的狀態(tài)臼寄。當(dāng)Active NameNode失敗時(shí),則進(jìn)行切換(原處于Active狀態(tài)的NameNode變成StandBy狀態(tài)质帅,另一個(gè)反之)
Hadoop2.0之后煤惩,提供了兩種HDFS HA的解決方案炼邀,一種是NFS,另一種是QJM洛退。本環(huán)境中使用QJM(市場(chǎng)使用較多)不狮。在該方案中,主備NameNode通過(guò)一組JournalNode同步元數(shù)據(jù)信息推掸,一條數(shù)據(jù)只要寫(xiě)入到JorunalNode即認(rèn)為寫(xiě)入成功驻仅。一般配置奇數(shù)個(gè)JorunalNode噪服。
本環(huán)境中還配置了一個(gè)zookeeper集群,用于ZKFC(DFSZKFailoverController)故障轉(zhuǎn)移仇味,當(dāng)Acitve NameNode掛掉了雹顺,會(huì)自動(dòng)切換StandBy狀態(tài)的NameNode為Active狀態(tài)
本環(huán)境中也配置了兩個(gè)ResourceManager嬉愧,一個(gè)是Active,一個(gè)是Standby王财,狀態(tài)由zookeeper進(jìn)行協(xié)調(diào)
2.安裝步驟
1.安裝配置zooekeeper集群(在server05上)
1.1解壓
tar -zxvf zookeeper-3.4.5.tar.gz -C /root/app/
1.2修改配置
cd /root/app/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:dataDir=/root/app/zookeeper-3.4.5/tmp
在最后添加:
server.1=server05:2888:3888
server.2=server06:2888:3888
server.3=server07:2888:3888
保存退出
然后創(chuàng)建一個(gè)tmp文件夾
mkdir /root/app/zookeeper-3.4.5/tmp
echo 1 > /root/app/zookeeper-3.4.5/tmp/myid
1.3將配置好的zookeeper拷貝到其他節(jié)點(diǎn)
scp -r /root/app/zookeeper-3.4.5/ root@server06:/root/app/
scp -r /root/app/zookeeper-3.4.5/ root@server07:/root/app/
注意:修改server06绒净、server07對(duì)應(yīng)/root/app/zookeeper-3.4.5/tmp/myid內(nèi)容
server06:
echo 2 > /root/app/zookeeper-3.4.5/tmp/myid
server07:
echo 3 > /root/app/zookeeper-3.4.5/tmp/myid
2.安裝配置hadoop集群(在server01上操作)
2.1解壓
tar -zxvf hadoop-2.4.1.tar.gz -C /root/app/
2.2配置HDFS
#將hadoop添加到環(huán)境變量中
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_55
export HADOOP_HOME=/root/app/hadoop-2.4.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
#hadoop2.4.1的配置文件全部在$HADOOP_HOME/etc/hadoop下
cd /root/app/hadoop-2.4.1/etc/hadoop
2.2.1修改hadoo-env.sh
export JAVA_HOME=/root/app/jdk1.7.0_55
2.2.2修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 指定hadoop臨時(shí)目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/app/hadoop-2.4.1/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>server05:2181,server06:2181,server07:2181</value>
</property>
</configuration>
2.2.3修改hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice為ns1疯溺,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有兩個(gè)NameNode,分別是nn1漏设,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>server01:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>server01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>server02:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>server02:50070</value>
</property>
<!-- 指定NameNode的元數(shù)據(jù)在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://server05:8485;server06:8485;server07:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤(pán)存放數(shù)據(jù)的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/root/app/hadoop-2.4.1/journaldata</value>
</property>
<!-- 開(kāi)啟NameNode失敗自動(dòng)切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動(dòng)切換實(shí)現(xiàn)方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機(jī)制方法鸳碧,多個(gè)機(jī)制用換行分割犬性,即每個(gè)機(jī)制暫用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機(jī)制時(shí)需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機(jī)制超時(shí)時(shí)間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
2.2.4修改mapred-site.xml
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
2.2.5修改yarn-site.xml
<configuration>
<!-- 開(kāi)啟RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分別指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>server03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>server04</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>server05:2181,server06:2181,server07:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
2.2.6修改slaves(slaves是指定子節(jié)點(diǎn)的位置套利,因?yàn)橐趕erver01上啟動(dòng)HDFS肉迫、在server03啟動(dòng)yarn稿黄,所以server01上的slaves文件指定的是datanode的位置,server03上的slaves文件指定的是nodemanager的位置)
server05
server06
server07
2.2.7配置免密碼登陸
#首先要配置server01到server02族购、server03联四、server04撑教、server05、server06收苏、server07的免密碼登陸
#在server01上生產(chǎn)一對(duì)鑰匙
ssh-keygen -t rsa
#將公鑰拷貝到其他節(jié)點(diǎn)愤兵,包括自己
ssh-coyp-id server01
ssh-coyp-id server02
ssh-coyp-id server03
ssh-coyp-id server04
ssh-coyp-id server05
ssh-coyp-id server06
ssh-coyp-id server07
#配置server03到server04秆乳、server05、server06肛冶、server07的免密碼登陸
#在server03上生產(chǎn)一對(duì)鑰匙
ssh-keygen -t rsa
#將公鑰拷貝到其他節(jié)點(diǎn)
ssh-coyp-id server04
ssh-coyp-id server05
ssh-coyp-id server06
ssh-coyp-id server07
#注意:兩個(gè)namenode之間要配置ssh免密碼登陸睦袖,別忘了配置server02到server01的免登陸
在server02上生產(chǎn)一對(duì)鑰匙
ssh-keygen -t rsa
ssh-coyp-id -i server01
2.4將配置好的hadoop拷貝到其他節(jié)點(diǎn)
scp -r /root/app/hadoop-2.4.1/ root@server02:/root/app/
scp -r /root/app/hadoop-2.4.1/ root@server03:/root/app/
scp -r /root/app/hadoop-2.4.1/ root@server04:/root/app/
scp -r /root/app/hadoop-2.4.1/ root@server05:/root/app/
scp -r /root/app/hadoop-2.4.1/ root@server06:/root/app/
scp -r /root/app/hadoop-2.4.1/ root@server07:/root/app/
3.啟動(dòng)
###注意:嚴(yán)格按照下面的步驟
2.5啟動(dòng)zookeeper集群(分別在server05荣刑、server06、server07上啟動(dòng)zk)
cd /root/app/zookeeper-3.4.5/bin/
./zkServer.sh start
#查看狀態(tài):一個(gè)leader董习,兩個(gè)follower
./zkServer.sh status
2.6啟動(dòng)journalnode(分別在在server05皿淋、server06、server07上執(zhí)行)
cd /root/app/hadoop-2.4.1
sbin/hadoop-daemon.sh start journalnode
#運(yùn)行jps命令檢驗(yàn)蔗喂,server05高帖、server06散址、server07上多了JournalNode進(jìn)程
2.7格式化HDFS
#在server01上執(zhí)行命令:
hdfs namenode -format
#格式化后會(huì)在根據(jù)core-site.xml中的hadoop.tmp.dir配置生成個(gè)文件,這里我配置的是/server/hadoop-2.4.1/tmp瞪浸,然后將/server/hadoop-2.4.1/tmp拷貝到server02的/server/hadoop-2.4.1/下吏祸。
scp -r tmp/ server02:/home/hadoop/app/hadoop-2.4.1/
##也可以這樣贡翘,建議hdfs namenode -bootstrapStandby
2.8格式化ZKFC(在server01上執(zhí)行即可)
hdfs zkfc -formatZK
2.9啟動(dòng)HDFS(在server01上執(zhí)行)
sbin/start-dfs.sh
2.10啟動(dòng)YARN(#####注意#####:是在server03上執(zhí)行start-yarn.sh,把namenode和resourcemanager分開(kāi)是因?yàn)樾阅軉?wèn)題泛鸟,因?yàn)樗麄兌家加么罅抠Y源踊东,所以把他們分開(kāi)了闸翅,他們分開(kāi)了就要分別在不同的機(jī)器上啟動(dòng))
sbin/start-yarn.sh
到此,hadoop-2.4.1配置完畢祝闻,可以統(tǒng)計(jì)瀏覽器訪問(wèn):
http://192.168.1.101:50070
NameNode 'server01:9000' (active)
http://192.168.1.102:50070
NameNode 'server02:9000' (standby)
驗(yàn)證HDFS HA
首先向hdfs上傳一個(gè)文件
hadoop fs -put /etc/profile /profile
hadoop fs -ls /
然后再kill掉active的NameNode
kill -9 <pid of NN>
通過(guò)瀏覽器訪問(wèn):http://192.168.1.202:50070
NameNode 'server02:9000' (active)
這個(gè)時(shí)候server02上的NameNode變成了active
在執(zhí)行命令:
hadoop fs -ls /
-rw-r--r-- 3 root supergroup 1926 2017-02-06 15:36 /profile
剛才上傳的文件依然存在AU尬场!
手動(dòng)啟動(dòng)那個(gè)掛掉的NameNode
sbin/hadoop-daemon.sh start namenode
通過(guò)瀏覽器訪問(wèn):http://192.168.1.101:50070
NameNode 'server01:9000' (standby)
驗(yàn)證YARN:
運(yùn)行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
4.測(cè)試集群的簡(jiǎn)單命令
測(cè)試集群工作狀態(tài)的一些指令 :
bin/hdfs dfsadmin -report 查看hdfs的各節(jié)點(diǎn)狀態(tài)信息
bin/hdfs haadmin -getServiceState nn1 獲取一個(gè)namenode節(jié)點(diǎn)的HA狀態(tài)
sbin/hadoop-daemon.sh start namenode 單獨(dú)啟動(dòng)一個(gè)namenode進(jìn)程
./hadoop-daemon.sh start zkfc 單獨(dú)啟動(dòng)一個(gè)zkfc進(jìn)程