一、修改配置文件
hdfs-site.xml
<configuration>
<!--NameNode元数据存储目录-->
<property>
<name>dfs.namenode.name.dir</name>
<value>"{{ data_dir }}/hadoop/hdfs/namenode"</value>
<final>true</final>
</property>
<!--DataNode数据存储目录-->
<property>
<name>dfs.datanode.data.dir</name>
<value>"{{ data_dir }}/hadoop/hdfs/data"</value>
<final>true</final>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>{{ host.host2 }}:50090</value>
</property>
<!-- 配置namenode的web界面-->
<property>
<name>dfs.namenode.http-address</name>
<value>{{ host.host1 }}:50070</value>
</property>
<!-- 配置副本数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- ###############下面为开启HA配置############### -->
<!-- HDFS逻辑名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 使用逗号分隔的名称节点 ID 列表进行配置。数据节点将使用它来确定集群中的所有名称节点。 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 设置名称节点进程的完整地址和 IPC 端口 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>{{ host.host1 }}:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>{{ host.host2 }}:8020</value>
</property>
<!-- NameNode 的 HTTP 服务器设置地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>{{ host.host1 }}:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>{{ host.host2 }}:9870</value>
</property>
<!-- 配置提供共享编辑存储的 JournalNode 的地址 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://{{ host.host1 }}:8485;{{ host.host2 }}:8485;{{ host.host3 }}:8485/mycluster</value>
</property>
<!-- 配置 DFS 客户端将使用的 Java 类的名称,以确定哪个 NameNode 是当前活动节点 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置 DFS 客户端将使用的 Java 类的名称,以确定哪个 NameNode 是当前活动节点 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 存储 JN 使用的编辑和其他本地状态 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>{{data_dir }}/hadoop/hdfs/journalnode/</value>
</property>
<!-- 阻止安全模式名称节点变为活动状态 -->
<property>
<name>dfs.ha.nn.not-become-active-in-safemode</name>
<value>true</value>
</property>
<!-- 配置自动故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
core-site.xml
<configuration>
<!-- 配置HDFS运行时临时数据路径到持久化目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>"{{ data_dir }}/hadoop/tmp"</value>
<description>Abase for other temporary directories.</description>
</property>
<!--默认的文件系统名称,HDFS访问地址-->
<!-- <property>
<name>fs.defaultFS</name>
<value>hdfs://{{ host.host1 }}:9000</value>
</property> -->
<!-- 下面两项为开启HA需要的配置 -->
<!-- 开启HA后的NN访问地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://{{ NamenodeserviceId }}</value>
</property>
<!-- Zookeeper集群地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>{{ host.host1 }}:2181,{{ host.host2 }}:2181,{{ host.host3 }}:2181</value>
</property>
<!--配置所有节点的root用户都可作为代理用户-->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<!--配置root用户能够代理的用户组为任意组-->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<!--配置root用户能够代理的用户为任意用户-->
<property>
<name>hadoop.proxyuser.root.users</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hdfs.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hdfs.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.hosts</name>
<value>*</value>
</property>
</configuration>
二、格式化
1、启动所有 JournalNode 集群,所有JN节点执行,用于同步两个 HA 名称节点的磁盘元数据
hdfs --daemon start journalnode
2、主节点格式化并启动 NameNode
hdfs namenode -format
hdfs --daemon start namenode
格式化执行结果:
3、备节点格式化并启动 NameNode
hdfs namenode -bootstrapStandby #将 NameNode 元数据目录的内容复制到另一个未格式化的 NameNode
hdfs --daemon start namenode
4、现在访问两个HFDFS的web页面内,查看都是standby状态
5、手动指定active节点
hdfs haadmin -transitionToActive nn1
查看状态已变更
[root@ky10sp2-wnc-test01 sbin]# hdfs haadmin -getServiceState nn1
active
[root@ky10sp2-wnc-test01 sbin]# hdfs haadmin -getServiceState nn2
standby
6、在maser1上格式化zookeeper,将在 ZooKeeper 中创建一个 znode,自动故障转移系统在其中存储其数据
hdfs zkfc -formatZK
执行结果:
7、在master1上初始化共享编辑日志
需要先停止NameNode,且
hdfs namenode -initializeSharedEdits
# 该命令将使用本地 NameNode 编辑目录中的编辑数据初始化 JournalNodes
执行过程需要确认
执行结果
问题处理
问题1:JN存储目录不为空
进入JN数据目录,删除所有文件,再次进行格式化
[root@ky10sp2-wnc-test03 ~]# cd /data/hadoop/hdfs/journalnode/mycluster
[root@ky10sp2-wnc-test03 mycluster]# rm -rf ./*