HDFS命令操作和高可用 1.HDFS的命令行操作 2.HA 模式原理 3. 使用Zookeeper完成主备NN自动切换 4.联邦(解决内存受限) 5.HA 配置-搭建 6.Zookeeper操作

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

  • 查看所有HDFS的命令

    [root@node01 ~]# hdfs dfs #也可使用hadoop dfs
    
  • 创建HDFS的文件夹,如果父目录不存在,则创建(-p)

    • /user目录是用户父目录,用户名做子目录,、/user/root代表用户家目录
    • 如果使用hdfs shell 缺省hdfs路径的时候,使用该目录
    [root@node01 ~]# hdfs dfs -mkdir -p /user/root
    
  • 删除HDFS的文件夹,如果文件夹非空,则迭代删除(-r)

    • 注意:如果是上传到家目录(/user/root)或者删除家目录下的文件,则可以不指定上传路径
    [root@node01 ~]# hdfs dfs -rm -r /user
    
  • 删除root用户在HDFS上的家目录下的hello.txt

    • root用户的HDFS家目录为/user/root
    • 注意:如果是上传到家目录(/user/root)或者删除家目录下的文件,则可以不指定上传路径
    hdfs dfs -rm hello.txt 
    
  • 上传文件到家目录(/user/root)

    • 注意:如果是上传到家目录(/user/root)或者删除家目录下的文件,则可以不指定上传路径
    [root@node01 ~]# hdfs dfs -put ./myapps/hadoop-2.6.5.tar.gz /user/root
    #也可写为[root@node01 ~]# hdfs dfs -put ./myapps/hadoop-2.6.5.tar.gz
    

    HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

  • 将一个大小为2.4M的文件test.txt,按照文件block大小为1M的规则进行切割,并上传到家目录

    • 注意:如果是上传到家目录(/user/root)或者删除家目录下的文件,则可以不指定上传路径
    • 可以在/opt/hadoop_data/dfs/data/current/BP-893326395-192.168.223.101-1560264134076/current/finalized/subdir0/subdir0目录下查看切割后的块信息
    [root@node01 ~]# hdfs dfs -D dfs.blocksize=1048576 -put test.txt
    #也可写为[root@node01 ~]# hdfs dfs -D dfs.blocksize=1048576 -put test.txt /user/root
    

    HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

  • 上传文件到HDFS的家目录下,文件block副本数为3,文件block大小为1MB

    • 注意:每一个属性前面都要加一个-D
    hdfs dfs -D dfs.replication=3 -D dfs.blocksize=1048576 -put hello.txt /user/root
    

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

2.HA 模式原理

Hadoop 2.0产生背景

  • Hadoop 1.0中HDFS和MapReduce在高可用、扩展性等方面存在问题
  • HDFS存在的问题
    • NameNode单点故障,难以应用于在线场景
      • 解决方案:HA
    • NameNode压力过大,且内存受限,影扩展性
      • 解决方案:F联邦
  • MapReduce存在的问题 响系统
    • JobTracker访问压力大,影响系统扩展性
    • 难以支持除MapReduce之外的计算框架,比如Spark、Storm等

Hadoop 1.x与Hadoop 2.x

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

  • Hadoop 2.x由HDFS、MapReduce和YARN三个分支构成;
    • HDFS:NN Federation(联邦)、HA;
      • 2.X:只支持2个节点HA,3.0实现了一主多从
    • MapReduce:运行在YARN上的MR;
      • 离线计算,基于磁盘I/O计算
    • YARN:资源管理系统

HDFS 2.x

  • 解决HDFS 1.0中单点故障(HA)和内存受限(联邦)问题。

  • HDFS2.x中Federation和HA分离,HA只能有两个NameNode

  • 解决单点故障

    • HDFS HA:通过主备NameNode解决
    • 如果主NameNode发生故障,则切换到备NameNode上
  • 解决内存受限问题

    HDFS Federation(联邦):水平扩展,支持多个NameNode;

    • (1)每个NameNode分管一部分目录;
    • (2)所有NameNode共享所有DataNode存储资源
  • 2.x仅是架构上发生了变化,使用方式不变

  • 对HDFS使用者透明

  • HDFS 1.x中的命令和API仍可以使用

HA(解决单点故障)介绍

