Loading

HDFS

  • 是什么?

    hdfs是hadoop生态的分布式文件系统,遵循主/从体系结构,由多台服务器联合起来实现文件存储功能
    # NameNode:负责管理元数据(文件名称,副本数量,文件位置,块大小);
    # HDFS 存储是以块存储 默认块大小128MB(取决与磁盘的传输速率,目前约为100M/s),hadoop1 中默认的块大小是64MB;
    # DataNode:主要存储真正的数据,多节点
    # secondaryNamenode:辅助节点,用于合并两类文件,减少NameNode启动时间
    # Fsimage, edits:作为元数据的镜像和操作的日志记录
    在HDFS第一次使用的时候需要对其进行格式化,目的是生成fsimage 和 edits 文件。
    
  • 优点

    # 高容错性:数据自动保存多个副本,副本丢失后,会自动恢复;
    # 适合批处理:移动计算而非数据、数据位置暴露给计算框架;
    # 适合大数据处理:GB、TB、甚至PB级数据、百万规模以上的文件数量,1000以上节点规模;
    # 流式文件访问:一次性写入,多次读取;保证数据一致性;
    # 可构建在廉价机器上:通过多副本提高可靠性,提供了容错和恢复机制
    
  • 缺点

    # 低延迟数据访问:比如毫秒级、低延迟与高吞吐率
    # 小文件存取:(1)占用NameNode大量内存,(2)寻道时间超过读取时间
    # 并发写入、文件随机修改:(1)一个文件只能有一个写,不支持多线程同时写,(2)仅支持append,不支持文件随机修改
    
  • hdfs写流程

    # 客户端向namenode请求上传文件,namenode检测用户权限和该文件是否已存在,父目录是否存在,然后返回是否可以上传
    # 客户端根据文件大小切分,默认128M,切分完成后给NameNode发送请求第一个block块上传服务器节点地址
    # namenode返回三个节点(dn1,dn2,dn3)
    # 客户端向dn1请求上传数据,dn1收到请求后会调用dn2,dn2调用dn3,建立传输通道,dn1、dn2、dn3逐级应答;
    # 客户端开始往dn1上传第一个block(先从磁盘读取放到一个本地内存缓存),以packet为单位。dn1收到一个block就会传给dn2,dn2传给dn3。dn1每传完一个packet会被放入一个应答队列等待应答;
    # 当一个block传输完成之后,客户端再次向namenode请求上传第二、第三个block,重复上面的步骤(2-4步),直至文件上传完成;
    
  • hdfs读流程

    # 客户端通过向namenode请求下载文件 ,namenode 收到请求之后查询元数据信息,找到datanode数据块的信息
    # 客户端挑选一台就近的datanode,进行请求数据
    # datanode开始传输数据给客户端,是以packet 为单位进行读取
    # 客户端 接收packet 数据,先在本地缓存,最后写入到目标文件
    
  • NameNode工作机制

    # 第一次启动: 格式化nameNode ,创建fsimage,edits. 第一次启动只需要加载fsiamge
    # 非第一次:直接加载edits ,fsimage镜像文件 ,合并成一个新的fsimage文件,再创建edits文件记录新的操作行为
    # 启动的过程中,会存在30秒钟等待时间 ,这个等待的时间就是安全模式
    
  • DataNode工作机制

    # 一个数据块在datanode上是以文件形式存储在磁盘上的,包括了两个文件,一个数据本身,一个是元数据包 包括数据块的长度,,数据块的校验和,由于HDFS上的数据是不允许被重复上传的所以在上传之前会对上传的数据进行检查 ,时间戳
    # DataNode启动后会向nameNode进行注册,通过后,会周期性的向namenode上报自己的datanode上的块信息
    # 心跳报告,每3秒钟向nameNode进行汇报,心跳的返回结果中带有NameNode带给该datanode复制数据块,移动数据块的命令, 如果说超过了10分钟datanode没有响应 ,则就会认为这个datanode节点不可用,会选择其他的机器
    
  • secondarynameNode作用

    # 并非NameNode的热备
    # 辅助NameNode,分担其工作量
    # 定期合并fsimage和edits,推送给NameNode
    # 在紧急情况下,可辅助恢复NameNode
    
  • secondarynameNode工作机制

    # 2NN询问NN是否需要CheckPoint(合并镜像和编辑日志),并带回NameNode是否执行结果(每隔一小时)
    # 2NN请求执行CheckPoint
    # NN滚动正在写的Edits编辑日志
    # 将滚动前的编辑日志和镜像文件拷贝到2NN
    # 2NN加载编辑日志和镜像文件到内存,并执行合并,生成新的镜像文件fsimage.chkpoint
    # 2NN拷贝fsimage.chkpoint到NN
    # NN将fsimage.chkpoint重新命名成fsimage,替换之间旧的fsimage
    
  • HDFS 安全模式

    # hadoop的一种保护机制
    # 正常情况下,namenode会在元数据中保留所有块位置的映射信息;安全模式下,会检测块的完整性
    # 不允许客户端进行任何修改文件的操作,包括上传文件,删除文件,重命名,创建文件夹等操作
    # 如果满足“最小副本条件”,namenode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以namenode不会进入安全模式
    # 什么时候进入安全模式:NN创建一个新的Fsimage文件和一个空的编辑日志,此时NN开始监听DataNode请求,这个过程期间,NameNode处于安全模式
    
    # 安全模式操作
    (1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
    (2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
    (3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
    (4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
    
    
  • 问题集锦

    • 1。HDFS在读取文件的时候,如果其中一个块突然损坏了怎么办?
      • 客户端读取完DataNode上的块之后会进行checksum 验证
      • 校验结果不一致,客户端会通知 NameNode , 从下一个拥有该 block 副本的DataNode 继续读
    • 2.HDFS在上传文件时,DataNode突然挂掉?
      • 客户端上传文件时与DataNode建立pipeline管道
      • 管道正向是客户端向DataNode发送的数据包
      • 管道反向是DataNode向客户端发送ack确认
      • 当DataNode突然挂掉了,客户端接收不到这个DataNode发送的ack确认
      • 客户端会通知 NameNode,NameNode检查该块的副本与规定的不符
      • NameNode会通知 DataNode去复制副本,并将挂掉的DataNode作下线处理,不再让它参与文件上传与下载
      • 如何保证NameNode数据存储安全?
        • NameNode HA
    • NameNode HA中,脑裂问题怎么解决?
      • NameNode1 和 NameNode2 都处于 Active 状态,都可以对外提供服务,会导致数据会发生错乱且无法恢复
    • 小文件过多会有什么危害?
      • 文件的元数据信息是存储在namenode的内存中,过多的话会导致NameNode的内存溢出,而文件无法写入
      • HDFS中放小文件必须进行优化,不能将小文件(类似1MB的若干小文件)直接放到HDFS中
posted @ 2022-01-10 21:42  偏执的感叹号  阅读(185)  评论(0)    收藏  举报