HA自动故障转移
主要是学习ha之前,肯定学过普通的hadoop,所以配置可以先在hadoop上复制一份
准备三台机器,hadoop102,hadoop103,hadoop104,首先先配好hadoop102上面的配置
再然后将环境变量中的HADOOP_HOME改成当前的的ha的路径,要不然就一直初始化的是之前的Hadoop 如:
改完之后,要source 一下环境变量的路径,也可以重启一下虚拟机,两者都可以
主要配hdfs-site.xml和core-site.xml,最后所有的配好之后,再配resourcemanager的高可用
首先配hdfs-site.xml,配置如下
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop102:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop103:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop102:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop103:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 如果使用sshfence,需要确保安装了psmisc -->
<!-- 这里配置了两个隔离方法,最后一个是确保隔离成功的临时写法 -->
<!-- 如果只写了sshfence,那么如果active的服务器挂掉之后,是没办法故障转移的,因为sshfence连不上active的服务器,隔离方法通不过,故障转移就执行不了 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/tg/.ssh/id_rsa</value>
</property>
<!--改成false就是可以手动配置ha,默认是false-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
然后配置core-site.xml
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/ha/hadoop-3.1.3/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 "自定义的姓名"-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/ha/hadoop-3.1.3/data/journalnode</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
<description>指定zookeeper地址</description>
</property>
</configuration>
配置完之后就可以将ha中的配置同步到另外的两台机器上,然后就可以对集群进行操作
1.hdfs --daemon start journalnode 在每台机器上启动journalnode
2.hdfs zkfc -formatZK 使用该命令前,需要在core-site.xml配置zookeeper集群,初始化zookeeper集群
3.hdfs namenode -format 进行集群的格式化,第一次执行这句命令应该不会报错,第二次执行该命令需要将每台机器上的 /tmp/hadoop/dfs/清空
成功初始化
执行该命令第二次会报的错
4.启动hadoop102上面的namenode hdfs --daemon start namenode
5.在hadoop103配置第二个namenode hdfs namenode -bootstrapStandby 同步nn1上面的数据
6.先关闭所有hadoop和zookeeper的进程
7.开启zookeeper进程
8.hdfs --daemon start zkfc 分别在两台机器上执行该命令启动nn1和nn2上面的zkfc
9.然后就可以使用hadoop102上的sbin/start-all.sh,就可以启动集群了
这是启动完集群后的所有进程,如果没有配置resourcemanager的高可用hadoop103就会少一个resourcemanager的进程
最后一步就是配置resourcemanager,只要改yarn-site.xml就可以了 配置如下:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--启用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--声明HA resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<!-- 指定RM的逻辑列表 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定rm1 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop102</value>
</property>
<!-- 指定rm1的web端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop102:8088</value>
</property>
<!-- =========== rm1 配置============ -->
<!-- 指定rm1的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop102:8032</value>
</property>
<!-- 指定AM向rm1申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop102:8030</value>
</property>
<!-- 指定供NM连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop102:8031</value>
</property>
<!-- =========== rm2 配置============ -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop103</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop103:8088</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop103:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop103:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop103:8031</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
最后重启一下ha的集群,就可以看见hadoop102和hadoop103上面分别有一个resourcemanager