Hadoop--HDFS

Hadoop

简介

一、概述

  1. Hadoop是Apache提供的一套开源的、可靠的、可扩展(可伸缩)的、用于分布式计算的框架
  2. Apache Hadoop对版本的管理的控制是非常混乱的

二、发展历程

  1. 创始人:Doug Cutting和Mike Caferalla
  2. 在2002年,Doug和Mike想设计一套搜索引擎Nutch,爬取了全网的10亿个网页的数据
  3. 在2003年,Google发表了一篇论文(简称为GFS)阐述了GFS的存储原理,Doug就根据这篇论文设计实现了NDFS - Nutch Distributed FileSystem
  4. 在2004年,Google发表了一篇论文阐述了谷歌的搜索引擎的分布式计算的思想。Doug根据这篇论文设计实现了Nutch中的MapReduce
  5. 从Nutch0.8版本开始,Doug就将NDFS以及MapReduce从Nutch中分离了出来形成了一个新的系统Hadoop,同时将NDFS更名为HDFS
  6. 在2008年,Doug携带着Hadoop去了Yahoo。Doug在Yahoo工作期间还参与实现了Pig、HBase等框架
  7. Yahoo将Hadoop、Pig、HBase等框架都贡献给了Apache
  8. Hadoop的厂商:Apache、CDH、Hotston、MapR

三、Hadoop的版本

  1. Hadoop1.X:Common、HDFS以及MapReduce
  2. Hadoop2.X:Common、HDFS、MapReduce以及Yarn。Hadoop2.x和Hadoop1.x不兼容
  3. Hadoop3.X:Common、HDFS、MapReduce以及Yarn。从3.1版本开始支持Ozone

四、Hadoop的模块

  1. Common:基本模块,用于支持其他的模块
  2. HDFS:用于进行数据的分布式
  3. Yarn:用于进行任务调度和资源
  4. MapReduce:用于进行对数据的分布式计
  5. Ozone:对象存储
  6. Submarine:机器学习引擎

HDFS

一、概述

  1. HDFS(Hadoop Distributed FileSystem)是Hadoop中用于进行分布式存储的组件
  2. 根据谷歌的论文设计实现的

二、特点

  1. 能够存储超大文件 - 切块
  2. 能够快速应对和检测故障 - 心跳
  3. 简化的一致性模型 - 一次写入多次读取,从Hadoop2.0开始,HDFS允许追加写入
  4. 能够在廉价的机器上来进行搭建和横向扩展
  5. 做不到低延迟的响应
  6. 不建议存储大量的小文件
  7. 不支持事务

技术细节

一、概述

  1. HDFS在存储数据的时候会将数据进行切块(Block)
  2. HDFS中两类主要节点:NameNode和DataNode
  3. 在HDFS中,会对每一个块进行备份,这些备份称之为副本(replication)。默认的副本数量为3

              Hadoop--HDFS_第1张图片

二、Block

  1. 表示数据块,HDFS中数据存储的基本形式也是Block
  2. 在Hadoop2.X中,每一个Block默认是128M,可以通过dfs.blocksize调节Block的大小,单位默认是字节
  3. 如果一个文件本身不到一个Block的大小,那么这个文件会作为一个Block进行存储,在存储的时候,这个文件本身是多大那么就占用多大的空间。例如一个文件只有10M,那么这个文件对应的Block也就只有10M
  4. 切块的意义:(1):切块是为了能够存储超大文件,(2)为了快速进行备份保证副本数量
  5. 在切块的时候,并不是不同的块就一定放在不同的节点上
  6. HDFS会对每一个块分配一个递增的编号-BlockID

