Hadoop:HA模式配置与实现

写的不到位的地方,欢迎评论指出不足之处

一、检查系统环境

        1、HostName、Hosts、JDK、SSH、网络、防火墙、数据源

一、集群角色分配表

        注:这只是实例

服务器
NameNode NameNode Zookepper FailoverController DataNode Zookepper JournalNode
One yes (NN2和其它节点免密)

yes

yes

Two

yes

(NN1和其它节点免密)

yes

yes

yes

yes

Three

yes

yes

yes

Four

yes

yes

二、解压软件

        1、Hadoop、ZooKeeper 软件解压在了 /opt

        2、所有节点上的所有角色数据,都在 /var/hadoop/ha/dfs 目录下(每个节点都一样)

        注:配置的内容只要对,什么形式,大伙随意 

三、配置相关文件

        1、hadoop下的 core-site.xml

<!-- mycluster 配置一个服务逻辑名称 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://myHA</value>
</property>

<!-- 配置 zookeeper 主机名:端口号,以逗号隔开 -->
<property>
   <name>ha.zookeeper.quorum</name>
   <value>two:2181,three:2181,four:2181</value>
</property>

        2、hadoop下的 hdfs-site.xml

<property>
  <name>dfs.nameservices</name>
  <value>myHA</value>
</property>

<!-- 
  为一对多的节点起逻辑名称,用逗号 隔开
  hadoop2.x支持2个 ,hadoop3.x支持5个
-->
<property>
  <name>dfs.ha.namenodes.myHA</name>
  <value>nn1,nn2</value>
</property>

<!-- 为每个节点配置对应的主机名 + 端口号,进行物理映射 -->
<property>
  <name>dfs.namenode.rpc-address.myHA.nn1</name>
  <value>one:8020</value>
</property>
<property>
  <name>dfs.namenode.http-address.myHA.nn1</name>
  <value>one:50070</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.myHA.nn2</name>
  <value>two:8020</value>
</property>
<property>
  <name>dfs.namenode.http-address.myHA.nn2</name>
  <value>two:50070</value>
</property>

<!-- 
  共享 EditLog 
  配置 JNode 协议 ,多个节点用分号隔开,指向服务,服务一对多的方式,给到对应的 NameNode
-->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://one:8485;two:8485;three:8485/myHA</value>
</property>
<!-- 
  配置 JNode 数据位置
-->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/var/hadoop/ha/dfs/jnode</value>
</property>

<!-- ha切换 NameNode 主从时命令发给哪个实现类去实现 -->
<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name> 
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 
  如何发出信息的
  SSH免密(企业不直接使用 root )
-->
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value> <!-- 定义免密 -->
</property>
<property>
   <!-- 使用私有密钥,那么配置SSH免密时,就需要使用私有密钥 -->
   <name>dfs.ha.fencing.ssh.private-key-files</name> 
   <!-- 密钥物理位置 -->
   <value>/root/.ssh/id_rsa</value>
</property>

<!--
  默认false,配置true
  true:当NameNode启动时,自动启动ZKFC
 -->
<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
</property>

        3、hadoop下的 slaves

two
three
four

        4、配置 zookeeper

cd /opt/apache-zookeeper-3.5.9-bin/conf
# 将 zoo_sample.cfg 复制改名 zoo.cfg

#dataDir=/tmp/zookeeper                # 原本的样子
dataDir= /var/hadoop/ha/dfs/zk         # 修改 ZK 的数据目录

# 追加,server. (1、2、3)可随意写,只要保证是唯一即可,使用过半选举
# 由于zk有两状态(无主、有主),因此两端口号,各干各的事
server.1=two:2888:3888
server.2=three:2888:3888
server.3=four:2888:3888
# clientPort=2181                      #无需修改,这个端口是为了客户端连接通信时使用

        5、配置 zookeeper 权重,权重的目录需要自己创建,其它配置的目录会自动创建

# 在相应的 zookeeper 节点的目录下,加权重
# 权重内容要与配置文件一样
# 每个节点都要加,不要重复
# 1、2、3
echo 1 >  /var/hadoop/ha/dfs/zk/myid

        6、配置环境变量

vim /etc/profile

export JAVA_HOME=/usr/java/default
export HADOOP_HOME=/opt/hadoop-2.10.1
export ZOOKEEPER_HOME=/opt/apache-zookeeper-3.5.9-bin
export PATH=$PATH:${JAVA_HOME}/bin:$HADOOP_HOME/bin
:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

        7、将配置好的软件,使用 SSH 发送到相应的服务器上,根据角色配置表,进行发送,ZK一定要记得

        注:配置文件中调用的是 SSH 的私钥,所以将私钥发送对相关节点免密文件中

        8、第一次启动,格式化

主控节点,选在one的带NN的服务器上,(具体随意)

1、# (主控节点上)生成 QuorumPeerMain 进程,在相应的节点启动 ZK
zkServer.sh start

2、# (主控节点上)生成 JournalNode 进程,在相应的节点启动 JN
hadoop-daemon.sh start journalnode

3、# (主控节点上)多个NN,选一个NN节点,进行格式化
hdfs namenode -format

4、# (主控节点上)启动NN(主) / namenode 换 zkfc 就是单独启动zkfc
hadoop-daemon.sh start namenode

5、# (副NN节点上)其它 NN (副)启动时同步数据
hdfs namenode -bootstrapStandby

6、# (主控节点上)进行ZK格式化 
hdfs zkfc -formatZK

7、# 启动服务
start-dfs.sh

上一篇:hdfs写入流程


下一篇:大数据-hadoop-NameNode格式化注意事项