理解HDFS

HDFS java

HDFS (Hadoop Distributed FileSystem) 是 Hadoop 分布式文件系统,以流式数据访问模式来存储超大文件,运行与商业硬件集群上,管理网络中跨多台计算机存储的文件系统,是分布式计算中数据管理的的基础。node

流式数据访问模式 : 指的是数据不是一次性获取过来,而是一点一点获取,处理流式数据也会一点一点处理。(所有接收在处理的话,延迟会很大)数据库

(1)HDFS优势express

  1. 高容错性:数据自动保存多个副本。它经过增长副本的形式,提升容错性,某一个副本丢失之后,它能够自动恢复
  2. 适合批处理
  3. 适合处理大数据
  4. 易于构建在廉价的机器上
  5. 流式数据访问

(2)HDFS不适合的领域缓存

  1.低延时数据访问安全

    好比毫秒级的来存储数据,这是不行的,它作不到。它适合高吞吐率的场景,就是在某一时间内写入大量的数据。可是它在低延时的状况下是不行的,好比毫秒级之内读取数据,这样它是很难作到的。服务器

    HDFS是单Master的,全部的对文件的请求都要通过它,当请求多时,确定会有延时。网络

  2.小文件存储数据结构

    存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息(元信息)。这样是不可取的,由于NameNode的内存老是有限的。小文件存储的寻道时间会超过读取时间,它违反了 HDFS的设计目标。架构

  三、并发写入、文件随机修改

    一个文件只能有一个写,不容许多个线程同时写。仅支持数据 append(追加),不支持文件的随机修改。

