zoukankan      html  css  js  c++  java
  • 二、HDFS(架构、读写、NN)

    一、HDFS定义

    HDFS (Hadooop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合走来实现其功能,集群中的服务器有各自的角色。

    HDFS的使用场景:适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

    二、HDFS优缺点

    2.1、优点

    1) 高容错性

    • 数据自动保存多个副本。它通过增加副本的形式,提高容错性。
    • 某一个副本丢失后,它可以自动恢复。

    2) 适合处理大数据

    • 数据规模:能够处理数据规模达GB、TB、甚至PB级别的数据;
    • 文件规模:能够处理百万规模以上的文件数量,数量相当之大。

    3) 可构建在廉价机器上,通过多副本机制,提高可靠性。

    2.2 缺点

    1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的

    2)无法高效的对大量小文件进行存储

    • 存储大量小文件的话,它会占用NameNode大量的内存来存储和目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
    • 小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。

    3)不支持并发写入、文件随机修改。

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

    三、HDFS组成架构

    四、HDFS写数据流程(参考)

     

     

    1.Client调用DistributedFileSystem对象的create方法,创建一个文件输出流(FSDataOutputStream)对象。

    2.通过DistributedFileSystem对象与Hadoop集群的NameNode进行一次RPC远程调用,在HDFS的Namespace中创建一个文件条目(Entry),该条目没有任何的Block。

    3.通过FSDataOutputStream对象,向DataNode写入数据,数据首先被写入FSDataOutputStream对象内部的Buffer中,然后数据被分割成一个个Packet数据包。

    4.以Packet最小单位,基于Socket连接发送到按特定算法选择的HDFS集群中一组DataNode(正常是3个,可能大于等于1)中的一个节点上,在这组DataNode组成的Pipeline上依次传输Packet。

    5.这组DataNode组成的Pipeline反方向上,发送ack,最终由Pipeline中第一个DataNode节点将Pipeline ack发送给Client。

    6.完成向文件写入数据,Client在文件输出流(FSDataOutputStream)对象上调用close方法,关闭流。

    7.调用DistributedFileSystem对象的complete方法,通知NameNode文件写入成功。

    在向HDFS中写数据的时候,当写某一副本时出错怎么处理?

    1.首先会关闭管线。

    2.将已经发送到管道中但是没有收到确认的数据包重新写回数据队列,这样无论哪个节点发生故障,都不会发生数据丢失。这个过程是在确认队列中将未收到确认的数据包删除,写回到数据队列。

    3.然后当前正常工作的数据节点将会被赋予一个新的版本号(利用namenode中租约的信息可以获得最新的时间戳版本),这样故障节点恢复后由于版本信息不对,故障DataNode恢复后会被删除。

    4.在当前正常的datanode中根据租约信息选择一个主DataNode,并与其他正常DataNode通信,获取每个DataNode当前数据块的大小,从中选择一个最小值,将每个正常的DataNode同步到该大小。然后重新建立管道。

    5.在管线中删除故障节点,并把数据写入管线中剩下的正常的DataNode,即新的管道。

    6.当文件关闭后,namenode发现副本数量不足时会在另一个节点上创建一个新的副本。

    五、HDFS读数据流程

     

    1.初始化FileSystem,然后客户端用FileSystem的open函数打开文件

    2.FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。

    3.FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用FSDI的read()函数开始读取数据。

    4.FSDataInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端。

    5.当此数据块读取完毕时,FSDataInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

    6.当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。

    7.在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。

    8.失败的数据节点会被记录,此后不再连接。

    六、NN和2NN工作机制 (Fsimage EditLog定义及合并过程)

    fsimage文件:即命名空间映像文件,是内存中的元数据在硬盘上的checkpoint,包含文件系统中的所有目录和文件inode的序列化信息。

    edits:文件系统的写操作首先把它记录在edit中。

     

    合并过程

    1.secondary namenode通过周期性(五分钟),通过getEditLog获取editlog大小,当其达到合并的大小时通过RollEditLog方法进行合并。

    2.namenode停止使用edits文件,并生成一个新的临时的edits.new文件。

    3.Secondarynamenode通过namenode内建的Http服务器,以get的方式获取edits与fsimage文件。Get方法中携带着fsimage与edits的路径。

    4.Secondaryname将fsimage载入内存并逐一执行edits中的操作,生成新的fsimage文件。

    5.执行结束后,会向namenode发送http请求,告知namenode合并结束,namenode通过http post的方式获取新fsimage文件。

    6.Namenode更新fsimage文件中记录检查点执行的时间,并改名为fsimage文件。

    7.Edit.new文件更名为edit文件。

    注:由此可知namenode 与 secondarynamenode 有着相似的内存需求,因为secondarynamenode也会将fsimage载入内存,因此secondarynamenode需要运行在一台专门机器上。

     

     七、DataNode工作机制

     

    1一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据校验和,以及时间戳

    2DataNode启动后向NameNode注册,通过后,周期性(1小时NameNode上报所有的块信息。

    3心跳是每3一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。

    4集群运行中可以安全加入和退出一些机器

  • 相关阅读:
    BZOJ3674:可持久化并查集加强版
    BZOJ3772:精神污染
    BZOJ3932:[CQOI2015]任务查询系统
    BZOJ3123:[SDOI2013]森林
    BZOJ1926:[SDOI2010]粟粟的书架
    029 列表类型内置方法
    02 Python爬虫之盗亦有道
    01 Python爬虫之Requests库入门
    028 字符串类型内置方法
    027 数字类型内置方法
  • 原文地址:https://www.cnblogs.com/lisen10/p/11353894.html
Copyright © 2011-2022 走看看