三、NameNode

   (1):NameNode在HDFS中负责管理DataNode以及存储元数据(metadata)

   (2):元数据 - 是对上传的文件的描述信息,主要包含:

            a:元数据存储路径

             b:文件的权限

             c:记录文件大小以及Block的大小

             d:Block和DataNode的映射关系

             e:记录每一个文件的副本数量

    (3):元数据在NameNode的存储在内存中以及磁盘中

    (4):元数据存储在内存中的目的:快速操作

    (5):元数据存储在磁盘中的目的:奔溃恢复

    (6):元数据再磁盘中的存储位置由Hadoop.tmp.data属性决定

    (7):元数据在磁盘上的存储和fsimage和edits文件有关:

            a:edits文件记录HDFS的写操作

            b:fsimage文件记录的元数据- fsimage中的元数据和内存中的元数据不是实时的 - fsimage中的元数据往往落后于内                           存中的元数据

    (8):当NameNode接收到写操作的时候,先将写操作记录到edits——inprogress,如果记录成功,则将该操作更新到内存                     中修改内存中的元数据。更新完成之后就会给客户端返回一个元数据成功的信号

    (9):fsmage在更新的时候,会先将edits_inprogress滚动成edits_XXXX-XXX,然后再将滚动出来的edits文件中的数据转                      换成命令执行到fsimage中,同时这个过程中,会产生一个edits_inprogress

    (10):fsmige的更新条件:

              a:时间角度:当距离上一次的更新过去了指定的时间(默认是3600,单位是s,几距离上一次更新过去一个小时)                            之后,就会将edits中的操作更新到fsimage中。这个时间可以通过fs.chechpoint.period进行配置

               b:空间大小:大edits文件到达指定大小(默认是64M,即edits文件达到64M)之后,也会更新,这个大小可以通过                          fs.checkpoint.size

               c:强制更新:Hadoop admin -rollEdits

               d:重启更新:当NameNode重新启动的时候,也会触发更新

     (11):NameNode通过心跳机制来管理DataNode-DataNode会定时向NameNode发送心跳信息

     (12):DataNode每隔3s(可以通过dfs.heart.interval)来设置,默认单位是向NameNode发送一次心跳信息,实际开发中                       会将这个时间调大一些

      (13):NameNode如果在指定的时间内(默认是10min)没有收到DataNode的心跳,那么NameNode就会认为这个                                DataNode已经lost,那么NameNode就会将这个DataNode已经lost,那么NameNode就会将这个DataNode的数据                        在其他的DataNode上来备份一次保证整个集群中的副本数量。

      (14):DataNode通过RPC请求发送心跳信息

      (15):心跳信息主要包含:

                 a:当前DataNode的状态 :服役状态、预服役、预退役、退役

                 b:当前DataNode中的Block信息----就是BlockID组成的队列

       (16):当HDFS集群重启的时候,NameNode先将edits中的操作更新到fsimage中,将fsimage中的元数据加载到内存中,                       等待DataNode的心跳,如果有的DataNode的心跳没有收到,那么需要进行备份,如果收到了DataNode的心跳,校                     验DataNode上的Block信息,同时NameNode保证整个集群中的副本数量,这个过程称之为安全模式(safe                                   mode)。如果校验失败,那么NameNode会试图恢复数据并且重新校验,如果所有的校验都通过,那么                                       NameNode会自动退出安全模式。

       (17):如果在不合理的时间内,HDFS一直没有退出安全模式,那么说明数据产生丢失-强制退出安全模式Hadoop                                    dfsadmin-safemode leave

       (18):也正是因为安全模式的存在,在所有的伪分布模式下,副本的数量必须为1,如果副本数量>1,会导致HDFS一直处                       于安全模式而不能退出

        (19):在Hadoop2.0的为分部中只允许一个NameNode,但是Hadoop2.0的完全分布式中默认也只有1个NameNode,在实                      际开发中,允许完全分布式存在2个NameNode形成NameNode的HA(高可用)

        (20):NameNode是HDFS中的效率瓶颈----联邦HDFS

   四、副本放置策略

        (1):第一个副本:如果第一个副本是从集群内部上传,那么哪个DataNode上传就将数据放在哪个DataNode上;如果第一                  个 副本是从集群外部上传,那么NameNode就会选取相对空闲的结点存储副本

        (2):第二个副本:在Hadoop2.7之前,第二个副本放在和第一个副本不同的机架的节点上,从Hadoop2.7开始,第二个副                    本相同的机架上的节点上

        (3):第三个副本:在Hadoop2.7之前,第三个副本放在和第二个副本相同机架的节点上。从Hadoop2.7开始,第三个副本是                    放在和第二个副本不同机架的节点上。

         (4):更多副本:散落在空闲的节点上