主备NameNode

解决单点故障(属性,位置

  • 主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
  • 所有DataNode同时向两个NameNode汇报数据块信息(位置)
  • JNN:集群(属性)
  • standby:备,完成了edits.log文件的合并产生新的image,推送回ANN

两种切换选择

  • 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
  • 自动切换:基于Zookeeper实现

基于Zookeeper自动切换方案

  • ZooKeeper Failover Controller:监控NameNode健康状态,
  • 并向Zookeeper注册NameNode
  • NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active

主备模型实现

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

第一部分:fsimage和editslog: 主NameNode向JNN中写一条editslog记录,备用NN就读入一条editslog记录,保证主备NN之间的内存状态一致。

第二部分:blk文件一致(存储的block块信息)DataNode向主NN和备NN一起汇报存储的block块信息和心跳。

这样,主备NN之间内存状态完全一致,就可以进行切换了。

注:fsimage推送的时机通过一些参数来设置,fsimage和editslog合并的工作是由备用NameNode完成。

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

HA工作流程总结

  1. 一个NameNode进程处于Active状态,另1个NameNode进程处于Standby状态。Active的
    NameNode负责处理客户端的请求。
  2. Active的NN修改了元数据之后,会在JNs的半数以上的节点上记录这个日志,Standby状态的
    NameNode会监视任何对JNs上editlog的更改,一旦edits log出规更改,Standby的NN就会根据
    edits log更改自己记录的元数据。
  3. 当发生故障转移时。Standby主机会确保已经读取了JNs上所有的更改来同步它本身记录的元数据,然后由Standby状态切换为Active状态。
  4. 为了确保在发生故障转移操作时拥有相同的数据块位置信息,DNs向所有NN发送数据块位置
    信息和心跳数据。
  5. JNs只允许一台NameNode向JNs写edits log数据,这样就能保证不会发生“脑裂”。

3. 使用Zookeeper完成主备NN自动切换

由运维来调。主NN和备用NN之间是由人工来切换的。
要【实现主备NN间自动切换】,可通过搭建Zookeeper集群来实现。

Zookeeper: 它是负责选举算法。选举一个Namenode的状态为Active。同时记录每个Namenode的运行信息。

ZKFC: 监控各自的NameNode(每一个NameNode一定有一个与之对应的ZKFC)。负责NameNode的状态切换。借助ssh服务来切换NameNode的状态(一定要配置SSH服务的免密钥)。

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

Zookeeper集群在启动的前多少秒会完成一个工作,选一个leader。

如何选leader:

每台机器有俩参数,一个是zxid:Zookeeper事务ID,一个是myID。

  • zxid:ZooKeeper事务ID,执行的事务数量,执行的事务数量多最新的就是leader
  • myID:每一个Zookeeper节点都会有一个myid,当zxid相同时,谁的myID大,谁就是leader。

Zookeeper集群上会有一个目录结构,可供创建一个临时节点。两个NameNode上都有一个zkfc组件,随时与zookeeper集群保持联系(心跳信息),监控这个临时节点,一旦检测不到心跳时,这个临时节点就会消失,此时另外一个NameNode就会申请创建临时节点,谁创建了临时节点,谁就是leader。

在Zookeeper上创建一个临时目录,用来存放哪个NameNode是主NameNode(ActiveNameNode)。在一开始的时候没有临时节点,两个namenode争抢创建,谁创建成功,谁就是ActiveNameNode。

zkfc进程和NameNode进程是在一台机器上的。Zkfc监控所在主机的NameNode的健康状态(操作系统和硬件是否有问题),如果有问题会将Zookeeper集群中的临时节点删掉。

注:当一个ActiveNameNode宕机StandByNameNode切换成Active状态之前,会将之前的ActiveNameNode确保变成StandBy状态。

记忆点:

防止分区,过半机制,Zookeeper临时目录,zkfc和NameNode在一台主机上。

总结:

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

4.联邦(解决内存受限)

多个NAmeNode进行扩展,根据目录分别将元数据文件分给多个NameNode。

  • 通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使到namenode/namespace可以通过增加机器来进行水平扩展。
  • 能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。
  • 可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。

使用联邦加HA

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

5.HA 配置-搭建

1.整体规划

node1 node2 node3 node4
NN-1 NN-2
JNN-1 JNN-2 JNN-3
DN-1 DN-2 DN-3
ZK-1 ZK-2 ZK-3
ZKFC-1 ZKFC-2

Active NameNode : 一个集群只有一个Active,接受客户端的读写请求,记录edits日志(元数据)。

StandbyNameNode : 一个集群中可能有多个Standby。合并edits和fsimage文件,从而更新fsimage。等待 ActiveNameNode的死亡。

JournalNode: 共享edits日志文件。当ANN写入一条日志的同时,往JournalNode集群中也写入一条。当它接受一条日志,同时通知StandbyNamenode获取。

DataNode: 保存和管理block。并且往两种NameNode同时汇报block的位置信息。

Zookeeper: 它是负责选举算法。选举一个Namenode的状态为Active。同时记录每个Namenode的运行信息。

ZKFC: 监控各自的NameNode(每一个NameNode一定有一个与之对应的ZKFC)。负责NameNode的状态切换。借助ssh服务来切换NameNode的状态(一定要配置SSH服务的免密钥)。

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

2.为每个节点设置免密钥和安装hadoop与java环境

安装java环境

  1. 安装jdk

      rpm –ivh jdk-7u80-linux-x64.rpm  -I install,-v 查看安装进度,-h 计算hash值  
    

    注:如何查看jdk的安装路径

    whereis java :查看java命令的路径
    cd /usr/java 
    ls :->jdk1.7.0_80 
    cd  /jdk1.7.0_80 
    

    pwd 复制jdk的安装路径

  2. vi /etc/profile 配置环境变量

    export JAVA_HOME=jdk的安装路径
    export PATH=$PATH:$JAVA_HOME/bin 
    
  3. 执行source /etc/profile 让配置生效

  4. 使用jps验证是否按照

如果已有某个主机有了jdk,可以直接远程拷贝到其他机器

scp -r /usr/java root@node02:/usr/java

设置免密钥

为了管理脚本去管理其他节点做免密钥

  1. 生成密钥

    ssh–keygen :生成公钥和私钥。
    
  2. 在管理节点把公钥拷给其他节点

    node01为管理节点

    [root@node01 java]ssh-copy-id -i ./id_rsa.pub root@node01
    [root@node01 java]ssh-copy-id -i ./id_rsa.pub root@node02
    [root@node01 java]ssh-copy-id -i ./id_rsa.pub root@node03
    [root@node01 java]ssh-copy-id -i ./id_rsa.pub root@node04
    

设置每个主机时间同步

[root@node01 ~]# date -s "2019-06-12 16:45:16"
[root@node02 ~]# date -s "2019-06-12 16:45:16"
[root@node03 ~]# date -s "2019-06-12 16:45:16"
[root@node04 ~]# date -s "2019-06-12 16:45:16"

或者在xshell上直接输入命令

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

安装hadoop

3.搭建Zookeeper集群

三台zookeeper:node02,node03,node04

  1. 先关闭当前主机的集群

    stop-dfs.sh
    
  2. 通过 xftp上传zookeeper.tar.gz上传到node2,node3,node4,解压

    [root@node02 ~]# tar -zxvf zookeeper-3.4.6.tar.gz
    
  3. 将压缩包移动到到/opt目录下

    [root@node02 ~]# mv zookeeper-3.4.6 /opt
    
  4. 配置环境变量

    [root@node02 zookeeper-3.4.6]# pwd
    /opt/zookeeper-3.4.6
    [root@node02 zookeeper-3.4.6]# vi /etc/profile
    .....
    export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
    export HADOOP_HOME=/root/myapps/hadoop-2.6.5
    export ZOOKEEPER_HOME=/opt/zookeeper-3.4.6
    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
    

    .
    /etc/profile 让配置文件生效

  5. 将/etc/profile文件拷贝到其他两台机器node3和node4

    scp /etc/profile node3:/etc
    scp /etc/profile node4:/etc
    

    且分别在每台机器上执行配置文件,让它生效。

  6. 到$ZOOKEEPER_HOME/conf路径下,复制zoo_sample.cfg为zoo.cfg

    • 因为zookeeper默认使用zoo.cfg这个文件
    [root@node02 ~]# cd $ZOOKEEPER_HOME/conf
    [root@node02 conf]# ls
    configuration.xsl  log4j.properties  zoo_sample.cfg
    [root@node02 conf]# mv zoo_sample.cfg zoo.cfg
    [root@node02 conf]# ll
    总用量 12
    -rw-rw-r--. 1 1000 1000  535 2月  20 2014 configuration.xsl
    -rw-rw-r--. 1 1000 1000 2161 2月  20 2014 log4j.properties
    -rw-rw-r--. 1 1000 1000  922 2月  20 2014 zoo.cfg
    
  7. vi zoo.cfg 配置存放zookeeper集群数据的路径以及zookeeper集群中的机器(在node02,node03,node04中均需要配置)

    修改:

    dataDir=/var/sxt/hadoop/zk 在这个目录下存放zookeeper的数据

    添加:

    server.1=node02:2888:3888 1号服务器是在node2机器上。

    server.2=node03:2888:3888

    server.3=node04:2888:3888

    (2888是通信端口,3888是选举端口)

    Zookeeper机器间进行通信走的是2888端口,投票选择leader时走3888端口

    [root@node02 conf]# vi zoo.cfg
    ...
    dataDir=/var/sxt/hadoop/zk
    ...
    server.1=node02:2888:3888
    server.2=node03:2888:3888
    server.3=node04:2888:3888
    
  8. 在node02,node03,node04中创建/var/sxt/hadoop/zk目录,并在目录下放一个myid,在myid中编辑当前zookeeper的编号(上一步中配置的server编号 要对应)。

    [root@node02 conf]# mkdir -p /var/sxt/hadoop/zk
    [root@node02 conf]# echo 1 > /var/sxt/hadoop/zk/myid
    [root@node02 opt]# cat /var/sxt/hadoop/zk/myid
    1
    [root@node03 ~]# mkdir -p /var/sxt/hadoop/zk
    [root@node03 ~]# echo 2 > /var/sxt/hadoop/zk/myid
    [root@node03 ~]# cat /var/sxt/hadoop/zk/myid
    2
    [root@node04 ~]# mkdir -p /var/sxt/hadoop/zk
    [root@node04 ~]# echo 3 > /var/sxt/hadoop/zk/myid
    [root@node04 ~]# cat /var/sxt/hadoop/zk/myid 
    3
    
    
  9. 启动zookeeper 在每台机器上 查看zk状态

    • 注意:每台机器的防火墙都需要关闭

      1.首先查看防火墙状态:  
      service iptables status  
      
      永久性生效,重启后不会复原  
      开启:  
      chkconfig iptables on  
      关闭:  
      chkconfig iptables off  
      
      2.即时生效,重启后复原  
      开启:  
      service iptables start  
      关闭:  
      service iptables stop  
      
      
    • 查看zookeeper集群启动状态

      zkServer.sh status

      此时要注意起了几台机器的zookeeper服务,因为要遵循过半机制,一半以上机器的zookeeper启动才算启动成功。

      一般zookeeper可以保证 不管出什么问题200ms内都可以解决问题,且占用资源少,非常稳定,可以直接用于生产环境。

    [root@node02 zookeeper-3.4.6]# zkServer.sh  start
    JMX enabled by default
    Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    [root@node02 zookeeper-3.4.6]# zkServer.sh  status
    JMX enabled by default
    Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Mode: follower
    
    
    [root@node03 conf]# zkServer.sh  start
    JMX enabled by default
    Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    [root@node03 conf]# zkServer.sh  status
    JMX enabled by default
    Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Mode: follower
    
    
    [root@node04 ~]# zkServer.sh  start
    JMX enabled by default
    Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    [root@node04 ~]# zkServer.sh  status
    JMX enabled by default
    Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Mode: leader
    

4.hadoop配置

配置之前停掉hadoop服务。Jps查看进程。

  1. 配置hdfs-site.xml文件

    • 配置主备NN:

      HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

    • 配置journalNode集群:

      HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

    HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

    HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

    注:

    1) 命名服务,对应core-site.xml文件中的hdfs://mycluster。

    2) 配置是哪些机器为hdfs提供NameNode服务 nn1,nn2指定的是逻辑名称。

    3) 为NameNode逻辑名称指定实际机器。

    4) 指定三台journal服务器的地址为node1、2、3 ,端口为8485。

    5) 客户端查找Active状态的NameNode:向所有的NameNode均发送连接请求

    6)sshfence:保证在StandBy状态的NameNode启动前,杀死Active状态的NameNode进程。保证当前只有一个Active状态的NameNode。

    7)/root/.ssh/id_dsa 指定私钥位置。

    8)指定jounalNode存放editslog文件位置

    9)启用自动故障切换

    <configuration>
    	<property>
    		<name>dfs.replication</name>
    		<value>2</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/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_dsa</value>
    	</property>
    	<property>
       		<name>dfs.ha.automatic-failover.enabled</name>
       		<value>true</value>
     	</property>
    </configuration>
    
    

    具体解读

    <configuration>
    <!-- 定义hdfs集群ID号 -->
    <property>
      <name>dfs.nameservices</name>
      <value>bjsxt</value>
    </property>
    <!-- 定义hdfs集群中namenode的ID号 -->
    <property>
      <name>dfs.ha.namenodes.bjsxt</name>
      <value>nn1,nn2</value>
    </property>
    <!-- 定义namenode的主机名和RPC协议的端口 -->
    <property>
      <name>dfs.namenode.rpc-address.bjsxt.nn1</name>
      <value>node1:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.bjsxt.nn2</name>
      <value>node4:8020</value>
    </property>
    <!-- 定义namenode的主机名和HTTP协议的端口 -->
    <property>
      <name>dfs.namenode.http-address.bjsxt.nn1</name>
      <value>node1:9870</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.bjsxt.nn2</name>
      <value>node4:9870</value>
    </property>
    <!-- 定义共享edits的URL -->
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://node2:8485;node3:8485;node4:8485/laoxiao</value>
    </property>
    <!-- 定义HDFS的客户端连接HDFS集群时返回active namenode地址 -->
    <property>
      <name>dfs.client.failover.proxy.provider.bjsxt</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!-- HDFS集群中两个namenode切换状态时的隔离方法 -->
    <property>
          <name>dfs.ha.fencing.methods</name>
          <value>sshfence</value>
    </property>
    <!-- HDFS集群中两个namenode切换状态时的隔离方法的密钥 -->
    <property>
          <name>dfs.ha.fencing.ssh.private-key-files</name>
          <value>/root/.ssh/id_rsa</value>
    </property>
    
    <!-- journalnode集群中用于保存edits文件的目录 -->
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/opt/journalnode/data</value>
    </property>
    
    <!-- HA的HDFS集群自动切换namenode的开关-->
    <property>
       <name>dfs.ha.automatic-failover.enabled</name>
       <value>true</value>
     </property>
    </configuration>
    
  2. 配置core-site.xml文件

    注:

    1)2181是客户端连接端口($ZOOKEEPER_HOME/conf文件查看)

    2)最后一个property配置是为了和Zookeeper保持一个长连接,监控ActiveNameNode,随时准备好选出新的leader。

    3)hdfs://mycluster 类似于Java中的接口的功能。不管哪台namenode为主,只要访问mycluster,就会自动访问到主NameNode。mycluster是虚拟的,哪台机器是主NameNode,mycluster就是谁。

    HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

    <configuration>
    <property>
            <name>fs.defaultFS</name>
            <value>hdfs://mycluster</value>
        </property>
    <property>
            <name>hadoop.tmp.dir</name>
            <value>/var/sxt/hadoop/ha</value>
    </property>
    <!-- HDFS连接zookeeper集群的地址和端口 -->
    <property>
       <name>ha.zookeeper.quorum</name>
       <value>node02:2181,node03:2181,node04:2181</value>
     </property>
    </configuration>
    
    
  3. 在所有节点中node1-4配置Slaves

    • DataNode在哪几个主机就写哪几个主机的名字
    [root@node01 hadoop]# vi slaves 
    
          1 node02
          2 node03
          3 node04
    
  4. 将这两个配置文件在其余节点上做同步 4台机器均要有

    [root@node01 hadoop]# scp hdfs-site.xml core-site.xml node02:`pwd`
    hdfs-site.xml                                                                                                     100% 2237     2.2KB/s   00:00    
    core-site.xml                                                                                                     100% 1090     1.1KB/s   00:00    
    [root@node01 hadoop]# scp hdfs-site.xml core-site.xml node03:`pwd`
    hdfs-site.xml                                                                                                     100% 2237     2.2KB/s   00:00    
    core-site.xml                                                                                                     100% 1090     1.1KB/s   00:00    
    [root@node01 hadoop]# scp hdfs-site.xml core-site.xml node04:`pwd`
    hdfs-site.xml                                                                                                     100% 2237     2.2KB/s   00:00    
    core-site.xml                                                                                                     100% 1090     1.1KB/s   00:00
    

