参考的Hadoop官网
具有QJM的NameNode HA_Hadoop 中文网https://hadoop.org.cn/docs/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html从我完全分布式过来的同学,现在已经有了四台搭建了完全分布式的四台虚拟机
如果没有看过,请参照下文搭建!我们接下来的HA(高可用模式)是基于我们完全分布式的补充
先说一下此篇文章各个节点的角色
NameNode DataNode zookeeper journalNode zkfc
node01 * * *
node02 * * * * *
node03 * * *
node04 * *
环境:
1.已经搭好完全分布式的四台虚拟机
2.zookeeper-3.4.6.tar.gz
1.背景
在Hadoop 2.0.0之前,NameNode是HDFS集群中的单点故障(SPOF)。每个群集只有一个NameNode,并且如果该计算机或进程不可用,则整个群集将不可用,直到NameNode重新启动或在单独的计算机上启动。
这从两个方面影响了HDFS群集的总可用性:
如果发生意外事件(例如机器崩溃),则在操作员重新启动NameNode之前,群集将不可用。
计划内的维护事件,例如NameNode计算机上的软件或硬件升级,将导致群集停机时间的延长。
HDFS高可用性功能通过提供以下选项来解决上述问题:在具有热备用功能的主动/被动配置中,可以在同一群集中运行两个(自3.0.0起,超过两个)冗余NameNode。这可以在计算机崩溃的情况下快速故障转移到新的NameNode,或出于计划维护的目的由管理员发起的正常故障转移。
概念补充:
主从模式:一个主,多个从。主用于读写,从用于读,如果访问从节点想要写数据,那么从节点会转给主节点,让它进行写
主备模式:“养兵千日,用兵一时”,没错,就是先备着一台主机,当主的备胎,等主挂掉了之后,备机才会被使用,在这之前只是让其与主的数据同步,不会对其进行使用。
两者区别:根本区别,一个不养着,直接使用;另外一个,等到主挂了之后,才进行使用。
2.ssh免密node01,node02
node02:
cd ~/.ssh
ssh-keygen -t dsa -P '' -f ./id_dsa
cat id_dsa.pub >> authorized_keys
scp ./id_dsa.pub node01:`pwd`/node02.pub
node01:
cd ~/.ssh
cat node02.pub >> authorized_keys
3.zookeeper集群的搭建
node02~node04
node02:
(1)安装zookeeper : tar -zxvf zookeeper...(版本号自己添加,本文章使用3.4.6版本)
(2)将zookeeper移动到 /opt/poke/bigdata中 : mv zookeeper... /opt/poke/bigdata
(3)cd /opt/poke/bigdata/zookeeper../conf
(4)cp zoo_sample.cfg zoo.cfg
(5)vi zoo.cfg
(6)创建一个和上图datadir对应的目录 :mkdir /var/poke/bigdata/hadoop/zk
(7)设置myid 对应上图的server.x :x为myid的数值,echo 1 > /var/poke/bigdata/hadoop/zk/myid
(8)修改/etc/profile:
source /etc/profile
(9)将zookeeper拷给node03 04
cd /opt/poke/bigdata
scp -r ./zookeeper-3.4.6 node03:`pwd`
scp -r ./zookeeper-3.4.6 node04:`pwd`
node03:
mkdir /var/poke/bigdata/hadoop/zk
echo 2 > /var/poke/bigdata/hadoop/zk/myid
配置/etc/profile
source /etc/profile
node04:
mkdir /var/poke/bigdata/hadoop/zk
echo 3 > /var/poke/bigdata/hadoop/zk/myid
配置/etc/profile
source /etc/profile
最后,打开node02-node04的zookeeper
zkServer.sh start
4.修改hadoop的相关配置
cd $HADOOP_HOME/etc/hadoop
core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property><property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/var/poke/bigdata/hadoop/ha/dfs/name</value>
</property><property>
<name>dfs.datanode.data.dir</name>
<value>/var/poke/bigdata/hadoop/ha/dfs/data</value>
</property><property>
<name>dfs.namenode.secondary.http-address</name>
<value>node02:50090</value>
</property><property>
<name>dfs.namenode.checkpoint.dir</name>
<value>/var/poke/bigdata/hadoop/ha/dfs/secondary</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>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/poke/bigdata/hadoop/ha/dfs/jn</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<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_dsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
5.将node02的配置分发给node01,03,04
cd $HADOOP_HOME/etc
scp -r hadoop node01:`pwd`
scp -r hadoop node03:`pwd`
scp -r hadoop node04:`pwd`
6.初始化与启动
参照前面的各个节点角色表
(1)先启动JN (node01,02) hadoop-daemon.sh start journalnode
(2)选择一个NN 做格式化(node01或者node02):hdfs namenode -format
(3) 启动这个格式化的NN ,以备另外一台同步 hadoop-daemon.sh start namenode
(4) 在另外一台机器中: hdfs namenode -bootstrapStandby(另一台备用namenode输入这个命令)
(5) 格式化zk(node01): hdfs zkfc -formatZK <只有第一次搭建做,以后不用做>
(6) 开启服务(node01):start-dfs.sh
7.结果与验证(这个自己去操作)
同学们如果感觉我的理解有误,请及时指出!
最后,写作不易,如果对您有帮助的话,请点个赞!