HDFS--梳理各个模块的功能与关系

概述

·  1.HDFS是hadoop的一个组件 全称:Hadoop Distributed File System,专门存储超大数据文件,为整个Hadoop生态圈提供了基础的存储服务。

一、技术细节
  1.用于管理的节点称之为NameNode
  
  2.用于存储的节点称之为DataNode
  
  3.元数据:用于存储NameNode寻找DataNode的信息
存储的信息:
  a.文件所对应的文件块
  b.每个文件块所对应的节点位置
  c.每个文件块对应其复本位置
  d.例如:
  /test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}],表示存储的文件是a.log,存储在/test目录下,默认复本数量为3,切了2个Block
  
  4.会对存入的数据进行切块,每一个块称之为是一个Block,再将每一个Block存储到某一个DataNode上

5.每一个block默认为128M(hadoop2.0)大小;hadoop1.0默认的是64M。

6.HDFS会对文件块进行备份,备份称之为复本—replication
  
  7.HDFS中复本数量默认为三(这个文件块在HDFS中总共存在三份),上传一个文件之后HDFS自动将这个文件备份两份,一共凑成三份
  
  8.如果某一个DataNode宕机,那么NameNode会将这个DataNode中存储的复本自动复制一份放到其他节点上,保证整个集群中的复本数量
  
  9.NameNode中元数据会再内存中维系一份,是为了快速读写,每一条元数据大小大概是150个字节左右
  
  10.在HDFS中不适合存储大量的小文件,因为大量的小文件会产生大量的元数据,导致NameNode的内存大量被占用,会降低NameNode的读写效率。
  
  11.启动HDFS:start-dfs.sh

·  我们通过配图连理一下各个模块之间的关系(在后续的文章中会具体将具体的操作)
  HDFS--梳理各个模块的功能与关系_第1张图片
  如果把整个HDFS看作是一个存储数据的仓库的话,Namenode就相当于这个仓库的管理员,进、出、修改都要经过Namenode;
  Metadata就相当于一个账本,当用户进行查询,修改等操作的时候,先找到Namenode这个管理员,管理员就翻Metadata这个账本,账本上记录着文件分为哪几块,这几块分别放在哪个货架,以及这些信息的替代品的位置等信息
  Datanode可以大体看作是这个仓库的货架,用于具体的存储信息

二、Block
  1.本身表示一个数据块
  
  2.Block是HDFS中存储数据的基本单位
  
  3.每一个block默认是128M
  
  4.切块的目的:
   a.能够存储超大文件(将超大的文件进行分割,可以分布在不同的DataNode上,减轻服务器的压力)
  b.为了能够进行快速的备份(分割以后可以将各个小块同时进行存储。就好像有一吨的货物,分开3个车拉的效率会高于只用1个车的效率)

三、NameNode
  1.NameNode负责管理DataNode,维系元数据.

·  2.再Hadoop1.0中,NameNode只有一个,存在单点问题(如果一个NameNode宕机,整个HDFS就会瘫痪)
再2.0中,完全分布式中,NameNode最多可以设置2个(2个以上就会出现选举等问题,降低HDFS的效率。2个一个工作,一个备用,避免了单点问题)

·  3.元数据存储在内存中和磁盘中
·  
  ·4.元数据存储再内存中目的是为了快速读写。

·  5.元数据存在磁盘中是为了奔溃恢复

·  6.元数据的存储位置又hadoop.tmp.dir属性来决定,如果不配置,默认是再/tmp下,所以这个属性必须配置(因为tmp目录是一个临时目录,在linux内存不够时,删除首先考虑tmp目录下的文件)

·  7.元数据存储在dfs/name/current目录下

·  8.记录元数据的文件:
·  a. edits:记录操作的文件
·   b. fsimage:记录元数据的文件。这个文件中的元数据并不是实时的。

·  10.内存中的元数据是实时的

·  11.每一写操作访问NameNode的时候。是先将这个操作记录到eidts文件中,如果edits文件写成功了(磁盘中),那么再将这个操作更新到内存中,内存更新成功以后,会向客户端反馈一个成功消息(先写磁盘再写内存,保证数据的一致性)