5.设置node02到node01的免密钥

  • 免密钥只需在node01到node2,node3,node4和 node2到node1上设置

    [root@node02 .ssh]# ssh-copy-id -i ./id_rsa.pub root@node02
    [root@node02 .ssh]# ssh-copy-id -i ./id_rsa.pub root@node01
    

6.启动HA的Hadoop

  1. 启动三台journalNode(node1,node 2,node3)

    [root@node01 hadoop]# hadoop-daemon.sh start journalnode
    starting journalnode, logging to /root/myapps/hadoop-2.6.5/logs/hadoop-root-journalnode-node01.out
    [root@node01 hadoop]# jps
    1448 Bootstrap
    3017 JournalNode
    3068 Jps
    
    
    [root@node02 .ssh]# hadoop-daemon.sh start journalnode
    starting journalnode, logging to /root/myapps/hadoop-2.6.5/logs/hadoop-root-journalnode-node02.out
    [root@node02 .ssh]# jps
    2657 Jps
    2390 QuorumPeerMain
    2606 JournalNode
    
    
    
    [root@node03 hadoop]# hadoop-daemon.sh start journalnode
    starting journalnode, logging to /root/myapps/hadoop-2.6.5/logs/hadoop-root-journalnode-node03.out
    [root@node03 hadoop]# jps
    2242 QuorumPeerMain
    2376 JournalNode
    2427 Jps
    
    
    
  2. 任意选择一台NameNode节点(node1,node2),格式化HDFS

    [root@node01 hadoop]# hdfs namenode -format
    

    出现以下情况说明格式化成功,否则查找错误

    ...
    19/06/12 20:15:41 INFO common.Storage: Storage directory /var/sxt/hadoop/ha/dfs/name has been successfully formatted.
    ...
    
  3. 格式化后启动当前NameNode进程

    [root@node01 hadoop]# hadoop-daemon.sh start namenode
    starting namenode, logging to /root/myapps/hadoop-2.6.5/logs/hadoop-root-namenode-node01.out
    [root@node01 hadoop]# jps
    3153 NameNode
    1448 Bootstrap
    3017 JournalNode
    3228 Jps
    