(3)HDFS针对缺点的改善措施

  • HDFS不适合低延时数据访问,可使用缓存或者多Master节点设计下降Client的数据访问压力
  • 存储小文件问题

    一、利用SequenceFile、MapFile、Har等方式归档小文件,这个方法的原理就是把小文件归档起来管理,HBase就是基于此的。对于这种方法,若是想找回原来的小文件内容,那就必须得知道与归档文件的映射关系。

    二、横向扩展,一个Hadoop集群能管理的小文件有限,那就把几个Hadoop集群拖在一个虚拟服务器后面,造成一个大的Hadoop集群。google也是这么干过的。

    三、多Master设计,正在研发中的GFS II也要改成分布式多Master设计,还支持Master的Failover,并且Block大小改成1M,有意要调优处理小文件。(Alibaba DFS的设计,也是多Master设计,它把Metadata的映射存储和管理分开了,由多个Metadata存储节点和一个查询Master节点组成。

(4)HDFS概念

  一、数据块(block)

   每一个磁盘都有默认的数据块大小,是磁盘进行读写的最小单位,构建与单个磁盘之上的文件系统经过磁盘数据块进行管理文件系统的块。相似于磁盘文件系统,HDFS中也有数据块的概念,HDFS文件系统也被划分为多个块,块做为独立单元。

   HDFS数据块特色:HDFS中的块大小比文件系统的块大,通常默认64MB(Hadoop2中默认为128MB),而文件系统为几千字节。HDFS小于一个块大小的文件不会占据整个块的空间

  二、namenode

   HDFS集群上有两类节点:管理节点namenode和工做节点datanode。

   namenode 管理文件系统的命名空间,维护整个文件系统的全部的目录和文件,以命名空间镜像文件(fsimage)和编辑日志文件(edits)的形式永久的存储在本地。namenode也记录着每一个块所在的数据节点信息(不是永久存储,数据启动时由数据节点重建)
     没有namecode节点,文件系统将没法使用,namenode节点服务的机器毁坏的话,文件系统的全部文件将会所有丢失。所以须要作好容错机制。
   第一种机制:备份namenode的元数据文件
   第二种机制:运行一个辅助的namenode服务
 
  三、datanode
     datanode是HDFS中的工做节点,根据须要存储和检索数据块(受客户端或者nodenode的调用),另外datanode会按期的将发送节点中所存储的数据块信息

  四、secondarynamenode

    secondarynamenode辅助后台程序,与namenode通讯,以便按期保存namenode的元数据快照。(namenode的备份容错机制)

  五、联邦HDFS

    namenode在内存中保存着每一个文件和每一个数据块的引用关系(元数据信息),对于一个拥有大量数据的集群来讲,namenode节点上的内存将成为限制横向扩展的瓶颈。在Hadoop2中,引入的联邦HDFS系统容许系统添加namenode实现扩展。每一个namenode管理着系统文件命名空间的一部分(例如一个namenode管理着 /usr目录下的全部文件,另外一个namenode管理着 /share目录下的全部文件)

    在联邦环境下,每一个namenode维护一个命名空间卷(包括数据源和文件的全部数据块的数据块池),命名空间卷之间是相互独立的,一个namenode的失效不会影响另一个namenode,所以集群中的datanode须要注册每一个namenode。

 

(6)HDFS结构

HDFS 采用的是Master/Slave架构存储数据,其中主要的组件:Client、namenode、datanode、secondarynamenode

Client:客户端

  1. 切分文件:文件上传 HDFS 的时候,Client 将文件切分红 一个一个的Block,而后进行存储
  2. 与 NameNode 交互,获取文件的位置信息
  3. 与 DataNode 交互,读取或者写入数据
  4. Client 提供一些命令来访问或者管理 HDFS,好比启动或者关闭HDFS

Namenode:Master节点(管理节点)

  1. 管理着HDFS文件系统的命名空间,维护整个文件系统的目录和文件(以命名空间镜像文件fsimage和编辑日志文件edits存在在本地)
  2. 记录每一个数据库所在你节点的信息(不是永久存储,数据启动时由数据节点从新建立)
  3. 做为一个管理节点,监控datanode节点的运行情况

Datanode:Slave节点(工做节点)

  1. 文件存储的地方。
  2. 按期发送节点中所存储的节点信息给namenode,让namenode了解datanode是否健康运行(默认3s)

secondarynamenode:namenode辅助节点,作日志合并,备份namenode节点做用(并不是热备份),secondarynamenode和namenode同时运行,通常来讲都是运行在不一样的机器上,namenode宕机,   secondarynamenode并不能立刻替换namenode提供服务。

  1.  辅助 NameNode,分担其工做量。
  2. ​ 按期合并 fsimage和fsedits,并推送给NameNode。
  3. ​ 在紧急状况下,可辅助恢复 NameNode。

 

(7)HDFS读写流程

Client端将数据写入到HDFS

  1. 使用HDFS提供的客户端Client, 向远程的Namenode发起RPC请求
  2. Namenode会检查要建立的文件是否已经存在,建立者是否有权限进行操做,成功则会为文件建立一个记录, 不然会让客户端抛出异常。Namenode建立一些元数据信息(datanode和数据块的引用信息)
  3. 当客户端开始写入文件的时候, 客户端会将文件切分红多个packets, 并在内部以数据队列“data queue( 数据队列) ”的形式管理这些packets, 并向Namenode申请blocks, 获取用来存储replications的合适的datanode列表, 列表的大小根据Namenode中replication的设定而定
  4. 客户端开始以pipeline( 管道) 的形式将packet写入全部的replications中。 客户端把packet以流的方式写入第一个datanode, 该datanode把该packet存储以后, 再将其传递给在此pipeline中的下一个datanode, 直到最后一个datanode, 这种写数据的方式呈流水线的形式
  5. 最后一个datanode成功存储以后会返回一个ack packet( 确认队列) , 在pipeline里传递至客户端, 在客户端的开发库内部维护着”ack queue”, 成功收到datanode返回的ack packet后会从”ack queue”移除相应的packet
  6. 若是传输过程当中, 有某个datanode出现了故障, 那么当前的pipeline会被关闭, 出现故障的datanode会从当前的pipeline中移除, 剩余的block会继续剩下的datanode中继续以pipeline的形式传输, 同时Namenode会分配一个新的datanode, 保持replications设定的数量
  7. 客户端完成数据的写入后, 会对数据流调用close()方法, 关闭数据流
  8. 只要写入了dfs.replication.min的复本数( 默认为1),写操做就会成功, 而且这个块能够在集群中异步复制, 直到达到其目标复本数(replication的默认值为3),由于namenode已经知道文件由哪些块组成, 因此它在返回成功前只须要等待数据块进行最小量的复制

客户端读取HDFS数据

  1. 使用HDFS提供的客户端Client, 向远程的Namenode发起RPC请求
  2. Namenode会视状况返回文件的部分或者所有block列表, 对于每一个block, Namenode都会返回有该block拷贝的DataNode地址。(返回block信息)
  3. 客户端Client会选取离客户端最近的DataNode来读取block; 若是客户端自己就是DataNode, 那么将从本地直接获取数据
  4. 读取完当前block的数据后, 关闭当前的DataNode连接, 并为读取下一个block寻找最佳的DataNode
  5. 当读完列表block后, 且文件读取尚未结束, 客户端会继续向Namenode获取下一批的block列表
  6. 读取完一个block都会进行checksum验证, 若是读取datanode时出现错误, 客户端会通知Namenode, 而后再从下一个拥有该block拷贝的datanode继续读

 (8)Namenode结构

  在了解Namenode结构以前,咱们先看下存储在namenode节点上的元数据信息。

  

  上图的元数据信息描述为有一个文件a.log,有三个备份,文件a.log分为两个数据块,数据块blk_一、blk_2,blk_1块在{h0,h1,h3}三个datanode 上,blk_2在{h0,h2,h4}三个datanode上

   namenode在格式化以后,会在l临时文件夹(hadoop.tmp.dir 设置,默认在/tmp/hadoop-${user.name})目录下建立一个dfs目录,以下:

  

 VERSION:是一个java properties文件,包含HDFS版本信息。

      namespaceID:文件系统的惟一标识(文件 首次格式化的时候建立,任何datanode注册到namenode以前是不知道namespaceID这个值,以此能够判断鉴别新建的datanode)
      cTime:namenode存储系统的建立时间。刚刚格式化的系统值为0,文件系统升级以后,会更新到新的时间戳
      storageType:表示存储目录包含的是namenode仍是datanode
      layoutVersion:是一个负整数,表示持久性数据结构的版本。
 edits:编辑日志文件。文件系统客户端执行写入或者修改操做的时候,这些操做首先被记录到edits中,以后在namenode的内存也会维护这些元数据。是一个appendlog
 fsimage:是存储文件元数据的镜像文件,是一个永久性检查点。
 fstime:最近一次checkpoint的时间
 
 namenode的元数据操做
    文件系统客户端在执行写操做或者修改操做的时候,首先记录在namenode中edits日志文件中,而后将元数据同步到namenode的内存中

一、Namenode始终在内存中保存metedata,用于处理“读请求。当namenode启动的时候,加载fsimage文件到内存,而且将editslog文件逐条加载到内存。而后生成新的空的editslog和新的数据最全的fsimage文件。

二、当客户端进行读写操做时,首先将日志记录到editslog,而后将日志加载到内存。

三、成功后,editslog同步到文件系统。

四、Fsimage是映像文件,是内存中元数据的checkpoint点,是一个序列化文件,不能在硬盘上直接修改。

 

SecondaryNameNode日志合并(建立检查点)

  当 edits文件的 大小和时间超过阀值,触发checkpoint时
(1)secondarynamenode会请求namenode中止使用edits文件,建立一个新的日志文件edits.new,将新的操做写入到edits.new中
(2)secondarynamenode从namenode获取edits和fsimage(经过http get)
(3)secondarynamenode将fsimage载入内存,并执行edits中的操做,生成新的fsimage文件fsimage.ckpt
(4)secondarynamenode将新的fsimage文件fsimage.ckpt发送给namenode(经过http post)
(5)namenode接收到新的fsimage文件 fsimage.ckpt,替换旧的fsimage文件,新的edits文件edits.new替换edits文件,同时更新fstime文件,记录最新的checkpoint时间,fsimage更新了,这样edits就不会愈来愈大
 
checkpoint配置
何时触发secondarynamenode日志合并?

在core-site.xml中配置fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。fs.checkpoint.size    规定edits文件的最大值,一旦超过这个值则强制checkpoint,无论是否到达最大时间间隔。默认大小是64M。

 

(9)Datanode结构

 DataNode职责:

  提供真实文件数据的存储服务。

  文件块(block):最基本的存储单位。默认64M。(Hadoop2默认128MB)

         对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每个块称一个Block。HDFS默认Block大小是64MB,以一个256MB文 件,共有256/64=4个Block.

  不一样于普通文件系统的是,HDFS中,若是一个文件小于一个数据块的大小,并不占用整个数据块存储空间。

  在Hadoop集群中,默认是有三个副本(dfs.replication配置的是HDFS存储时的备份数量),HDFS建立副本的策略通常是:

  • 第一块:本地
  • 第二块:同一机架上的不一样机器
  • 第三块:同一机房的不一样机架上的机器

  若是备份的副本设置的更多,例如备份4个的话,可能第四块在不一样机房的机器上...

 datanode目录结构

  

VERSION文件和namenode的VERSION文件差很少

  

  namespaceID是datanode首次访问namenode时获取的。

  storageID,对每一个datanode是惟一的,能够根据这个属性区分datanode  

blk_* :表示HDFS Block文件(原始的真实数据)
blk_*.meta : 表示对应blk_* Block文件的元数据。【datanode按期发送给namenode的元数据信息就是这些】

 

块文件的目录扩展

当目录下的块文件增长到必定的规模的时候,datanode会建立一个子目录存储块文件和块文件元数据。 dfs.datanode.numblocks属性设置,控制超过多少数据时,建立子目录存储块文件和元数据, dfs.data.dir属性指定磁盘上的不一样目录,这样数据块以轮转的方式(round-robin)写到各个目录中。(同一个datanode上的数据块不会重复,只有不一样datanode的数据块才可能会重复)
 
(10)安全模式
namenode启动时,首先就将fsimage文件载入内存,并执行编辑日志(edits)中的各项操做。一旦成功建立了元数据的映像,则会建立一个新的fsimage文件(不须要借助secondarynamenode)和一个空的编辑日志edits, 此时namenode监听RPC和HTTP请求,可是namenode此时运行在安全模式下。在安全模式下,namenode文件系统对于客户端是只读的 。(严格来说是访问文件系统元数据的操做是确定执行的 ,例如展现文件系统目录,对于读文件操做,只有在集群中datanode中的块是可用时,才能够读取,可是对于修改操做,例如修改权限等都会失败)
 
场景:
启动一个刚刚格式化的HDFS集群的时候,因为文件系统中尚未块,因此不会进入安全模式。
若是知足"最小副本条件",namenode会在30秒后退出安全模式(最小副本条件:指的是文件系统中99.9%的块都知足最小副本级别)
最小副本级别:默认是1,dfs.replication.min属性设置。
 
进入/退出安全模式
一、查看是否处于安全模式
hdfs dfsadmin -safemode get //hdfs dfsadmin是hdfs管理员命令

二、退出安全模式

在执行修改和写入操做的时候,须要先退出安全模式

hdfs dfsadmin -safemode wait
#command to read or write
 
三、进入安全模式
在维护和升级集群的时候很是关键,须要进入安全模式,防止在维护和升级期间的写入和修改操做。
hdfs dfsadmin -safemode enter

四、 离开安全模式

hdfs dfsadmin -safemode leave

 安全模式的下属性

属性名称 类型 默认值 说明
dfs.replication.min int 1 最小副本级别:成功执行写操做的最小副本数目
dfs.safemode.threshold.pct float 0.999 最小副本条件:在namenode退出安全模式以前,知足最小副本级别的比例。设置高于1,永远不会退出安全模式,设置为0或者太小,可能会使得namenode没法启动安全模式
dfs.safemode.extention int 30 000 在知足最小副本条件以后,namenode还须要处于安全模式的时间(毫秒),对于小集群来讲,能够设置为0

 

 (11)HDFS 命令行

  HDFS有不少接口能够和HDFS交互(java API等),命令行是最简单的,也是入门学习须要了解的。

经常使用命令

  hadoop fs 和 hdfs dfs 均可以,可是推荐使用hdfs dfs 

  经过hadoop fs -help 查看

Usage: hadoop fs [generic options]
    [-appendToFile <localsrc> ... <dst>]
    [-cat [-ignoreCrc] <src> ...]
    [-checksum <src> ...]
    [-chgrp [-R] GROUP PATH...]
    [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
    [-chown [-R] [OWNER][:[GROUP]] PATH...]
    [-copyFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
    [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] <path> ...]
    [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] [-x] <path> ...]
    [-expunge]
    [-find <path> ... <expression> ...]
    [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-getfacl [-R] <path>]
    [-getfattr [-R] {-n name | -d} [-e en] <path>]
    [-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
    [-help [cmd ...]]
    [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]]
    [-mkdir [-p] <path> ...]
    [-moveFromLocal <localsrc> ... <dst>]
    [-moveToLocal <src> <localdst>]
    [-mv <src> ... <dst>]
    [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
    [-renameSnapshot <snapshotDir> <oldName> <newName>]
    [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
    [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
    [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
    [-setfattr {-n name [-v value] | -x name} <path>]
    [-setrep [-R] [-w] <rep> <path> ...]
    [-stat [format] <path> ...]
    [-tail [-f] <file>]
    [-test -[defsz] <path>]
    [-text [-ignoreCrc] <src> ...]
    [-touchz <path> ...]
    [-truncate [-w] <length> <path> ...]
    [-usage [cmd ...]]

 HDFS管理员命令

hdfs dfsadmin 

 

 可参照:https://blog.csdn.net/jjshouji/article/details/79087601

 

 笔摘主要是对HDFS理论的上的了解,具体的操做仍是须要多多实战操做...

 

 参考:https://blog.csdn.net/dpengwang/article/details/79297435

    《Hadoop权威指南》

相关文章
相关标签/搜索