美文网首页
HDFS1.0 学习笔记(二)

HDFS1.0 学习笔记(二)

作者: 武小寺 | 来源:发表于2017-12-27 11:17 被阅读0次

    机架感知策略

    • 产生的背景
      HDFS通过备份数据块的形式来实现容错,除了文件的最后一个数据块外,其它所有数据块大小都是一样的。数据块的大小和备份因子都是可以配置的。NameNode负责各个数据块的备份,DataNode会通过心跳的方式定期的向NameNode发送自己节点上的Block 报告,这个报告中包含了DataNode节点上的所有数据块的列表。文件副本的分布位置直接影响着HDFS的可靠性和性能。

    • 策略


      机架感知策略.jpg
      • 第一个副本,在客户端相同的节点(如果客户端是集群外的一台机器,就随机算节点,但是系统会便面挑选太满或者太忙的节点)
      • 第二个副本,放在不同机架(随机选择,跟第一个副本的不同的机架)的节点
      • 第三个副本,放在跟第二个副本相同的及家属的不同节点

    这种策略减少了跨机架副本的个数提高了写的性能,也能够允许一个机架失败的情况,算是一个很好的权衡。

    关于副本的选择,在读的过程中,HDFS会选择最近的一个副本给请求者。

    • 效果
      • 一个大型的HDFS文件系统一般都是需要跨很多机架的,不同机架之间的数据传输需要经过网关,并且,同一个机架中机器之间的带宽要大于不同机架机器之间的带宽。如果把所有的副本都放在不同的机架中,这样既可以防止机架失败导致数据块不可用,又可以在读数据时利用到多个机架的带宽,并且也可以很容易的实现负载均衡。但是,如果是写数据,各个数据块需要同步到不同的机架,还是会影响到写数据的效率。

    关于hadoop与网络拓扑

    在海量数据处理过程中,主要限制因素是节点之间的带宽。衡量两个节点之间的带宽往往很难实现,在这里hadoop采取了一个简单的方法,它把网络拓扑看成是一棵树,连个节点的距离=它们到最近共同祖先距离的总和,而树的层次可以这么划分:


    拓扑图
    • 镇对以下每个场景,根据机架感知策略,可用带宽依次递减:

      1.同一节点上的进程。
      
      2.同一机架上的不同节点。
      
      3.同一数据中心中不同机架上的节点。
      
      4.不同数据中心中的节点。
      
    • 例如:假设有数据中心d1, 机架r1,节点h1。该节点可以表示为/d1/r1/h1。 利用这种标记,这里给出四种距离描述:

        distance(/d1/r1/h1, /d1/r1/h1) = 0 (同一节点上的进程)
    
        distance(/d1/r1/h1, /d1/r1/h2) = 2 (同一机架上的不同节点)
    
        distance(/d1/r1/h1, /d1/r2/h3) = 4 (同一数据中心不同机架上的节点)
    
        distance(/d1/r1/h1, /d2/r3/h4) = 6 (不同数据中心中的节点)
    

    到目前为止:Hadoop 依旧不适合夸数据中心运行。

    数据完整新校验

    • 不希望在存储和处理数据时丢失或损坏任何数据
    • HDFS会对写入的数据计算校验和,并在读取数据时验证校验和
    • 俩种校验方法
      • 校验和: 检测损坏数据的常用方法是在第一次进行写入系统时计算数据的校验和,在通道传输过程中,如果新生成的校验和不完全匹配原始的校验和,name数据就会被认为是被损坏的
      • 数据块检测程序DataBlockScanner: 在DataNode节点上开启一个后台线程,来定期验证存储在它上所有块,这个是防止物理介质出现损减情况而造成的数据损坏

    HDFS中的沟通协议

    • HDFS中的沟通协议都是基于tcp/ip协议,一个客户端通过指定的tcp端口与NameNode机器建立连接,并通过ClientProtocol协议与NameNode交互。而DataNode则通过DataNode Protocol协议与NameNode进行沟通。HDFS的RCP(远程过程调用)对ClientProtocol和DataNode Protocol做了封装。按照HDFS的设计,NameNode不会主动发起任何请求,只会被动接受来自客户端或DataNode的请求。

    HDFS可靠性保证

    • 一个名字节点和多个数据节点
    • 数据复制(冗余机制)
      • 存放的位置(机架感知策略)
    • 故障检测
      • 数据节点

        ⑴ 心跳包 (检测是否宕机,若NameNode在指定时间间隔内没有收到心跳,它就认为此节点已经失败。)

        ⑵ 块报告 (安全模式下检测, NameNode启动时,会接受DataNode上传的数据块的列表,并对每个文件对应的数据块副本进行统计,当最小副本条件满足时,即一定比例的数据块都达到最小副本数,系统就会退出安全模式,而这需要一定的延迟时间。当最小副本条件未达到要求时,就会对副本数不足的数据块安排DataNode进行复制,直至达到最小副本数。而在安全模式下,系统会处于只读状态,NameNode不会处理任何块的复制和删除命令。)

        ⑶ 数据完整性检测 (校验和比较, 在读取数据块时,HDFS会对数据块和保存的校验和文件匹配,如果发现不匹配,NameNode同样会重新备份损坏的数据块)

      • 名字节点 (日志文件editlogs, 镜像文件fsimage)

    • 空间回收机制
      • Trash 目录

    HDFS的特点

    • 能做什么
      - 存储并管理PB级数据
      • 处理非结构化数据
      • 注重数据处理的吞吐量(延迟不敏感)
      • 应用模式: write-once-read-many存取模式(无数据一致性问题)
    • 不适合做什么
      • 存储小文件 (不建议)
      • 大量随机读 (不建议)
      • 需要对文件修改 (不支持)
      • 多用户写入 (不支持)

    HDFS文件写入过程

    写入过程

    hdfs有一个DistributedFileSystem实例,客户端通过调用这个实例的create()方法就可以创建文件。DistributedFileSystem会发送给NameNode一个RPC调用,在文件系统的命名空间创建一个新文件,在创建文件前NameNode会做一些检查,如文件是否存在,客户端是否有创建权限等,若检查通过,NameNode会为创建文件写一条记录到本地磁盘的EditLog,若不通过会向客户端抛出IOException。创建成功之后DistributedFileSystem会返回一个FSDataOutputStream对象,客户端由此开始写入数据

    FSDataOutputStream类转而封装成DFSDataOutputStream对象,这个对象管理着与DataNode和NameNode的I/O,具体过程是:

    1. 客户端在向NameNode请求之前先写入文件数据到本地文件系统的一个临时文件
    2. 待临时文件达到块大小时开始向NameNode请求DataNode信息
    3. NameNode在文件系统中创建文件并返回给客户端一个数据块及其对应DataNode的地址列表(列表中包含副本存放的地址)
    4. 客户端通过上一步得到的信息把创建临时文件块flush到列表中的第一个DataNode
    5. 当文件关闭,NameNode会提交这次文件创建,此时,文件在文件系统中可见
    
    • 写入整个过程详解
        1. 首先,第一个DataNode是以数据包(数据包一般4KB)的形式从客户端接收数据的,DataNode在把数据包写入到本地磁盘的同时会向第二个DataNode(作为副本节点)传送数据。
        1. 在第二个DataNode把接收到的数据包写入本地磁盘时会向第三个DataNode发送数据包
          1. 第三个DataNode开始向本地磁盘写入数据包。此时,数据包以流水线的形式被写入和备份到所有DataNode节点
          1. 传送管道中的每个DataNode节点在收到数据后都会向前面那个DataNode发送一个ACK,最终,第一个DataNode会向客户端发回一个ACK
          1. 当客户端收到数据块的确认之后,数据块被认为已经持久化到所有节点。然后,客户端会向NameNode发送一个确认
          1. 如果管道中的任何一个DataNode失败,管道会被关闭。数据将会继续写到剩余的DataNode中。同时NameNode会被告知待备份状态,NameNode会继续备份数据到新的可用的节点
          1. 数据块都会通过计算校验和来检测数据的完整性,校验和以隐藏文件的形式被单独存放在hdfs中,供读取时进行完整性校验

    HDFS读流程

    读的过程

    hdfs有一个FileSystem实例,客户端通过调用这个实例的open()方法就可以打开系统中希望读取的文件。hdfs通过rpc调用NameNode获取文件块的位置信息,对于文件的每一个块,NameNode会返回含有该块副本的DataNode的节点地址,另外,客户端还会根据网络拓扑来确定它与每一个DataNode的位置信息,从离它最近的那个DataNode获取数据块的副本,最理想的情况是数据块就存储在客户端所在的节点上

    hdfs会返回一个FSDataInputStream对象,FSDataInputStream类转而封装成DFSDataInputStream对象,这个对象管理着与DataNode和NameNode的I/O,具体过程是:

    1. 客户端发起读请求
    2. 客户端与NameNode得到文件的块及位置信息列表
    3. 客户端直接和DataNode交互读取数据
    4. 读取完成关闭连接
    

    当FSDataInputStream与DataNode通信时遇到错误,它会选取另一个较近的DataNode,并为出故障的DataNode做标记以免重复向其读取数据。FSDataInputStream还会对读取的数据块进行校验和确认,发现块损坏时也会重新读取并通知NameNode。

    • 这样设计的巧妙之处:
      • 让客户端直接联系DataNode检索数据,可以使hdfs扩展到大量的并发客户端,因为数据流就是分散在集群的每个节点上的,在运行MapReduce任务时,每个客户端就是一个DataNode节点。
      • NameNode仅需相应块的位置信息请求(位置信息在内存中,速度极快),否则随着客户端的增加,NameNode会很快成为瓶颈。

    HDFS文件删除过程

      1. 一开始删除文件,NameNode只是重命名被删除的文件到/trash目录,因为重命名操作只是元信息的变动,所以整个过程非常快。在/trash中文件会被保留一定间隔的时间(可配置,默认是6小时),在这期间,文件可以很容易的恢复,恢复只需要将文件从/trash移出即可。
      1. 当指定的时间到达,NameNode将会把文件从命名空间中删除
      1. 标记删除的文件块释放空间,HDFS文件系统显示空间增加

    HDFS&MapReduce的本地模式

    本地自己搭建

    问题

    • 机架感知策略?
    • 网络拓扑?
    • 安全模式?
      • 关于安全模式,当 Hadoop的NameNode节点启动时,会进入安全模式阶段。在此阶段,DataNode会向NameNode上传它们数据块的列表,让 NameNode得到块的位置信息,并对每个文件对应的数据块副本进行统计。当最小副本条件满足时,即一定比例的数据块都达到最小副本数,系统就会退出安全模式,而这需要一定的延迟时间。当最小副本条件未达到要求时,就会对副本数不足的数据块安排DataNode进行复制,直至达到最小副本数。而在安全模式下,系统会处于只读状态,NameNode不会处理任何块的复制和删除命令。

    相关文章

      网友评论

          本文标题:HDFS1.0 学习笔记(二)

          本文链接:https://www.haomeiwen.com/subject/wilsgxtx.html