7.【停止HA集群】

  1. 停止HDFS:stop-dfs.sh
  2. 停止zookeeper集群(在三台zookeeper上node2 ode3 ode4都要执行):zkServer.sh stop

8.测试HA集群是否搭建成功

  1. 浏览器中访问node1:50070,node2:50070,查看他们的状态是否是一个Active,一个StandBy

  2. 杀死主NameNode,查看备用NameNode是否变为Active状态。

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

​ 在任意一台zookeeper集群中的机器上的zkCli.sh客户端执行

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

​ 浏览器中访问node2,查看是否变成 Active状态。

	停掉node2的zkfc进程,查看ActiveNameNode是否切换node1

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

  1. 上传文件测试

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

9.写一个脚本,让这个集群先启动Zookeeper,再启动HDFS,再查看每个节点上的进程信息

创建一个脚本,给其赋予可执行的权限

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

start-ha.sh:

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

创建停止HA集群的脚本:

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

运行stop-ha.sh

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

运行start-ha.sh

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

6.Zookeeper操作

  1. 查看临时文件

    查看:在zookeeper集群中任意一台机器上执行zkCli.sh客户端连接, 最后一行执行(ls /)

    HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

  2. 查看临时节点的文件内容:

    HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

总结:

HDFS命令操作和高可用
1.HDFS的命令行操作
2.HA 模式原理
3. 使用Zookeeper完成主备NN自动切换
4.联邦(解决内存受限)
5.HA 配置-搭建
6.Zookeeper操作

退出zookeeper客户端zkCli.sh:quit

搭建完成