集群部署节点角色的规划(3节点)
server01 namenode resourcemanager zkfc nodemanager datanode zookeeper journal node
server02 namenode resourcemanager zkfc nodemanager datanode zookeeper journal node
server05 datanode nodemanager zookeeper journal node
hadoop-ha配置文件
1.core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
----两台(多台)namenode的组合,将在hdfs-site.xml中进行解释
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop-node-01/hadoop-2.7.1/hadoopdata</value>
----hadoop在本地的工作目录
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
----quorum(QuorumPeerMain),即zookeeper服务进程的名字
<value>hadoop-ndoe-01-server:2181,hadoop-node-02-server:2181,hadoop-node-03-server:2181</value>
----zookeeper的主机名和端口号(2181,即zookeeper接收客户端请求的端口号)
</property>
</configuration>
2.hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value> ----此处若配置多个,则是federation(联邦)
</property>
<!-- ns1下面有两个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>hadoop-node-01-server:9000</value>
----rpc通信所用的端口
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop-node-01-server:50070</value>
----http的端口,namenode打开监控管理网页的端口
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop-node-02-server:9000</value>
----rpc通信所用的端口
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop-node-02-server:50070</value>
----http的端口,namenode打开监控管理网页的端口
</property>
<!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-node-01-server:8485;hadoop-node-02-server:8485;hadoop-node-03-server:8485/ns1</value>
</property>
----也可配置在本地目录中(file///),8485是qjournal的工作端口,/ns1表示这个目录是给ns1这个nameservices用的
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop-node-01/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
----可自定义这个类,此程序用来创建zkfs(失败控制,老太监)
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true) ----配置两种zkfc防止“脑裂”的方式
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop-node-01/.ssh/id_rsa</value>
----此处配置私钥,zkfc发送ssh指令时需要私钥
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
----zkfc发送ssh指令时响应超时时间
</property>
</configuration>
3.mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.yarn-site.xml
<configuration>
<!--指定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>hadoop-node-01-server</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop-node-02-server</value>
</property>
<!--指定zk集群地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop-ndoe-01-server:2181,hadoop-node-02-server:2181,hadoop-node-03-server:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
----配置让nodemanager提供mapreduce的shuffle服务
</property>
</configuration>
修改slaves
hadoop-node-01-server
hadoop-node-02-server
hadoop-node-03-server
在datanode和nodemanager所在的机器配置
配置完成后将hadoop整个copy到其他的机器即可
HA集群的启动:严格按照下面启动步骤启动
1.启动zookeeper集群
分别在zookeeper集群的三台机器上执行/home/hadoop/zookeeper-3.4.6/bin/zkServer.sh start,
启动后jps出现进程ZooKeeper的进程QuorumPeerMain
/home/hadoop/zookeeper-3.4.6/bin/zkServer.sh status 查看三天机器的角色(leader或者follower)
2.启动journalnode
(由于journalnode需要依赖于ZooKeeper,故在ZooKeeper的三台机器部署了journalnode)
分别在三台机器执行hadoop-daemon.sh start journalnode分别启动journalnode,(或者在一台机器执行hadoop-daemons.sh start journalnode),
启动后jps出现journalnode的进程JournalNode
3.格式化zkfc(老太监)(在active的namenode的节点执行即可)
在一台机器上执行hdfs zkfc -formatZK
(格式化的过程其实就是在ZooKeeper中新注册新建一个新的节点,此处新建了/hadoop-ha/ns1,
以便运行集群时在里面存放namenode的信息——将namenode的主机地址存放在该节点上,
执行成功会出现 Successfully created /hadoop-ha/ns1 in ZK.)
4.格式化hdfs(在active的namenode的机器执行即可)
在一台机器上执行hdfs namenode -format
在hadoop-02-server上同步namenode的数据:\scp -r hadoopdata/ hadoop-02-server:/home/hadoop/hadoop-2.7.1
5.启动HDFS
active的namenode的机器上执行start-dfs.sh,此命令将启动hdfs、zkfc、qjournal
6.启动yarn
主resourcemanager的机器上执行start-yarn.sh,启动yarn
再在另一台需要启动resourcemanager的机器上执行yarn-daemon.sh start resourcemanager
HA集群测试:
hadoop-01-server:50070 打开hdfs的namenode的监控页面(active)
hadoop-02-server:50070 打开hdfs的namenode的监控页面(standby)
hadoop-01-server:8088 打开yarn的进程监控页面
hadoop-02-server:8088 打开yarn的进程监控页面
(JournalNodes介绍:两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改
时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。
standby可以确保在集群出错时,命名空间状态已经完全同步了。这些NameNode之间通过共享数据,保证数据的状态一致。多个NameNode之间共享数据,可以通过
Nnetwork File System或者Quorum Journal Node。前者是通过linux共享的文件系统,属于操作系统的配置;后者是hadoop自身的东西,属于软件的配置)
(Secondary NameNode:在HA集群中,standby状态的NameNode可以完成checkpoint操作,因此没必要配置Secondary NameNode、CheckpointNode、BackupNode。
如果真的配置了,还会
报错。)