HDFS-简介

HDFS(Hadoop Distributed File System):Hadoop分布式文件系统

概念

数据块

HDFS上的文件被划分为块大小的多个分块(chunk),作为独立的存储单元。在2.X版本默认块大小为128MB,旧版本块大小默认为64MB。

  • 查看文件块大小和副本数

    ## 语法
    hadoop fs [generic options] -stat [format] <path> ...
    ## format 格式
    %b:打印文件大小(目录为0)
    %n:打印文件名
    %o:打印block size (我们要的值)
    %r:打印备份数
    %y:打印UTC日期 yyyy-MM-dd HH:mm:ss
    %Y:打印自1970年1月1日以来的UTC微秒数
    %F:目录打印directory, 文件打印regular file
    当使用-stat选项但不指定format时候,只打印文件创建日期,相当于%y
    
    [hadoop@pg1 soft]$ hadoop fs -put ./jdk-8u202-linux-x64.tar.gz /
    [hadoop@pg1 soft]$ hadoop fs -ls /
    Found 4 items
    drwxr-xr-x   - hadoop supergroup          0 2020-09-07 09:48 /hadoop
    drwxr-xr-x   - hadoop supergroup          0 2020-09-09 10:18 /hbase
    -rw-r--r--   2 hadoop supergroup  194042837 2020-09-25 09:28 /jdk-8u202-linux-x64.tar.gz
    drwxrwx---   - hadoop supergroup          0 2020-09-07 09:00 /tmp
    [hadoop@pg1 soft]$ hadoop fs -stat "%o %r" /jdk-8u202-linux-x64.tar.gz
    134217728 2
    [hadoop@pg1 soft]$
    

    jdk-8u202-linux-x64.tar.gz文件块大小为128M,有2个副本

  • 列出各个HDFS文件组成块信息

    [hadoop@pg1 soft]$ hdfs fsck / -files -blocks
    Connecting to namenode via http://pg2:50070/fsck?ugi=hadoop&files=1&blocks=1&path=%2F
    FSCK started by hadoop (auth:SIMPLE) from /192.168.10.190 for path / at Fri Sep 25 09:34:42 CST 2020
    / <dir>
    /hadoop <dir>
    /hadoop/hadoop-2.10.0.tar.gz 392115733 bytes, 3 block(s):  OK
    0. BP-2081959867-192.168.10.190-1599396161857:blk_1073741828_1004 len=134217728 Live_repl=2
    1. BP-2081959867-192.168.10.190-1599396161857:blk_1073741829_1005 len=134217728 Live_repl=2
    2. BP-2081959867-192.168.10.190-1599396161857:blk_1073741830_1006 len=123680277 Live_repl=2
    
    ......
    

Namenode 和 Datanode

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。

  • Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。

    • 它管理文件系统树及整棵树内所有文件和目录。这些信息通过命名空间镜像文件和编辑日志文件这2种文件形式保存到本地磁盘上

      ## 命名空间镜像文件
      fsimage_0000000000000003271
      fsimage_0000000000000003271.md5
      
      ## 编辑日志文件
      edits_0000000000000002476-0000000000000002477
      

      image-20200921093657408

    • namenode记录着每个文件中各个块所在的数据节点信息,但不永久保存块的位置信息

    • 若namenode机器毁坏,文件将会丢失。提供下面2种机制,实现容错

      • 配置namenode在多个文件系统上保存元数据的持久状态(写入本地磁盘的同时写入一个NFS文件系统)
      • 运行一个辅助namenode
  • 集群中的Datanode一般是一个节点一个设备,负责管理它所在节点上的数据存储。

    • 它们根据需要存储和检索数据块,并定期向namenode发送它们所存储的块的列表
  • 辅助namenode(secondary namenode):负责定期合并编辑日志和命名空间镜像

    • 它需要大量CPU资源和跟活动namenode一样多的内存合并编辑日志

HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

HDFS 架构

Namenode和Datanode被设计成可以在普通的商用机器上运行。这些机器一般运行着GNU/Linux操作系统(OS)。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。

集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。

文件系统的名字空间 (namespace)

HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。当前,HDFS不支持用户磁盘配额和访问权限控制,也不支持硬链接和软链接。但是HDFS架构并不妨碍实现这些特性。

Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。应用程序可以设置HDFS保存的文件的副本数目。文件副本的数目称为文件的副本系数,这个信息也是由Namenode保存的。

联邦HDFS

namenode在内存中保存每个文件和每个数据块的引用关系。对于拥有大量文件的集群来说,内存将成为横向扩展的瓶颈。在2.X中引入联邦HDFS允许系统通过添加namenode实现扩展,其中每个namenode管理文件系统命名空间的一部分。

在联邦环境下,每个namenode维护一个命名空间卷(namespace volume),由命名空间的元数据和一个数据块池(block pool)组成。数据块池包含该命名空间下文件的所有数据块。命名空间卷相互独立,两两之间并不相互通信。

HDFS的高可用性

Hadoop2针对namenode存在的单点失效(SPOF, single point of failure)问题,提供对HDFS的高可用性(HA)支持。通过配置一对活动-备用(active-standby) namenode。当活动namenode失效时,备用namenode自动接管它的任务并开始服务于来自客户端的请求。

HA架构改变

  • namenode之间需要通过高可用共享存储实现编辑日志的共享。当备用namenode接管工作之后,它将通读共享编辑日志以实现与活动namenode的状态同步
  • datanode需要同时向两个namenode发生数据块处理报告
  • 辅助namenode的角色被备用namenode所包含,备用namenode为活动的namenode命名空间设置周期性检查点。

高可用共享存储实现方案

  • NFS过滤器
  • 群体日志管理器(QJM, quorum journal manager)
    • QJM 是一个专用的HDFS实现,提供一个高可用的编辑日志而设计
    • QJM 以一组日志节点(journal node)的形式运行,每次编辑必须写入多数日志节点

故障切换(failover)与规避(fencing)

Hadoop HA默认使用zookeeper作为故障转移控制器,它(zookeeper)负责监视(心跳机制)namenode是否失效并在namenode失效时进行故障转移。zookeeper确保集群中有且仅有一个活动namenode。

fencing方法用于确保先前活动的namenode不会执行危害系统并导致系统崩溃的操作。

同一时间QJM仅允许一个namenode向编辑日志写入数据。

当使用NFS过滤器实现共享编辑日志时,由于不能同一时间只允许一个namenode写入数据,更加需要有力的规避方法

  • 撤销namenode访问共享存储目录的权限
  • 通过远程管理命令屏蔽相应的网络端口
  • 强制先前活动的namenode断电操作
posted @ 2020-10-02 08:39  KuBee  阅读(277)  评论(0编辑  收藏  举报