五、机架感知策略

       (1):所谓的机架本质上就是一个映射----将主机名或者IP映射到指定的机架上

       (2):可以将不同物理机架上的节点映射到同一个逻辑机架上

       (3):实际开发中,往往是将同一个或者几个物理机架上的节点映射到同一个逻辑机架上

 六、DataNode

       (1):负责存储数据,并且数据是以Block形式存储

       (2):DataNode会将Block存在dfs/data目录下

       (3):DataNode会定时向我们的NameNode发送心跳

七、SecondaryNameNode

       (1):并不是NameNode的备份(只能起到一部分的备份作用,但是并不能和NameNode形成热备)。只是辅助我们的                           NameNode进行edits文件和fsimage文件的合并更新

       (2):实际开发中,如果没有设置SecondaryNameNode,更新过程就会NameNode自己完成。

       (3):实际开发中,一般不设置SecondaryNameNode,而是设置2个NameNode,形成NameNode的备份

       (4):完全分布式:NameNode+SNN(这种方式一般不使用)或者2个NameNode

八、回收站机制

       (1):在HDFS中,回收站默认是不开启的

       (2):配置回收站,默认时间是min,1440是一天24*60=1440分钟

   1. 进入Hadoop的安装目录下的子目录etc/hadoop:cd hadoop-2.7.1/etc/hadoop
   2. 配置core-site.xml
		a. 编辑core-site.xml:vim core-site.xml
		b. 添加如下内容:
		
		    fs.trash.interval
		    1440
		
		c. 保存退出

dfs目录

一、概述

       (1):dfs目录表示HDFS的存储目录

               a:dfs/name表示NameNode的持久化目录

               b:dfs/data表示DataNode的存储目录

               c:dfs/namesecondary表示SecondaryNameNode的存储目录

       (2):实际过程中,由于NameNode、DataNode以及SecondaryNameNode应该分布在不同的节点上,所以name、data、                     nameseconda三个目录也应该出现在不同的节点上

       (3):dfs目录在NameNode被格式化的时候出现

       (4):当格式化后,启动HDFS前,会生成一个最初的fsimage_0000000000000000000文件,该文件中存储的根节点的信息

       (5):dfs/name/in_use.lock文件的作用是防止在同一台服务器上启动多个NameNode,避免管理紊乱

       (6):当启动HDFS时,会生成edits文件

       (7):HDFS中有事务id的概念,当HDFS每接收一个写操作(比如:mkdir put mv),都会分配全局递增的事务id,然后写到                edits文件中

       (8):每生成一个新的edits文件,edits文件中都会以OP_START_LOG_SEGMENT开头,当一个edits文件写完后,会以                        OP_END_LOG_SEGMENT结尾。即在OP_START_LOG_SEGMENT- OP_END_LOG_SEGMENT存储的是这个edits                  文件所有的事务记录

       (9):上传在edits中的拆解

               a:OP_ADD 将文件加入到指定的HDFS目录下,并以._Copyging_结尾,表示此文件还未写完

               b:ALLOCATE_BLOCK_ID 为文件分配块ID

               c:SET_GENSTAMP_V2 为块生成时间戳版本号,是全局唯一的

               d:ADD_BLOCK 写块数据

               e:OP_CLOSE  表示块数据写完

               f:OP_RENAME_OLD 将文件重命名,表示写完

               查看edit文件的命令:

 查看edits文件:hdfs oev -i edits文件 -o xxx.xml。例如:hdfs oev -i edits_0000000000000000001-0000000000000000003 -o edits.xml

       (10):初次使用HDFS时,有一个默认的edits和fsimage的合并周期(1分钟),以后在使用HDFS的过程中,达到条件                             edits_inprogress会和fsimage进行合并

       (11):文件上传成功之后不能修改

       (12):每一个fsimage文件对一个MD5 文件为了对fsimage文件进行校验防止fsimage文件被动改动

       (13):Version文件:

                a:clusterID:集群编号。在NameNode被各式化的时候,会自动计算产生一个clusterID,并且在HDFS启动之后,会                  将clusterID发送给每一个DataNode。DataNode每一次心跳都会携带clusterID,NameNode每次格式化都会生成一个                    clusterID,但是DataNode只接收一次clusterID 

                b:storageType:结点类型

                c:blockpollID:块池ID。块池是在联邦HDFS中使用(可以解决一个NameNode带来的瓶颈)

  HDFS流程

        (1):写流程(下载)

                a:客户端调用FileSystem 实例的open 方法,获得这个文件对应的输入流InputStream。

                b:通过RPC 远程调用NameNode ,获得NameNode 中此文件对应的数据块保存位置,包括这个文件的副本的保存位                        置( 主要是各DataNode的地址) 。

                c:获得输入流之后,客户端调用read 方法读取数据。选择最近的DataNode 建立连接并读取数据。

                d:如果客户端和其中一个DataNode 位于同一机器(比如MapReduce 过程中的mapper 和reducer),那么就会直接从                         本地读取数据。

                e:到达数据块末端,关闭与这个DataNode 的连接,然后重新查找下一个数据块。

                f:不断执行第2 - 5 步直到数据全部读完。

                g:客户端调用close ,关闭输入流DF S InputStream。

               Hadoop--HDFS_第2张图片

                       Hadoop--HDFS_第3张图片

 