·  12.fsimage中的元数据 + edits中的操作=内存中的元数据 将edits中的操作更新到fsimage中,这个时候fsimage中的数据才和内存中的数据一致。

·  13.如果NameNode重启,那么会从磁盘中恢复元数据

·  14.再HDFS重启的时候,HDFS会自动将edits中的操作更新到fsimage文件中,保证内存中的元数据最新的元数据

·  15.重启的时候进行数据回复的过程称之为安全模式

·  16.在安全模式下,会进行数据的恢复,等待DataNode的应答,检查复本数量,保证最小复本量

·  17.在伪分布式下,复本数量一定是1;如果在复本数量>1,那么HDSF将无法离开安全模式

·  18.安全模式下,检查完毕会自动推出安全模式

·  19.强制推出安全模式—这个操作不建议

·  20.在安全模式下,HDFS只提供读,不提供写

四、DataNode
  1.存储数据,数据是以block形式存储
  
  2.Block存储在DataNode的磁盘上存储在:
  dfs/data/current/BP-1254126929-192.168.44.133-    1546418895223/current/finalized/subdir0/subdir0,注意这个路径中的BP-XXX-XXX会根据节点不同以及编号不同发生改变

·  3.DataNode在存储Bolock的时候会对Block进行编号

·  4.DataNode重新启动的时候,会主动向NameNode发送信息,信息包含当前DataNode存储的数据信息

·  5.在HDFS启动之后,DateNode会定时的向NameNode发送心跳信息—心跳机制(两个节点之间会定时的进行通信)

·  6.DataNode会每隔3秒向NameNode发送一次心跳信息。
心跳信息包含:
  a.当前节点的状态
  b.当前节点存储的数据块的信息

·  7.NameNode每3s会收到某一个DataNode的心跳信息,如果超过10min没有收到某个DataNode心跳信息,认为这个DataNode已经丢失(lost),那么NameNode会将这个节点中存储的数据块去复制到其他节点上。

五、SecondaryNameNode
·  1.SecondaryNameNode不是NameNode的备份,而是辅助NameNode进行元数据的合并

·  2.edits和fsimage文件的合并触发条件:
  a.HDFS重新启动
  b.空间:在core-site.xml中配置fs.checkpoint.size设置edits文件的大小,当edits文件达到指定的大小的时候就会进行合并—默认是64M
  c.时间:在core-site.xml配置fs.checkpoint.period设置edits操作时间,每隔指定的时间对edits文件和fsimage文件进行合并—默认是3600s

·  3.合并的过程发生在SecondaryNameNode上

·  4.合并过程
  a.SecondaryNameNode通过网络将edits文件和fsimage文件考到SecondaryNameNode上
   b.NameNode中产生一个新文件edtis.new,后续操作写到edits.new中,
  c. 在SecondaryNameNode中,将fsimage文件加载到内存中,然后将edits文件中的操作更新到内存中,然后将内存中的数据写到一个新文件 — fsimage.ckpt中
  d. SecondaryNameNode通过网络将fsimage.ckpt拷贝到NameNode上
  e .在NameNode中,会将fsimage.ckpt重命名为fsimage,将edits.new重命名为edits

·  5.SecondaryNameNode不是NameNode的热备,但是他也能起到一定的备份作用,也就意外着,在极端的情况下会产生数据丢失

·  6.在Hadoop2.0的完全分布式中,抛弃了SecondaryNameNode,而是采用了双NameNode机制来进行热备

六、多复本放置策略

·  1.第一个复本:
·  a.如果是从集群之外的客户端上传的复本,那么NameNode会去找个相对比较空闲的节点来存储这个复本
·  b.如果是从某一个DataNode内部上传,那么从哪一个DataNode上传,将这个复本放到哪个DataNode上

·  2.第二个复本:放到和第一个复本不同机架的节点上

·  3.第三个复本:放到和第二个复本相同机架的节点上

·  4.更多复本:随机放置

扩展:机架感知策略
·  通过映射关系,建立逻辑机架,习惯上将同一个物理机架张的节点也设置为同一个逻辑机架

你可能感兴趣的:(学习,hadoop,学习借鉴)