• HDFS面试问题总结


    HDFS的读写流程步骤

    1、HDFS的写入流程:

    1. 判断是否可以上传:client 发起文件上传请求,通过 RPC 与 NameNode 建立通讯,NameNode 检查目标文件是否已存在,父目录是否存在,返回是否可以上传;
    2. 要上传到哪些结点上:client 请求第一个 block 该传输到哪些 DataNode 服务器上;
      NameNode 根据配置文件中指定的备份数量及副本放置策略进行文件分配,返回可用的 DataNode 的地址,如:A,B,C;
      client 请求3台 DataNode 中的一台A上传数据(本质上是一个 RPC 调用,建立 pipeline),A收到请求会继续调用B,然后B调用C,将整个 pipeline 建立完成,后逐级返回 client;
    3. 客户端发package给第一个节点,第一个节点发给第二节点,直到发送给最后一个节点 给client 开始往A上传第一个 block(先从磁盘读取数据放到一个本地内存缓存),以 packet 为单位(默认64K),A收到一个 packet 就会传给B,B传给C;A每传一个 packet 会放入一个应答队列等待应答。
      数据被分割成一个个 packet 数据包在 pipeline 上依次传输,在 pipeline 反方向上,逐个发送 ack(ack 应答机制),最终由pipeline中第一个 DataNode 节点A将 pipeline ack 发送给client;
      当一个 block 传输完成之后,client 再次请求 NameNode 上传第二个 block 到服务器。

    2、HDFS的读取流程:

    1. 我的判断是否可以读取,拿到地址: Client 向 NameNode 发起 RPC 请求,来确定请求文件 block 所在的位置;
    2. 返回含有block的节点地址: NameNode 会视情况返回文件的部分或者全部 block 列表,对于每个 block,NameNode 都会返回含有该 block 副本的 DataNode 地址;
    3. 节点排序,优先从近的节点读取数据: 这些返回的 DataNode 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client近的排靠前;心跳机制中超时汇报的 DataNode 状态为 STALE,这样的排靠后;
      Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是 DataNode,那么将从本地直接获取数据;底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
    4. 继续读取剩余的节点: 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向 NameNode 获取下一批的 block 列表;
      读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的 DataNode 继续读。
      read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回 Client 请求包含块的 DataNode 地址,并不是返回请求块的数据;
      最终读取来所有的 block 会合并成一个完整的最终文件。
      原文链接:https://blog.csdn.net/qq_17685725/article/details/123243677

    HDFS架构和组成

    Hdfs 采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成NameNode, DataNode,client,和SencondayNameNode组成
    NameNode(Master):
    管理 HDFS 的命名空间,维护元数据。
    接收客户端的请求。
    管理数据块(Block)映射信息.
    配置副本策略
    DataNode(Slave):
    存储实际的数据块 。
    执行数据块的读/写操作。
    向namenode上传心跳信息。
    Client(客户端):
    1、文件上传 HDFS 的时候,Client 将文件切分成Block,然后进行存储。
    2、与 NameNode 交互,获取文件的位置信息。
    3、与 DataNode 交互,读取或者写入数据。
    4、Client 提供一些命令来管理 HDFS,比如启动或者关闭HDFS。
    SencondayNameNode(辅助工作者):
    1、辅助 NameNode,分担其工作量。
    2、定期合并 fsimage和fsedits,并推送给NameNode。
    3、在紧急情况下,可辅助恢复 NameNode。
    原文链接:https://blog.csdn.net/weixin_43893397/article/details/114047237

    HDFS存储

    在hdfs中所有的文件都是以 block 块的方式存放在 HDFS 文件系统当中, 在 Hadoop1当中, 文件的 block 块默认大小是 64M, hadoop2 当中, 文件的 block块大小默认是 128M, block 块的大小可以指定:

    引入块机制的好处:
    一个文件有可能大于集群中任意一个磁盘,使用块抽象而不是文件可以简化存储子系统
    块非常适合用于数据备份进而提供数据容错能力和可用性
    块缓存:
    通常 DataNode 从磁盘中读取块, 但对于访问频繁的文件,其对应的块可能被显式的缓存在 DataNode 的内存中, 以堆外块缓存的形式存在.默认情况下,一个块仅缓存在一个 DataNode的内存中,当然可以针对每个文件配置 DataNode 的数量.作业调度器通过在缓存块的 DataNode 上运行任务,可以利用块缓存的优势提高读操作的性能.
    文件不够一个块的大小时,也单独占用一个块,两个文件不会共用一个块。
    例如一个文件 130M, 会被切分成 2 个 block 块, 保存在两个 block 块里面,一个占用128M,另一个占用2M,实际占用磁盘 130M 空间, 而不是占用256M的磁盘空间
    原文链接:https://blog.csdn.net/duyenson/article/details/119352306

    HDFS概述介绍及其优缺点

    等同于hadoop的优缺点

    HDFS容错原理

    在文件写入 HDFS 时,HDFS 会首先把文件分割成块,并把这些数据块存储在集群不同机器上
    然后在其他机器创建各个块的副本,默认情况下,HDFS 会在其他机器创建3个文件的副本
    所以,HDFS 集群任意机器挂了,我们依然能从其他保存数据副本的机器上读取数据,
    原文链接:https://blog.csdn.net/qq_20042935/article/details/123093545

    HDFS文件格式 行式列式存储格式的区别 列式优点

    常用的文件格式有:TextFile、SequenceFile、Avro、Parquet、RC & ORC

    行式的优点
    写是一次性完成,性能更高
    缺点:
    读取少数列会遍历无关的列,性能差。
    压缩比低

    列存储的优点
    列存储是将每列单独存储或者将某几个列作为列组存在一起。列存储在执行查询时可以避免读取不必要的列。
    而且一般同列的数据类型一致,取值范围相对多列混合更小,在这种情况下压缩数据能达到比较高的压缩比。
    但是这种结构在重建行时比较费劲,尤其当一行的多个列不在一个 HDFS 块上的时候。
    缺点:写记录时,一行记录被拆分成多列存储,耗费时间更长

    TextFile
    常采用csv、json等固定长度的纯文本格式

    优点:
    便于与其他应用程序、脚本进行数据交换
    易读性好、便于理解
    缺点:
    数据存储量非常庞大
    查询效率不高
    不支持块压缩

    SequenceFile
    按行存储二进制键值对数据,HDFS自带

    特点
    常用于MapReduce作业之间传输数据
    二进制文件直接将序列化到文件中
    可用于Hadoop中小文件的打包存档
    支持记录压缩、块压缩
    二进制文件,可读性低

    Parquet
    Apache Parquet是Hadoop生态系统中任何项目都能使用的列式存储格式,
    特点
    Parquet格式是Spark SQL默认的数据源
    按列进行存储,按需读取列,压缩编码可以降低磁盘存储空间(比如有5个"d",它能够将数据转化成类似于这种结构:“d5”)

    ORC
    RC的优化版本
    特点
    常用于Hive
    压缩率极高

    HDFS的可靠性策略

    一、文件的完整
    1、在文件刚刚开始建立的时候,文件中的每个数据块都会产生一个校验和(checksum),这个校验和会保存在.meta文件内部。
    2、客户端获取数据的时候会和这个校验和进行对比,检查是否相同,从而发现数据块是否损坏。
    2、如果说正在读取的数据块损坏,则可以读取其他副本。接着NameNode会标记该block块已经损坏,然后复制该block达到预期设置的文件备份数。
    4、DataNode在其文件创建后三周验证其校验和(checksum)

    补充:
      校验和–checksum是对一组数据(通常是一个文件)进行算法-加密哈希函数运算得到的结果。通过比较你手头文件和原始文件的校验和,能够确保你对原始文件的拷贝是真的并且不存在错误。
      校验和通常也被称之为哈希值、哈希和、哈希码,或简称为哈希–hash。

    二、网络和机器失效
    1、副本冗余策略
      可以指定数据文件的副本数量,默认是3;
      保证所有的数据块都有副本,不至于在一个datanode宕机后,数据出现丢失现象。
    2、机架感知策略
      集群的机器一般处于不同机架上,机架间带宽要比机架内带宽要小;
      HDFS具有“机架感知”能力,它能自动实现在本机架上存放一个副本,然后在其它机架再存放另一副本,这样可以防止机架失效时数据丢失,也可以提高带宽利用率。
    3、心态策略
      NameNode周期性从DataNode接收心跳信号和块报告,Namenode根据块报告验证元数据;
      NameNode对没有按时发送心跳的DataNode会被标记为宕机,不会再给它任何I/O请求;
      DataNode失效造成副本数量下降,并且低于预先设置的阈值;NameNode会检测出这些数据块,并在合适的时机迕行重新复制;
      引发重新复制的原因还包括数据副本本身损坏、磁盘错误,复制因子被增大等。

    NameNode挂掉
    1、主备切换
      集群一般会有俩个NameNode,一个处于active状态,一个处于睡眠状态,当第一个Name Node挂掉,集群中睡眠状态的NameNode就会启动。
    2、镜像文件和操作日志磁盘存储
      当集群启动的时候,在NameNode启动的时候,如果是集群格式化后,或者说是第一次启动,会创建一个空的(fsimage)镜像空间和(edits)日志文件;否则的话会产生一个新的fsimage和edits,并加载上一次的fsimage和edits到这次的fsimage中。
    3、镜像文件和操作日志可以存储多分,多磁盘存储

    其他保障可靠性机制
    1、快照
      支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态;
    2、回收站机制
      删除文件时,其实是放入回收站/trash,回收站里的文件可以快速恢复;
      可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,并且释放占用的数据块。
    3、安全模式
      Namenode启动时会先经过一个“安全模式”阶段,安全模式阶段不会产生数据写入;
      在安全模式阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的;
      在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束;
      当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数。
    原文链接:https://blog.csdn.net/Brucexyao/article/details/120467451

    HA高可用是怎么实现的

    在HA HDFS集群中会同时运行两个Namenode,一个作为Active Namenode(Active),一个作为Standby Namenode。Standby Namenode的命名空间与Active Namenode是实时同步的,所以当Active Namenode发生故障而停止服务时,Standby Namenode可以立即切换为活动状态,从而不影响HDFS集群服务。

    为了使Standby节点与Active节点的状态能够同步一致,两个节点都需要同一组独立运行的节点(JournalNodes,JNS)通信。当Active Namenode执行了修改命名空间的操作时,它会定期将执行的操作记录在editlog中,并写入JNS的多数节点中。而Standby Namenode会一直监听JNS上editlog的变化,如果发现editlog有改动,Standby Namenode就会读取editlog并与当前的命名空间合并。当发生了故障切换时,Standby节点会保证已经从JNS上读取了所有editlog并与命名空间合并,然后才会从Standby状态切换为Active状态。通过这种机制,保证了Active Namenode与Standby Namenode之间命名空间状态的一致性。

    为了使故障切换能够很快的执行完毕,就要保证Standby节点也保存了实时的数据块的存储信息。这样在发生故障切换时,Standby节点就不需要等待所有的数据节点进行全量数据块同步,而直接可以切换到Active状态。为了实现这个机制,Datanode会同时向这两个Namenode发送心跳以及块状态信息。这样就实现了Active Namenode 和standby Namenode 的元数据就完全一致,一旦发生故障,就可以马上切换,也就是热备。

    这里需要注意的是 Standby Namenode只会更新数据块的存储信息,并不会向namenode 发送复制或者删除数据块的指令,这些指令只能由Active namenode发送。
    原文链接:https://blog.csdn.net/solihawk/article/details/123981573

    HDFS 怎么保证数据安全

    1)认证(authentication) 只有经过认证的身份才被允许进入到数据系统。
    2)授权(authorization) 对于HDFS, Hadoop提供了文件级的细粒度访问控制。这种访问控制非常类似于那些基于UNIX的文件系统。
    3)审计(auditing) 所有的访问和操作都需要被记录在审计日志中,以便在稍后的时间点进行审计。
    4)数据保护 传输过程中的中间人可以找到那些正在传输的数据,对通过线路的传输进行加密以便保证数据的机密性。

    HDFS中DataNode怎么存储数据的

    1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
    2)DataNode启动后向namenode注册,通过后,周期性(6小时)的向namenode上报所有的块信息。
    3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
    4)集群运行中可以安全加入和退出一些机器
    原文链接:https://blog.csdn.net/weixin_43487305/article/details/112195078

    DataNode数据完整性

    1)当DataNode读取block的时候,它会计算checksum
    2)如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
    3)client读取其他DataNode上的block.
    4)datanode在其文件创建后周期验证checksum
    原文链接:https://blog.csdn.net/weixin_43487305/article/details/112195078

  • 相关阅读:
    Python将字符串转换成dataframe
    Nginx HTTP框架综述
    [二分查找]
    java计算机毕业设计智慧医疗医患交流系统设计MyBatis+系统+LW文档+源码+调试部署
    centos 单机版redis安装与数据持久化
    leetcode.679.24点游戏
    MATLAB常用命令大全,非常详细(持续更新中)
    实战教程:如何在API监控中实现高效报警和通知
    探寻容器的本质
    阿里云短信验证接口调用
  • 原文地址:https://blog.csdn.net/weixin_43260719/article/details/126219705