集群部署节点角色的规划(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。 如果真的配置了,还会 报错。)