HDFS常用命令与调优总结

一、HDFS相关常用总结

1、HDFS文件块

  • 默认是128M
  • 寻址时间:就是指的查找到目标block的时间
  • 寻址时间最佳为传输时间的1%
  • 目前磁盘的传输速率普遍为100M/s
  • block的大小应该为=传输时间*传输速率

HDFS块大小调节标准

  • HDFS块设置太小会增加寻址时间
  • HDFS块设置太大会导致磁盘传输数据时间明显大于寻址时间,导致处理很慢
  • HDFS块的大小设置取决于传输速率,也就是最好=传输时间*传输速率

2、HDFS的shell命令

3.常用命令实操
(0)启动Hadoop集群(方便后续的测试)
[gklearlove@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[gklearlove@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
(1)-help:输出这个命令参数
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -help rm
(2)-ls: 显示目录信息
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -ls /
(3)-mkdir:在HDFS上创建目录
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir -p /sanguo/shuguo
(4)-moveFromLocal:从本地剪切粘贴到HDFS
[gklearlove@hadoop102 hadoop-2.7.2]$ touch kongming.txt
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs  -moveFromLocal  ./kongming.txt  /sanguo/shuguo
(5)-appendToFile:追加一个文件到已经存在的文件末尾
[gklearlove@hadoop102 hadoop-2.7.2]$ touch liubei.txt
[gklearlove@hadoop102 hadoop-2.7.2]$ vi liubei.txt
输入
san gu mao lu
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
(6)-cat:显示文件内容
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -cat /sanguo/shuguo/kongming.txt
(7)-chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs  -chmod  666  /sanguo/shuguo/kongming.txt
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs  -chown  gklearlove:gklearlove   /sanguo/shuguo/kongming.txt
(8)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -copyFromLocal README.txt /
(9)-copyToLocal:从HDFS拷贝到本地
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -copyToLocal /sanguo/shuguo/kongming.txt ./
(10)-cp :从HDFS的一个路径拷贝到HDFS的另一个路径
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -cp /sanguo/shuguo/kongming.txt /zhuge.txt
(11)-mv:在HDFS目录中移动文件
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -mv /zhuge.txt /sanguo/shuguo/
(12)-get:等同于copyToLocal,就是从HDFS下载文件到本地
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -get /sanguo/shuguo/kongming.txt ./
(13)-getmerge:合并下载多个文件,比如HDFS的目录 /user/gklearlove/test下有多个文件:log.1, log.2,log.3,...
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -getmerge /user/gklearlove/test/* ./zaiyiqi.txt
(14)-put:等同于copyFromLocal
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -put ./zaiyiqi.txt /user/gklearlove/test/
(15)-tail:显示一个文件的末尾
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -tail /sanguo/shuguo/kongming.txt
(16)-rm:删除文件或文件夹
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -rm /user/gklearlove/test/jinlian2.txt
(17)-rmdir:删除空目录
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir /test
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -rmdir /test
(18)-du统计文件夹的大小信息
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -du -s -h /user/gklearlove/test
2.7 K  /user/gklearlove/test

[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -du  -h /user/gklearlove/test
1.3 K  /user/gklearlove/test/README.txt
15     /user/gklearlove/test/jinlian.txt
1.4 K  /user/gklearlove/test/zaiyiqi.txt
(19)-setrep:设置HDFS中文件的副本数量
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt
 
图3-3  HDFS副本数量
这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。

在这里插入图片描述

3、HDFS相关实用概念总结

  • HDFS写数据时,NameNode会判断哪个DataNode距离最近,然后写入,所以节点距离的计算方法是:两个节点到达最近的共同祖先的距离总和。

  • Fsimage:NameNode内存中元数据序列化后形成的文件,包含HDFS文件系统的所有目录和文件inode的序列化信息

  • Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据),文件系统客户端执行的所有写操作首先会被记录到Edits文件中。

  • NameNode启动过程:将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息都是最新、同步的。NameNode启动时就会将Fsimage和Edits合并

  • 集群安全模式:

    • NameNode启动(此时处于安全模式):首先将镜像文件载入内存,并执行Edits文件中的各种操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和空的Edits日志。此时,NameNode开始监听DataNode请求。在这个过程中,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。

    • DataNode启动:系统的数据块的位置并不是由NameNode维护的,而是以块列表形式储存在DataNode中。在系统正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的快位置信息后,即可高效运行文件系统

    • 安全模式退出判断:

      • 最小副本条件:整个文件系统99.9%的块都满足对小副本级别(默认值:dfs.replication.min=1)。此时NameNode会在30秒后退出安全模式。
    • HDFS刚刚格式化启动时,NameNode不会进入安全模式,因为系统没有任何数据块。

    • 相关命令:

      (1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)

      (2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)

      (3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)

      (4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)

4、HDFS查看Fsimage和Edits

  • oiv查看Fsimage文件

    hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径

    例子:

    hdfs oiv -p XML -i fsimage_0000000000000000025
    
  • oev查看Edits文件

    hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径

    例子:

    hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
    

5、HDFS相关参数总结

  • CheckPoint时间设置
    • 默认是一小时或操作次数达到1百万时SecondaryNameNode合并一次。一分钟检查一次操作次数

    • 修改步骤:

      • 文件hdfs-default.xml

      • 参数:

        #最大间隔合并时间
        <property>
          <name>dfs.namenode.checkpoint.period</name>
          <value>3600</value>
        </property>
        
        #最大间隔合并次数与检查时间
        <property>
          <name>dfs.namenode.checkpoint.txns</name>
          <value>1000000</value>
        <description>操作动作次数</description>
        </property>
        
        <property>
          <name>dfs.namenode.checkpoint.check.period</name>
          <value>60</value>
        <description> 1分钟检查一次操作次数</description>
        </property >
        
  • 掉线时限参数设置
    • 掉线定义:当DataNode进程死亡或者网络故障造成DataNode无法与NameNode通信时,NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间为超时时长,HDFS默认的超时时长为10分+30秒

    • 掉线时限公式:

      TimeOut=2 * dfs.namenode.heartbeat.recheck-interval+10 * dfs.heartbeat.interval
      
    • 其中对应的hdfs-site.xml配置文件的两个参数:dfs.heartbeat.interval单位是秒,heartbeat.recheck.interval单位是毫秒

      <property>
          <name>dfs.namenode.heartbeat.recheck-interval</name>
          <value>300000</value>
      </property>
      
      <property>
          <name>dfs.heartbeat.interval</name>
          <value>3</value>
      </property>
      

6、HDFS实用场景

  • NameNode多目录配置:NameNode本地目录可以配置成多个,且内容相同,这样增加了可靠性,步骤如下:
    • 在hdfs-site.xml文件中增加如下内容

      <property>
          <name>dfs.namenode.name.dir</name>
      <value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
      </property>
      
    • 停止集群,删除data和logs中所有数据

      [gklearlove@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
      [gklearlove@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/
      [gklearlove@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/
      
    • 格式化集群并启动

      [gklearlove@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode –format
      [gklearlove@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
      
    • 查看结果

      [gklearlove@hadoop102 dfs]$ ll
      总用量 12
      drwx------. 3 gklearlove gklearlove 4096 12月 11 08:03 data
      drwxrwxr-x. 3 gklearlove gklearlove 4096 12月 11 08:03 name1
      drwxrwxr-x. 3 gklearlove gklearlove 4096 12月 11 08:03 name2
      
  • NameNode故障处理
    • 方法一:将SecondaryNameNode中数据拷贝到NameNode存储数据的目录

      • kill -9 NameNode进程

      • 删除NameNode存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)

        [gklearlove@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
        
      • 拷贝SecondaryNameNode中数据到原NameNode存储数据目录

        [gklearlove@hadoop102 dfs]$ scp -r gklearlove@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/
        
      • 重新启动NameNode

        [gklearlove@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenodebk
        
    • 方法二:使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中。

      • 修改hdfs-site.xml中的

        <property>
          <name>dfs.namenode.checkpoint.period</name>
          <value>120</value>
        </property>
        
        <property>
          <name>dfs.namenode.name.dir</name>
          <value>/opt/module/hadoop-2.7.2/data/tmp/dfs/name</value>
        </property>
        
      • kill -9 NameNode进程

      • 删除NameNode存储的数据

        rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
        
      • 如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件

        [gklearlove@hadoop102 dfs]$ scp -r gklearlove@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./
        
        [gklearlove@hadoop102 namesecondary]$ rm -rf in_use.lock
        
        [gklearlove@hadoop102 dfs]$ pwd
        /opt/module/hadoop-2.7.2/data/tmp/dfs
        
        [gklearlove@hadoop102 dfs]$ ls
        data  name  namesecondary
        
      • 导入检查点数据(等待一会ctrl+c结束掉)

        bin/hdfs namenode -importCheckpoint
        
      • 启动NameNode

        sbin/hadoop-daemon.sh start namenode
        
  • 服役新数据节点
    • 随着业务增长,数据量增大,原来的数据节点已经无法满足,所以要增加数据节点

    • 步骤:

      • 机器准备

        1. 克隆一台相同的机器
        2. 修改IP地址和主机名称
        3. 删除原来HDFS文件系统留存的文件(/opt/module/hadoop-2.7.2/data和log)
        4. source一下配置文件
      • 配置步骤

        1. 启动DataNode:

          [gklearlove@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
          [gklearlove@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
          
        2. 上传文件测试

          hadoop fs -put /opt/module/hadoop-2.7.2/LICENSE.txt /
          
        3. 如果数据不均衡,用命令实现集群的再平衡

          ./start-balancer.sh
          
  • 退役旧数据节点
    • 添加白名单形式:在白名单内的主机节点,允许访问NameNode,不在白名单的主机节点都会被退出。配置白名单如下:

      • 在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件

        vi dfs.hosts
        将不需要退出的节点写入,比如hadoop4是需要退出的,那么就写1 2 3 
        hadoop1
        hadoop2
        hadoop3
        
      • 在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性

        <property>
        <name>dfs.hosts</name>
        <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
        </property>
        
      • 配置文件分发

        xsync hdfs-site.xml
        
      • 刷新NameNode

        hdfs dfsadmin -refreshNodes
        
      • 更新ResourceManager节点

        yarn rmadmin -refreshNodes
        
      • 如果数据不均衡,就使用命令实现均衡

        ./start-balancer.sh
        
    • 添加黑名单形式:在黑名单的节点都会被强制退出,步骤如下:

      • 在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts.exclude文件

        [gklearlove@hadoop102 hadoop]$ pwd
        /opt/module/hadoop-2.7.2/etc/hadoop
        [gklearlove@hadoop102 hadoop]$ touch dfs.hosts.exclude
        
      • 添加需要退出的主机名

        比如这里需要让hadoop4退出
        vi dfs.hosts.exclude
        
        hadoop4
        
      • 在hdfs-site.xml配置文件中增加dfs.hosts.exclude属性

        <property>
        <name>dfs.hosts.exclude</name>
              <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude</value>
        </property>
        
      • 刷新NameNode、刷新ResourceManager

        hdfs dfsadmin -refreshNodes
        
        yarn rmadmin -refreshNodes
        
      • 通过Web服务器查看退役状态:decommission in progress表示退役中,decommissioned表示退役成功

      • 退役成功后,停掉它的datanode和nodemanager

         sbin/hadoop-daemon.sh stop datanode
         
         sbin/yarn-daemon.sh stop nodemanager
        
      • 如果数据不均衡,就要使用命令来让集群平衡

         sbin/start-balancer.sh 
        
  • DataNode多目录配置
    • DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本

    • 具体配置如下:

      • 修改hdfs-site.xml

        <property>
                <name>dfs.datanode.data.dir</name>
        <value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
        </property>
        
  • 实现两个Hadoop集群之间的递归数据复制
    • bin/hadoop distcp
      hdfs://haoop102:9000/user/gklearlove/hello.txt hdfs://hadoop103:9000/user/gklearlove/hello.txt
      
  • 小文件存档
    • HDFS存储小文件弊端:每个文件按块存储,每个块的元数据存储在NameNode的内存中,因此存储小文件会非常低效,因为存储大量小文件的元数据会耗尽NameNode中的大部分内存

    • 但是,存储小文件所需要的磁盘容量和数据块的大小无关:也就是说1M的数据使用128M的块存储,实际使用的仍然是1M磁盘空间而不是128M。

    • 解决方法:使用HDFS存档文件或叫做HAR文件。

      • HDFS存档文件(HARwenjian ):一个更高效的文件存档工具,在逻辑上将多个小文件变成一个整体。具体来说就是HDFS的小文件还是一个一个的独立文件,但是对于NameNode来说却是一个整体,也就是中间人的作用,减少了NameNode的内存。

      • 归档后的har文件不可修改,如果需要修改则需要重新归档

      • 使用步骤:

        1. 启动YARN进程

          start-yarn.sh
          
        2. 归档文件:将小文件归档称一个以.har后缀的归档文件。

          #这里把/user/gklearlove/input的所有小文件归档称一个叫做input.har的归档文件,放到/user/gklearlove/output下,注意这里都是hdfs文件系统上
          bin/hadoop archive -archiveName input.har –p  /user/gklearlove/input   /user/gklearlove/output
          
        3. 查看归档

          hadoop fs -lsr /user/gklearlove/output/input.har
          
          hadoop fs -lsr har:///user/gklearlove/output/input.har
          
        4. 解归档文件(如果只是需要归档则不需要这一步)

          hadoop fs -cp har:///user/gklearlove/output/input.har/*    /user/gklearlove
          
  • 回收站:可以将删除的文件在不超时的情况下,恢复原数据。
    • 开启方式:

      • 在core-site.xml设置两个参数

        1. fs.trash.interval=文件在回收站的存活时间,默认值=0
        2. fs.trash.checkpoint.interval=检查回收站的间隔时间,默认是=0
        3. 一般来说:fs.trash.checkpoint.interval<fs.trash.interval
        数据值是分钟
        <property>
           <name>fs.trash.interval</name>
        <value>10</value>
        </property>
        <property>
           <name>fs.trash.checkpoint.interval</name>
        <value>1</value>
        </property>
        
      • 查看回收站

        路径在:

        HDFS的文件路径
        /user/gklearlove/.Trash/….
        
      • 修改访问垃圾回收站用户名称,默认是dr.who,在 core-site.xml

        <property>
          <name>hadoop.http.staticuser.user</name>
          <value>gklearlove</value>
        </property>
        
    • 使用方法

      • 在程序中删除文件不会经过回收站,需要调用moveToTrash()才进入回收站

        Trash trash = New Trash(conf);
        trash.moveToTrash(path);
        
      • 恢复回收站数据

        hadoop fs -mv
        /user/gklearlove/.Trash/Current/user/gklearlove/input    /user/gklearlove/input
        
      • 清空回收站

        hadoop fs -expunge
        
  • 快照管理:快照相当于做一个备份,但不会立即复制所有文件,而是记录文件的变化

在这里插入图片描述

  • 开启/禁用指定目录的快照功能

    开启:
    hdfs dfsadmin -allowSnapshot /user/gklearlove/input
    禁用:
    hdfs dfsadmin -disallowSnapshot /user/gklearlove/input
    
  • 对目录创建快照

    创建快照(不指定名称)
    hdfs dfs -createSnapshot /user/gklearlove/input
    创建快照(指定名称)
    hdfs dfs -createSnapshot /user/gklearlove/input  快照名称
    
    查看指定目录快照
    hdfs dfs -lsr /user/gklearlove/input/.snapshot/
    
  • 重命名快照

    hdfs dfs -renameSnapshot /user/gklearlove/input/  旧名称 新名称
    
  • 列出当前用户所有可快照目录

    hdfs lsSnapshottableDir
    
  • 比较两个快照目录的不同之处

    hdfs snapshotDiff
     /user/gklearlove/input/  .  .snapshot/gklearlove170508	
    
  • 恢复快照

    hdfs dfs -cp
    /user/gklearlove/input/.snapshot/s20170708-134303.027 /user
    
  • HDFS-HA高可用(需要做的事情如下,理论上)
    • 元数据管理方式需要改变
      1. 内存中各自保存一份元数据;
      2. Edits日志只有Active状态的NameNode节点可以做写操作;
      3. 两个NameNode都可以读取Edits;
      4. 共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);
    • 需要一个状态管理功能模块
      • 实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。
    • 必须保证两个NameNode之间能够ssh无密码登录
    • 隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务
  • HDFS-HA高可用配置(手动转移)(在配置好ZooKeeper的基础上):
    • 在opt目录下创建一个ha文件夹

      mkdir ha
      
    • 将/opt/app/下的 hadoop-2.7.2拷贝到/opt/ha目录下

      cp -r hadoop-2.7.2/ /opt/ha/
      
    • 配置hadoop-env.sh

      export JAVA_HOME=/opt/module/jdk1.8.0_144
      
    • 配置core-site.xml

      <configuration>
      <!-- 把两个NameNode)的地址组装成一个集群mycluster -->
      		<property>
      			<name>fs.defaultFS</name>
              	<value>hdfs://mycluster</value>
      		</property>
      
      		<!-- 指定hadoop运行时产生文件的存储目录 -->
      		<property>
      			<name>hadoop.tmp.dir</name>
      			<value>/opt/ha/hadoop-2.7.2/data/tmp</value>
      		</property>
      </configuration>
      
    • 配置hdfs-site.xml

      <configuration>
      	<!-- 完全分布式集群名称 -->
      	<property>
      		<name>dfs.nameservices</name>
      		<value>mycluster</value>
      	</property>
      
      	<!-- 集群中NameNode节点都有哪些 -->
      	<property>
      		<name>dfs.ha.namenodes.mycluster</name>
      		<value>nn1,nn2</value>
      	</property>
      
      	<!-- nn1的RPC通信地址 -->
      	<property>
      		<name>dfs.namenode.rpc-address.mycluster.nn1</name>
      		<value>hadoop102:9000</value>
      	</property>
      
      	<!-- nn2的RPC通信地址 -->
      	<property>
      		<name>dfs.namenode.rpc-address.mycluster.nn2</name>
      		<value>hadoop103:9000</value>
      	</property>
      
      	<!-- nn1的http通信地址 -->
      	<property>
      		<name>dfs.namenode.http-address.mycluster.nn1</name>
      		<value>hadoop102:50070</value>
      	</property>
      
      	<!-- nn2的http通信地址 -->
      	<property>
      		<name>dfs.namenode.http-address.mycluster.nn2</name>
      		<value>hadoop103:50070</value>
      	</property>
      
      	<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
      	<property>
      		<name>dfs.namenode.shared.edits.dir</name>
      	<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
      	</property>
      
      	<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
      	<property>
      		<name>dfs.ha.fencing.methods</name>
      		<value>sshfence</value>
      	</property>
      
      	<!-- 使用隔离机制时需要ssh无秘钥登录-->
      	<property>
      		<name>dfs.ha.fencing.ssh.private-key-files</name>
      		<value>/home/gklearlove/.ssh/id_rsa</value>
      	</property>
      
      	<!-- 声明journalnode服务器存储目录-->
      	<property>
      		<name>dfs.journalnode.edits.dir</name>
      		<value>/opt/ha/hadoop-2.7.2/data/jn</value>
      	</property>
      
      	<!-- 关闭权限检查-->
      	<property>
      		<name>dfs.permissions.enable</name>
      		<value>false</value>
      	</property>
      
      	<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
      	<property>
        		<name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      	</property>
      </configuration>
      
    • 拷贝配置好的hadoop环境到其他节点

    • 启动HDFS-HA集群

      • 在各个JournalNode节点上,输入以下命令启动journalnode服务

        sbin/hadoop-daemon.sh start journalnode
        
      • 在[nn1]上,对其进行格式化,并启动

        	bin/hdfs namenode -format
        	sbin/hadoop-daemon.sh start namenode
        
      • 在[nn2]上,同步nn1的元数据信息

        bin/hdfs namenode -bootstrapStandby
        
      • 启动nn2

        sbin/hadoop-daemon.sh start namenode
        
      • 查看web页面显示,如图所示

在这里插入图片描述

在这里插入图片描述

- 在[nn1]上,启动所有datanode

  ```shell
  	sbin/hadoop-daemons.sh start datanode
  ```

- 将[nn1]切换为Active

  ```shell
  bin/hdfs haadmin -transitionToActive nn1
  ```

- 查看是否Active

  ```shell
  bin/hdfs haadmin -getServiceState nn1
  ```
  • HDFS-HA自动故障转移工作机制
    • 自动故障转移工作机制就是指的当现役的NameNode故障时,会自动转移到备用的NameNode。部署自动故障转移需要两个新的东西:ZooKeeper和ZKFailoverController(ZKFC)进程。也就是说自动故障转移依赖ZooKeeper的故障检测功能,和现役NameNode选择功能。
      • ZooKeeper做的事情是:
        1. 故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。
        2. 现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。
      • ZKFC(每个NameNode都会运行的进程,是ZooKeeper的客户端,也监视和管理NameNode的状态)做的事情是:
        1. 健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
        2. ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。
        3. 基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为Active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为Active状态。
  • 配置HDFS-HA自动故障转移(在手动基础上)
    • 在hdfs-site.xml中增加

      <property>
      	<name>dfs.ha.automatic-failover.enabled</name>
      	<value>true</value>
      </property>
      
    • 在core-site.xml文件中增加

      <property>
      	<name>ha.zookeeper.quorum</name>xml
      	<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
      </property>
      
    • 启动

      • 关闭所有HDFS服务

        sbin/stop-dfs.sh
        
      • 启动Zookeeper集群

        bin/zkServer.sh start
        
      • 初始化HA在Zookeeper中状态

        bin/hdfs zkfc -formatZK
        
      • 启动HDFS服务

        sbin/start-dfs.sh
        
      • 在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode

        sbin/hadoop-daemin.sh start zkfc
        
    • 验证

      • 将Active NameNode进程kill

        kill -9 namenode的进程id
        
      • 将Active NameNode机器断开网络

        service network stop
        
  • 配置YARN-HA集群

    • 配置yarn-site.xml文件

      <configuration>
      
          <property>
              <name>yarn.nodemanager.aux-services</name>
              <value>mapreduce_shuffle</value>
          </property>
      
          <!--启用resourcemanager ha-->
          <property>
              <name>yarn.resourcemanager.ha.enabled</name>
              <value>true</value>
          </property>
       
          <!--声明两台resourcemanager的地址-->
          <property>
              <name>yarn.resourcemanager.cluster-id</name>
              <value>cluster-yarn1</value>
          </property>
      
          <property>
              <name>yarn.resourcemanager.ha.rm-ids</name>
              <value>rm1,rm2</value>
          </property>
      
          <property>
              <name>yarn.resourcemanager.hostname.rm1</name>
              <value>hadoop102</value>
          </property>
      
          <property>
              <name>yarn.resourcemanager.hostname.rm2</name>
              <value>hadoop103</value>
          </property>
       
          <!--指定zookeeper集群的地址--> 
          <property>
              <name>yarn.resourcemanager.zk-address</name>
              <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
          </property>
      
          <!--启用自动恢复--> 
          <property>
              <name>yarn.resourcemanager.recovery.enabled</name>
              <value>true</value>
          </property>
       
          <!--指定resourcemanager的状态信息存储在zookeeper集群--> 
          <property>
              <name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
      </property>
      
      </configuration>
      
    • 同步更新其他节点的配置信息

    • 启动HDFS

      1. 在各个JournalNode节点上,输入以下命令启动journalnode服务:

        sbin/hadoop-daemon.sh start journalnode
        
      2. 在[nn1]上,对其进行格式化,并启动:

        bin/hdfs namenode -format
        sbin/hadoop-daemon.sh start namenode
        
      3. 在[nn2]上,同步nn1的元数据信息

        bin/hdfs namenode -bootstrapStandby
        
      4. 启动[nn2]

        sbin/hadoop-daemon.sh start namenode
        
      5. 启动所有DataNode

        sbin/hadoop-daemons.sh start datanode
        
      6. 将[nn1]切换为Active

        bin/hdfs haadmin -transitionToActive nn1
        
    • 启动YARN

      • 在hadoop102中执行:

        sbin/yarn-daemon.sh start resourcemanager
        
      • 在hadoop103中执行

        sbin/yarn-daemon.sh start resourcemanager
        
      • 查看服务状态

        bin/yarn rmadmin -getServiceState rm1
        

在这里插入图片描述

  • HDFS Federation架构设计
    • 提出的原因:

      • NameNode架构的局限性

        1. Namespace的限制:

          由于NameNode在内存中存储所有的元数据(metadata),因此单个NameNode所能存储的对象(文件+块)数目受到NameNode所在JVM的heap size的限制。50G的heap能够存储20亿(200million)个对象,这20亿个对象支持4000个DataNode,12PB的存储(假设文件平均大小为40MB)。随着数据的飞速增长,存储的需求也随之增长。单个DataNode从4T增长到36T,集群的尺寸增长到8000个DataNode。存储的需求从12PB增长到大于100PB。

        2. 隔离问题:

          由于HDFS仅有一个NameNode,无法隔离各个程序,因此HDFS上的一个实验程序就很有可能影响整个HDFS上运行的程序。

        3. 性能的瓶颈

          由于是单个NameNode的HDFS架构,因此整个HDFS文件系统的吞吐量受限于单个NameNode的吞吐量。

    • 架构设计方案:

      • 多个NameNode,每个NameNode负责不同的业务,使用不同的Namespace(隔离性)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值