本文是我学习Hadoop搭建过程中的各种笔记,内容来自于各种公开的教程,起点非常低,从Linux基础开始,直至在PC上搭建Hadoop成功,是真正的从零开始。
感谢过程中帮助我的各位认识的和不认识的老师。
50、Hdfs的ha介绍:
Hadoop集群1.X 单节点故障问题
ha是Hadoop集群的高可用
看图片可知,集群,一个NameNode管理3台DataNode;这样的集群存在着问题,一旦NameNode,hdfs的服务就停止对外提供服务,存在着单节点故障问题,老大只有一个;
SNN : SecondaryNameNode
衍生出下面的:
Hadoop集群2.X ,多了共享数据的存储和失败转移器
不再是一个NameNode,而是两个,一个是Active,另一个是Standby;
但是没有SecondaryNameNode,而多了一个Quorum-based Storage Share Data,这个是一个共享日志,共享数据的存储;
ZKFC :失败控制转移器
每个老大上面都有Health Monitor, Failover,健康老大的健康情况,NameNode (Active)坏了没关系,ZKFC离开切到另一个NameNode (Standby)上,由NameNode (Standby)继续提高服务;NameNode(Active)进行修复。
Zookeeper Cluster :进行监控
Hadoop 2.6 利用QJM 和 zookeeper 实现HDFS 高可用
HA: 7*24
高可用:每周7天,每天24小时都可用,不间断
前提说明apache cdh hdp
在hadoop2.X中通常有两个NameNode组成,一个处于Active状态,另一个处于Standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步 active namenode 的状态,以便能够在它失败时快速进行切换
Hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM(由cloudra提出,原理类似zookeeper),这里使用QJM完成。主备NameNode之间通过的是一组lournalNode同步元数据信息,一条数据只有成功写入,多数lournalNode即认为写入成功。通常配置奇数个lournalNode。
高可用做规划:
hdfs的HA
规划:
IP地址 |
主机名称 |
规划 |
192.168.216.111 |
hadoop01 |
namenode、datanode、jouranlnode、quroumPeerMani、zkf |
192.168.216.112 |
hadoop02 |
namenode、datanode、jouranlnode、quroumPeerMani、zkf |
192.168.216.113 |
hadoop03 |
datanode、jouranlnode、quroumPeerMani、kf |
在hadoop01和hadoop02上,分别启动5个进程,多了一个namenode;jouranlnode奇数个就行,一般三个.
免登陆:
老大和小弟之间:
hadoop01 --->hadoop01,hadoop02,hadoop03
hadoop02 --->hadoop01,hadoop02,hadoop03
连个老大之间:
hadoop02 < --- >hadoop01
解压配置环境变量
配置文件:
./etc/hadoop/hadoop-env.sh
./etc/hadoop/core-site.xml
./etc/hadoop/hdfs-site.xml
./etc/hadoop/slaves
配置前停止集群:stop-all.sh
[root@hadoop01 zookeeper-3.4.12]# stop-all.sh
停止集群的同时,进行备份,以免后面用到普通集群,解压从新来装:
mv/usr/local/hadoop-2.7.1/ /usr/local/hadoop-2.7.1_bak
克隆hadoop01,在克隆下的操作:
[root@hadoop01 ~]# mv /usr/local/hadoop-2.7.1/ /usr/local/hadoop-2.7.1_bak
同样的备份,分别在hadoop02,hadoop03上进行:
[root@hadoop02 ~]# mv /usr/local/hadoop-2.7.1/ /usr/local/hadoop-2.7.1_bak
[root@hadoop03 ~]# mv /usr/local/hadoop-2.7.1/ /usr/local/hadoop-2.7.1_bak
备份后,后面重新解压来装
51、Hdfs的ha配置:
此时which hadoop是没有的:
[root@hadoop01 zookeeper-3.4.12]# which hadoop
/usr/bin/which: no hadoop in (/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8.0_144//bin:/usr/local/hadoop-2.7.1//bin:/usr/local/hadoop-2.7.1//sbin:/usr/local/zookeeper-3.4.12//bin:/root/bin)
解压,在hadoop01下操作:
[root@hadoop01 zookeeper-3.4.12]# tar -zxvf /home/hadoop-2.7.1.tar.gz -C /usr/local/
[视频是Windows连接集群来配置]
修改env-site.xml
export JAVA_HOME=/usr/local/jdk1.8.0_144/
修改core-site.xml
[root@hadoop01 hadoop-2.7.1]# vi ./ect/hadoop/core-site.xml
<configuration>
<!—指定hdfs的命名空间--> 【虚拟的服务名】
<property>
<name>fs.defaultFS</name>
<value>hdfs://qf </value>
</property >
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hahadoopdata/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zk的集群地址,用来协调namenode的服务-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01.example.com:2181,hadoop02.example.com:2181,hadoop03.example.com:2181</value>
</property>
</configuration>
配置的文件,是可以在官网找到的,直接复制过来,即可,但是很难找到,都是一个字一个字输的,一点不一样,后面就不会识别,集群不成功。
修改hdfs-site.xml
[root@hadoop01 hadoop-2.7.1]# vi ./ect/hadoop/hdfs-site.xml
<configuration>
<!--配置副本数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--块大小-->
<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>
<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的内部通信地址-->
<property>
<name>dfs.namenode.rpc-address.qf.nn1</name>
<value>hadoop01:9000</value> 【或8020】【nn1启动在hadoop01上】
</property>
<name>dfs.namenode.rpc-address.qf.nn2</name>
<value>hadoop02:9000</value> 【nn2启动在hadoop02上】
</property>
<!--指定namenode的web ui通信地址-->
<property>
<name> dfs.namenode.http-address.qf.qf.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name> dfs.namenode.http-address.qf.qf.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定jouranlnode数据共享目录-->
<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/journal/data</value>
</property>
<!--开启namenode失败进行自动切换-->
<property>
<name> dfs.ha.automatic-failover.enabled </name>
<value>true</value>
</property>
<!--指定namenode失败进行自动切换的主类-->
<property>
<name> dfs.client.failover.proxy.provider.qf </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>
<configuration>
修改slaves (老大找小弟)
hadoop01
hadoop02
hadoop03
视频配置在图片上的地方修改,下面尝试在xshell中修改,没成功