补充:

        高并发:并发和线程量有关

        高吞吐:吞吐和数据量有关----如果一台服务器1s能够读写100M数据

        一般的高吞吐一般是高并发的,高并发不一定是高吞吐的

        (2):写流程(上传)

                                        Hadoop--HDFS_第4张图片

 

                a:客户端发起RPC请求到NameNode

                b:NameNode收到请求之后,进行校验:例如

                      ①:校验是否有权限操作对应路径

                      ②:校验指定路径下是否有同名的文件

                c:如果都检验成功的话,则NameNode会在元数据中先记录_COPYING_,记录成功之后会给客户端发送一个客户端

                      的响应,这个响应中应该包含BlockSize

                d:客户端在收到响应的时候,会计算文件的切块数量,将文件切块

                d:客户端会再给NameNode发送信息要第一个块的存储地址

                f:NameNode在收到请求之后,会给Block非配一个BlockID,会等待DataNode的心跳,选择比较空闲的DataNode放                      入队列中发送给客户端

                g:客户端收到队列之后,从中选择比较近的节点来写入这个快的第一个副本,这个副本所在的DataNode通道通过                           pipeline管道,实际上是基于NIO实现的,将副本写到其它的DataNode上保证副本的数量,所有的副本写完之后会                         给客户端返回一个ACK信号,表示所有的副本都写完了

                h:客户端再写写一个Block

                k:当客户端写完所有的Block,通知NameNode关闭文件(关流)。此时稳健不可改动

                l:NameNode将_COPYING文件重命名   

        (3):删流程

               a:客户端发起RPC请求到NameNode

               b:NameNode收到请求之后,先将这个删除记录到edits文件中,然后更新内存,给客户端返回一个ack信号表示删除                         成功,注意,此时这个文件依然存储在HDFS上

               c:DataNode给NameNode发送心跳时候,NameNode就会发现DataNode出现元数据未存储的数据,NameNode就睡                      认为这个数据是被删除的数据,那么就会给DataNode一个心跳相应,命令DataNode删除掉对应的数据。DataNode                      在收到响应之后才会删除掉对应的Block

 

                

          

 

 

 

 

 

         

 

 

 

 

 

 

 

 

你可能感兴趣的:(HADOOP,HDFS,分布式存储,DataNode,NameNode)