这两天整理了一下原来写的各种文档,准备陆陆续续全部写成博客,以防文档丢失,第一篇,使用zookeeper来实现Hadoop的高可用
此处有三台主机,规划如下:
主机名 | P地址 | 运行进程 |
---|---|---|
hadoop | 192.168.201.243 | NameNode、ResourceManager、JournalNode、QuorumPeerMain、DFSZKFailoverController |
slave1 | 192.168.201.242 | NameNode、DataNode、ResourceManager、NodeManager、DFSZKFailoverController、JournalNode、QuorumPeerMain |
slave2 | 192.168.201.241 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
zookeeper使用3.4.5版本,首先进行解压:
tar -xzvf zookeeper-3.4.5.tar.gz -C ~/software/zk/
对zookeeper进行配置,进入conf目录,复制zoo_sample.cfg一份 改名为zoo.cfg
cd ~/software/zk/conf
cp zoo_sample.cfg zoo.cfg
配置dataDir
dataDir=/home/hadoop/software/zookeeper-3.4.5/data
配置集群列表,添加到文件末尾
server.1=hadoop:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
给每个JourNode(配置的dataDir目录下)创建一个myid文件,里面内容是server.N中的N
echo "1" > myid
将zookeeper拷贝到其它主机上
scp -r ~/software/zk/ slave1:/home/hadoop/software/
scp -r ~/software/zk/ slave2:/home/hadoop/software/
修改myid中的值,然后分别启动zookeeper
./bin/zkServer.sh start
最后,分别查询zookeeper的状态
./bin/zkServer.sh status
输出:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Mode:follower/leader
Hadoop使用zookeeper来实现高可用,其中主备切换机子上运行DFSZKFailoverController进程,进程会对NameNode状态进行监控,如果Active节点宕机,则standby节点进程会出发fencing机制,会给Active节点发送ssh远程指令杀掉Namenode,如果未接到返回值还会执行用户自定义的脚本程序。
NameNode节点的fsimage内容相同,edits内容会存放到JournalNode上,JournalNode依赖zookeeper实现高可用。同时,主备NameNode可以组成nameservice,这个就是Hadoop federation机制。
配置:
core-site.xml
fs.defaultFS
hdfs://ns1
hadoop.tmp.dir
file:/home/hadoop/software/hadoop-2.6.0/data/tmp/
ha.zookeeper.quorum
hadoop:2181,slave1:2181,slave2:2181
配置hdfs-site.xml文件
hdfs-site.xml
dfs.nameservices
ns1
dfs.ha.namenodes.ns1
nn1,nn2
dfs.namenode.rpc-address.ns1.nn1
hadoop:8020
dfs.namenode.http-address.ns1.nn1
hadoop:50070
dfs.namenode.shared.edits.dir
qjournal://hadoop:8485;slave1:8485;slave2:8485/ns1
dfs.journalnode.edits.dir
/home/hadoop/software/hadoop-2.6.0/journaldata
dfs.ha.automatic-failover.enabled
true
dfs.client.failover.proxy.provider.ns1
org.apache.hadoop.hdfs.server .namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
shell(/bin/true)
dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa
dfs.ha.fencing.ssh.connect-timeout
30000
dfs.replication
3
dfs.namenode.name.dir
file:/home/hadoop/software/hadoop-2.6.0/data/name/
dfs.datanode.data.dir
/home/hadoop/software/hadoop-2.6.0/data/data/
dfs.permissions
false
配置mapred-site.xml
mapreduce.framework.name
yarn
配置yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
wls
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
hadoop
yarn.resourcemanager.hostname.rm2
slave1
yarn.resourcemanager.zk-address
hadoop:2181,slave1:2181,slave2:2181
修改slaves文件
slave1
slave2
其中的ssh无密码登陆、jdk安装等步骤不再赘述。
首先启动journalnode
hadoop-daemon.sh start journalnode
对NameNode进行格式化
hdfs namenode -format
hdfs namenode -bootstrapStandby #在standby namenode上执行此命令
# 格式化ZKFC
dfs zkfc -formatZK
start-dfs.sh
start-yarn.sh