如下图 单节点故障问题 就是老大只有一个 一旦老大挂掉了 服务就结束了 如果NameNode挂掉后 其他节点也无法使用
那么2.x
多了这么一个 Quorun-based Storage Share Data 是 共享日志的存储
ZKFC是Zookeeper的失败控制转移器
Health Monitor,Failover 是健康监控
就是说吧 先看左边 的NameNode是Active状态 ZKFC监控着NameNode 如果 NameNode不健康了
就转移到右边的准备状态的的NameNode
就是左边的坏了没关系 右边的还能继续提供服务
即用QJM的方式快速搭建HA hdfs的集群
1.Hdfs的ha配置
namenode弄两个
jouranlnode奇数个
现在开始弄了
第一步 如果你开了集群 先停止掉 stop-all.sh
然后要备份一下 万一以后有什么需要用到普通集群了 所以需要备份
mv /usr/local/hadoop-2.7.1/ /usr/local/hadoop-2.7.1_bak
(这里使用了mv 直接移动了 改了名字 做成了备份 然后吧
重新解压hadoop安装包 重新安装了
我觉得吧 肯定是视频上忘了copy 这个东西 哈哈 不过只能跟着做 谁让咱不会呢)
记住是三个机子的hadoop都要移动备份
第二步 然后重新解压在home下的hadoop安装包(在hadoop01下进行)
tar -zxvf /home/hadoop-2.7.1.tar.gz -C /usr/local/
别忘了大C
进入hadoop目录 删除doc文件 便于发送
这里我们使用notepad++的插件操作
使用的插件名为NppFTP 至于怎么安装
然后点击这个 再点击Profile Setting 然后新建一个
连接hadoop01
然后连接一下
上图右上角就是hadoop01的根目录
找到local下面的usr下面的hadoop-2.7.1安装目录 etc下面的hadoop的配置文件
在修改之前注意右下角的编码格式
要改成utf-8
最上面菜单栏有调编码的一栏
总共配置4个文件
①先修改hadoop-env.sh
查找jdk目录修改
改成这个
这样第一个文件就修改好了
②core-site.xml
<!--配置hdfs文件系统的命名空间-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://qf</value>
</property>
<!--配置操作hdfs的缓存大小-->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--配置临时数据存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hahadoopdata/tmp</value>
</property>
<!-- 指定zk的集群地址 用来协调namenode的服务 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
以前配hdfs不是写的hadoop01吗 这里写qf是因为到时候01 02 不一定用的哪一个 所以写一个虚拟的qf名
③hdfs-site.xml
这里有个错误 不要急着复制上 看看下面测试启动上传文件部分 写出来了 改了之后再复制
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
这个网址有相关内容
<!--副本数 也叫副本因子 不是容错嘛-->
<!--副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--块大小_hadoop2_128M_hadoop1_64M_hadoop3.0_256M-->
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>
<!--hdfs的元数据存储位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hahadoopdata/dfs/name</value>
</property>
<!--hdfs的数据存储位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hahadoopdata/dfs/data</value>
</property>
<!--指定hdfs的虚拟服务名-->
<property>
<name>dfs.nameservices</name>
<value>qf</value>
</property>
<!--指定hdfs的虚拟服务名下的namenode的名字-->
<property>
<name>dfs.ha.namenodes.qf</name>
<value>nn1,nn2</value>
</property>
<!--指定namenode的rpc内部通信地址-->
<property>
<name>dfs.namenode.rpc-address.qf.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.qf.nn2</name>
<value>hadoop02:8020</value>
</property>
<!--指定namenode的web ui界面地址-->
<property>
<name>dfs.namenode.http-address.qf.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.qf.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定jouranlnode数据共享目录 namenode存放元数据信息的Linux本地地址 这个目录不需要我们自己创建-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/qf</value>
</property>
<!--指定jouranlnode本地数据共享目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hahadoopdata/jouranl/data</value>
</property>
<!-- 开启namenode失败进行自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--指定namenode失败进行自动切换的主类 datanode存放用户提交的大文件的本地Linux地址 这个目录不需要我们自己创建-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--防止多个namenode同时active(脑裂)的方式 采用某种方式杀死其中一个-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
跟视频中不一样的地方
视频中使用9000这个端口
④slaves
添加三个主机名
这样ha就配置完成(hadoop01)的
然后我们看一下再说
有内容 感觉没啥问题 保存退出wq
然后最后一步
分发 到02 03的机子上
scp -r ../hadoop-2.7.1 hadoop02:/usr/local/
scp -r ../hadoop-2.7.1 hadoop03:/usr/local/
这样之后 我们开始做免登陆的配置
之前我们做了01到01 02 03 的免登陆
现在我们做 02 到 01 02 03的 因为现在02也有老大namenode了
在02下 输入这个 然后一直回车 直至出现图案
ssh-keygen -t rsa
然后
登录 ssh hadoop02 是需要输入密码的
exit退出
输入这句话 ssh-copy-id hadoop02 输入yes 再输入密码
ssh hadoop02 再登录 不需要输入密码
exit 退出
同样的方法 设置01 03 免登陆(在02下)
输入这句话 ssh-copy-id hadoop01输入yes 再输入密码
ssh hadoop01 再登录 不需要输入密码
exit 退出
输入这句话 ssh-copy-id hadoop03 输入yes 再输入密码
ssh hadoop03 再登录 不需要输入密码
exit 退出
这样 到此为止
免登陆 配置完了
四个文件配置完了
然后就是 这里我们已经发送了 先发送的(就是上面的scp)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a9da5e1d14f7fe08c0cf7a9a4bf6bde3.png)
现在我们按照顺序执行 启动
①
先启动zk zkServer.sh
三台都要启动
然后jps查看服务是否启动 QuorumPeerMain
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9bc6109bd2b4fde787ed9d4dd54427f1.png)
②启动journalnode服务 我们使用多个服务一次启动
hadoop-daemons.sh start journalnode
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c7a1402f8b3fec53c76f0723de283696.png)
jps会显示journalnode进程服务
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fbed91014ae1baa57bd01ff1135bbcd7.png)
③
挑选01 02 任意一台格式化 然后启动namenode
这里我们选02
hdfs namenode -format
格式化后会创建下图这个文件夹 我们在配置文件里写的那个
而且下面是有东西的
然后单个启动namenode
hadoop-daemon.sh start namenode
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3c3c1a813669399f4254eb30b3617a6e.png)
④
在另外一台namenode的机子上拉取元数据 (也可以使用复制)
即在01上
hdfs namenode -bootstrapStandby
在执行这条命令之前 我们01是没有这个目录的
执行完成之后我们再看看 有了 这就代表拉取元数据成功
当然拉取也行 你要是直接将目录copy过来也行
⑤
格式化zkfc
我们在01下登录 zkCli.sh
然后ls /
结果发现还有别的 我们先删掉rmr 吧 只留下zookeeper这一个根节点就行
然后我们在02下 格式化 记得先登录zkCli.sh
hdfs zkfc -formatZK
执行前后对比
多了一个hadoop-ha节点
该节点下面还有qf
qf下面没有东西 启动之后就有东西了
⑥
启动
start-dfs.sh
这样我们看到
01
02
03
我们看到01 02都是5个服务(01多了个ZookeeperMain是因为我连接着notepad++还没断开)
03是三个
⑦
测试
一 先看对应的进程是否对 (就是上面的jps后看 已经完成)
二 再看web ui是否正常
192.168.37.111:50070
112
即hadoop02
是active的
三 在hdfs读写文件
在这里我遇到了一个问题
如下图 就是告诉我qf这个虚拟主机名出问题了
导致hdfs 等这一系列命令不可用
那咋办 我重新2倍速回看了安装的那个视频
发现我有个地方(是配置文件hdfs-site.xml文件)有个没有改成qf还是官网上的mycluster
难受
这样我就重新 一个一个01 02 03 改了三个地方vi /usr/local/hadoop-2.7.1/etc/hadoop/hdfs-site.xml
再次使用hdfs的相关命令就好了
首先 hdfs dfs -ls /
查看hdfs根目录下是否有东西
是没有东西的
然后我们将home下的一个文件上传到hdfs上
hdfs dfs -put /home/shell/if.sh /
我们查看web网页的 已经上传了
我们在03 即小弟下面查看
hdfs dfs -cat /if.sh
四 然后制造一个namenonde失败 关闭即可 查看是否能自动切换
就是杀死02的namenode的进程
先用jps查看02的namenode进程的前边的号
然后使用kii -9 号码
杀死进程
然后我们看web
02刷新后不能访问
01由standby变为active
这样一个老大挂掉了还能有另外一个老大顶上
我们再次使用小弟查看文件
仍然能查看 运行正确
然后我们如果发现02异常了 启动02的namenode
hadoop-daemon.sh start namenode