在完全分布式集群基础上修改,共三台结点
配置文件
需要修改两个配置文件
core-site.xml
<configuration>
<property>
#这里的hadoopHA是自定义的集群名称
<name>fs.defaultFS</name>
<value>hdfs://hadoopHA</value>
</property>
#下面两个配置还是保留完全分布式架构的配置
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
# 使用zookeeper管理的结点列表
<property>
<name>ha.zookeeper.quorum</name>
<value>num01:2181,num02:2181,num03:2181</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
# 下面一项可以不用修改
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
# 集群名称
<property>
<name>dfs.nameservices</name>
<value>hadoopHA</value>
</property>
# 设置高可用主副结点
<property>
<name>dfs.ha.namenodes.hadoopHA</name>
<value>nn1,nn2</value>
</property>
# 设置两个namenode的RCP通信地址
<property>
<name>dfs.namenode.rpc-address.hadoopHA.nn1</name>
<value>num01:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoopHA.nn2</name>
<value>num03:9000</value>
</property>
# 设置两个namenode的http通信地址
<property>
<name>dfs.namenode.http-address.hadoopHA.nn1</name>
<value>num01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoopHA.nn2</name>
<value>num03:50070</value>
</property>
# 指定namenode元数据在journalnode上的存放地址
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://num01:8485;num02:8485;num03:8485/hadoopHA</value>
</property>
# 配置隔离机制,同一时刻只能保有一个namenode对外通信
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
# 使用ssh无密钥登录
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
# 设置journalnode服务器存储目录
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/data/jn</value>
</property>
# 关闭权限检查
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
# 访问代理类: client, mycluster, active 配置失败自动切换实现方
式
<property>
<name>dfs.client.failover.proxy.provider.hadoopHA</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
# 设置自动故障切换
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
初始化
第一步:对全部结点操作:删除tmp和logs文件夹
第二步:对全部结点操作:启动journalnode:hadoop-daemon.sh start journalnode
第三步:主结点操作:初始化(操作前确认zookeeper服务开启):hdfs namenode -format
第四步:将初始化生成的tmp文件夹同步给副结点,有两种方式:
- 第一种:直接使用scp同步:scp -r tmp @主机名:$PWD
- 第二种:执行同步命令:hdfs namenode -bootstrapStandby
第五步:初始化zookeeper服务:hdfs zkfc -formatZK
第六步:启动DFSZK Failover Controller,现在哪台启动,哪台就是active结点:hadoop-daemon.sh start zkfc
第七步:启动hdfs服务:start-hdfs.sh
服务启动后可以看到,设置的主副结点都有namenode和DFSZKFailoverController服务
yarn配置
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>num01</value>
</property>
# 启动resourcemanager.ha
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
# 声明两台resourcemanager的地址
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>num01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>num03</value>
</property>
# 指定zookeeper集群地址
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>num01:2181,nu02:2181,num03: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>
</configuration>