高可用的完全分布式搭建
HA HDFS结构图
这种设计模式的特点:
①采用了两个namenode,一个对外提供服务,一个同步备份namenode元数据以待切换,防止发生异常,导致namenode挂掉。
②所有的datenode同时向两个NameNode汇报数据块信息。
③JN集群用于备份传递ANN的信息和文件
④两个NN,启动时一个会处于activity,一个会处于standby状态
⑤处于standby状态的节点,用于备份和完成edits.log文件的合并,并产生新的image,推送回处于actiity状态的NN
两种切换模式
①手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
②自动切换:基于Zookeeper实现
Zookeeper自动切换方案
①ZooKeeper Failover Controller:监控NameNode健康状态
②并向Zookeeper注册NameNode
③NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active
JN权值分配
选举规则:大于半数以上,则获得选举权
HA HDFS配置节点表
集群搭建步骤
配置免密登录
node01->node01
node01->node02
node01->node03
node01->node04
node02->node01
配置所有节点的JDK
修改hdfs-site.xml配置文件
<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/sxt/hadoop/ha/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_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
修改core-site.xml配置文件
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/abc/hadoop/cluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03: 2181,node04:2181</value>
</property>
修改slaves配置文件
node02
node03
node04
将配置好的HDFS安装包拷贝到node02 node03 node04
格式化NameNode(创建目录以及文件)
① 在node01、node02、node03分别执行如下命令
hadoop-daemon.sh start journalnode
② 随机选择一台NameNode执行:
hdfs namenode -format
hadoop-daemon.sh start namenode
③ 另外一台NameNode节点执行:
hdfs namenode -bootstrapStandby
格式化ZKFC
hdfs zkfc -formatZK
关闭所有节点上的进程
stop-dfs.sh
启动HDFS
start-dfs.sh
搭建zookeeper集群
1,解压
2,修改conf目录下的zoo_sample.cfg的名称,改为zoo.cfg
mv zoo_sample.cfg zoo.cfg
3,修改zoo.cfg
dataDir=/var/zfg/zookeeper
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
4,在dataDir目录下创建一个myid文件,在这个文件中写上当前节点ID号
5,将配置好的zookeeper安装包拷贝到node03 node04
6,拷贝完毕后,在各自节点上创建myid号,ID号要依次递增