环境:三台虚拟机,centos7,hadoop2.9.2,zookeeper3.4
1、zookeeper集群
2、hadoop-env配置java_home路径(每个节点都要配置为这个节点所在及其的java home路径)
3、配置core-site.xml
<!-- hdfs集群使用名称为mycluster的集群,在hdfs-site中配置的nameservices -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/data/hadoopData</value>
</property>
<!-- 指定zookeeper地址,HA机制下,在zookeeper中记录哪个是active节点 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>local1:2181,local2:2181,local3:2181</value>
</property>
4、配置hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--hdfs的集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- mycluster有哪些namenode节点,这里为nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>local1:8020</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>local2:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>local1:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>local2:50070</value>
</property>
<!-- 指定NameNode的元数据放在哪些机器的journalnode上,数据会放在下面指定的edits.dir下的mycluster目录下 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://local1:8485;local2:8485;local3:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/root/data/journalnodeData</value>
</property>
<!-- 配置隔离机制方法,即防止脑裂的机制,也可以指定自己的脚本实现防止脑裂的机制,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--关闭权限检查,也就是说任何用户都可以操作hdfs的文件了,如果不关闭,那么用户a是不能操作用户b的文件的-->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
namenode的ha由专门的zkfc进程进行失败处理,而yarn没有专门的进程进行处理,
而是把reourcemanager的状态信息写到zookeeper上,当nodemanager要与resourcemanager交互时,状态为standby的resourcemanager会把交互信息转发给active节点
5、配置mapred-site(和伪分布式一样,这个可没有什么高可用户需要配置)
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--配置历史服务器的信息,mr-jobhistory-daemon.sh start historyserver启动历史服务器会根据该配置启动-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>local1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>local1:19888</value>
</property>
6、配置yarn-site
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--任务历史服务器的地址,配置在mapred-site中,这里表示使用这个地址的历史服务器-->
<property>
<name>yarn.log.server.url</name>
<value>http://local1:19888/jobhistory/logs</value>
</property>
<!--日志保留时间-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM高可用集群的集群id(集群名称) -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<!-- yarn的RM集群的节点的名称 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM名称对应节点的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>local2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>local3</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>local1:2181,local2:2181,local3:2181</value>
</property>
<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定rm的状态信息存在zookeeper集群中-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>local2:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>local3:8088</value>
</property>
7、配置slaves文件
local1
local2
local3
namenode所在机器的slaves应该写所有datanode机器的地址。
resourceanager所在机器的slaves应该写所有nodemanager机器的地址。
为什么这么做?请继续往后看:
8、解释原因
(1)start-dfs.sh脚本执行时,会通过hdfs-site配置文件中获取namenode的地址信息,然后启动HA集群中所有namenode节点,
然后远程启动当前机器的slaves文件的地址对应机器上的的datanode。
(2)start-yarn.sh脚本执行时,只会启动本机的resourcemanager,然后远程启动当前机器的slaves文件的地址对应机器上的的nodemanager,
(如果执行start0-yarn.sh脚本的机器上的配置文件中配置的RM并不在本机上,那么该脚本只会远程启动slaves中配置的的机器上的nodemanager)
启动另一台机器上的resourcemanager还需要到那台及其上活动使用yarn-dea.... start resourcemanager 手动启动,不像hdfs一样,用start-dfs.sh就可以全部启动。
一般情况下,datanode和nodemanager是一对一存在同一台机器上的,即local1有一个datanode,那么就会有一个nodemanager,local2、local3也是如此,有datanode就会有一个nodemanager。
所以namenode的机器与resourcemanager的机器的slaves文件的内容应该是一样的。
9、配置文件写完了,接下来就是启动了
(1)在namenode机器和RM所在的机器上配置SSH分别对datanode和nodemanager节点机器的免密登录。。这个百度上很多,也可以看我的其他博客。
(2)将上面的配置每个节点都复制一份
(3)启动zookeeper集群。
(4)启动历史服务器,历史服务器配置在mapred-site中。单点非集群的
mr-jobhistory-daemon.sh start historyserver
(5)启动journalnode,配置文件中在local1、local2、local3都配置了一个journalnode
所以在三台机器上都执行hadoop-daemon.sh start journalnode启动节点。
(6)格式化HDFS(如果只是重启了,以前格式化过,这步应该省略,如果不省略,一定再执行一次这个命令的话, 则要注意删除以下几点中创建的文件)
2.7.1#在weekend01上执行命令:
hdfs namenode -format
该命令就是创建namenode记录的数据文件夹,在配置文件中配置的本地目录创建fsimage等信息,在journalnode创建存储edits log文件的相关文件夹
(注意,如果以前格式化过,那么需要把journalnode下的namenode数据清除,这里是5、6、7三台的journalnode目录下删除ns1文件夹)
格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,像fsimage镜像文件就在这里面,
为了两台namenode的fsimage从一开始就一样,所以需要从local1拷贝到local2上,如下:
《1》此时在local1上使用hadoop-daemon.sh start namenode 单独启动该机器上的namenode,
然后在local2上执行hdfs namenode -bootstrapStandby,这时local2也会从local1拷贝上面的格式化数据,
如果不先启动local1的namenode,那么hdfs namenode -bootstrapStandby是无法拉取到格式化数据的。
这样local2也算是格式化完成了。和local1的namenode数据一致。
《2》停掉local1的namenode
(7)格式化ZKFC(如果只是重启了,以前执行过,这步应该省略。如果不是则继续,在local1上执行即可,会自动读取配置文件,然后分别远程执行其他机器的脚本),就是格式化一下zookeeper的一些hadoop ha的数据,不启动进程
hdfs zkfc -formatZK
(8)启动hdfs
start-dfs.sh 会启动所有namenode和datanode
(9)启动yarn
在一个rm节点上执行start-yarn.sh,此时会启动本节点上的RM和所有nodemanager,但不会启动HA机制的另一个RM,另一个RM需要手动启动。
在另一个RM节点机器上yarn-daemon.sh start resourcemanager