• hadoop基础一:HDFS系统性介绍:HDFS组成架构、读写理论、机架感知、心跳策略等


    本文对HDFS进行一个系统性的介绍,以便hdfs的理论知识一个整体性的了解,内容包括架构组成、读写理论,元数据同步、读写时机架感知策略,以及namenode与datanode成员之间的通讯逻辑等。
     
    之后在工作中遇到有关其他HDFS的问题再详细、针对性地讨论。

    一. HDFS概述

    1. HDFS特点

    特点说明
    冗余容错,多副本提高可靠性
    数据丢失自动恢复。在廉价的机器上,通过冗余来稳定集群,即使时常故障也没有问题
    适合大数据,不适合小文件
    小文件存储会增加name node的压力,甚至小文件存储的寻址时间会超过读取时间
    不支持并发写入、文件随机修改
    一个文件只能有一个线程写 ;仅支持数据append(追加),不支持文件的随机修改
    处理数据延迟高
    不适合低延迟毫秒的数据存储

    简单来说HDFS适合大文件存储,通过冗余提高了可靠性;小文件对HDFS不友好,因为会增加HDFS的寻址时间。写文件到HDFS中时,不能并发写入近支持追加,所以对于数据处理时效性不高。

     

    2. HDFS的组成架构

    成员作用
    NameNode
    处理客户端读写请求、管理namespace、配置副本策略:数据怎么存储和备份、管理block的映射信息
    DataNode
    block的读写操作、存储block
    Secondary NameNode
    不是standbyNameNode,主要是辅助nn,比如定期合并Fsimage和Edits,并推送给nn
    client
    1. 文件切分:文件上传前切块,然后分块上传。
    2. 与namenode通讯进行读写请求,会获取文件信息,
    3. 当nn允许client读写时,client和datanode开始交互进行读写;
    4. 提供shell及api等操作入口

    NameNode中的Namespace管理层是负责管理整个HDFS集群文件系统的目录树以及文件与数据块的映射关系。如下Namespace的内存结构:
    在这里插入图片描述
    以上是一棵文件目录树,可见Namespace本身其实是一棵巨大的树。在这棵树中INodeFile表示文件,INodeDirectory表示文件目录。在HDFS中的实现中,INodeFile和INodeDirectory都是继承INode的。

     

    3. 文件块大小

    默认hadoop2.x/3.x是128M,1.x是64M。

    当寻址时间为文件传输是传输时间的1%,则认为是最佳状态。目前磁盘的传输速度为100MB/s
     
    为什么块不能设置太小,也不能设置太大?

    程序在下载块的时候分为寻址和数据传输两个步骤,如果块设置的太小,则总寻址时间增加;太大从磁盘的传输时间长,不利于程序数据处理。所以:block大小的设置主要取决于磁盘传输到速度。

     
     

    二. HDFS的读写理论

    1. 读写流程

    1.1. 读数据流程

    在这里插入图片描述
    简单的说:client向namenode发送rpc请求,nn查找文件的元数据信息返回给client,client向就近(之后随机)的一台datanode发起读取数据的请求,然后下载数据。

    数据传输:

    • 客户端以packet为单位接收,先存在本地缓存,然后写入目标文件。
    • 客户端读完一个块之后关闭链接,然后就近读取下一个文件块;如果列表没读完,会继续向NN请求
    • 每读完一个block都会进行checksum的校验,校验不通过,client通知NN,然后从副本块的datanode继续读。

     

    1.2.写数据流程

    在这里插入图片描述
    简单的说:
    client首先向nn发起写请求,nn进行一系列校验之后返回是否可以上传,然后client发起上传第一个块的请求,nn返回datanode列表,client和dn建立连接然后进行数据传输与数据备份。传递完之后向nn请求上传第二个块,然后重复前面的操作。

    详细地:

    • 两次请求:
      • 第一次NN判断(权限、目录是否存在)是否能够上传;
      • 第二次NN计算文件切块(200M/128M=2),获取副本信息(dfs.replication=3),并返回写节点信息给client做上传准备。
    • client上传前的准备:
      • 对文件进行逻辑切块
      • 上传前建立pipeline,client启动一个阻塞进程,直到所有的DataNode都完成响应。
    • 开始上传:
      • 文件块以packet为单位进行上传
      • DN3接收client的数据,每接收完一个packet,client向DN3传递下一个packet,同时DN3传数据传给DN2…DN2再传给DN1,直到传递完这个块,关闭当前pipeline。
    • 重复上传步骤。

     
     

    2. 最近距离是怎么计算的

    最近距离是hadoop采用的一种衡量带宽能力的近似方法

    网络带宽是指在单位时间(一般指的是1秒钟)内能传输的数据量。

    Hadoop将整个集群理解为树形结构,树的每个叶子节点代表集群中的每个机器,把数据中心(center)、机架(rack)和节点(node)分别映射到不同的层次。如下图
    在这里插入图片描述
    节点距离计算:两个节点到达最近的共同祖先的距离总和。
    通过上述方式可以近似判断两个节点之间的带宽情况:

    • distance(/d1/r1/n1, /d1/r1/n1) = 0 (同一节点上的两个应用程序,最近共同祖先都在本节点,距离为0)
    • distance(/d1/r1/n1, /d1/r1/n2) = 2 (同一机架上的两个节点)
    • distance(/d1/r1/n1, /d1/r2/n3) = 4 (同一数据中心里不同机架上的两个节点)
    • distance(/d1/r1/n1, /d2/r3/n4) = 6 (不同数据中心的两个节点)

     
     

    3. 机架感知策略

    在这里插入图片描述
    机架感知策略可以减少机架间写流量的情况,提高写性能。又因为机架故障的概率远小于节点故障的概率,所以该策略不影响数据可靠性和可用性。

    策略具体描述为:

    1. 第一个副本在Client所在节点,如果client在集群外,随机选择一个
    2. 第二个副本在另一个随机机架的随机节点上
    3. 第三个副本在第二个副本所在机架剩余节点

     
     

    三. HDFS成员相关理论

    1. NameNode和SecondryNameNode的元数据管理

    在这里插入图片描述

    元数据信息包括:抽象目录树、文件和块、块和节点的对应关系。
    集群的启动顺序:nameNode -> dataNode -> secondaryNameNode。

    元数据交互过程

    1. nn启动时,会加载元数据文件(Fsimage和edits)到内存中,同时接收dataNode汇报的心跳和block的位置信息,将block位置信息加载到内存。
    2. 当写流程造成元数据更新时,dn通知nn什么文件的第几个block进行了上传,nn修改元数据内存,并写到本地文件(edits)中。
    3. snn会定期向nn询问是否触发checkpoint操作,触发之后,nn会滚动正在写的edits,即从edits_inprogress_xxx 到 edits文件 ing。接着将edits和fsimage拷贝到snn。snn进行合并,生成新的 fsimage.chkpoint,然后拷贝到nn,nn将 fsimage.chkpoint重命名为fsimage。

    相关文件介绍

    文件类型介绍
    fsimage元数据镜像
    edits操作日志文件[事务文件],这里面会实时记录用户的所有操作,会定时合并到fsimage
    seen_txid是存放事务id的文件,format之后是0,它代表的是检查点正常结束roll的edits事务id

    为什么有时读取文件速度大于网络带宽?
    由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有走网络。

     

    2. DataNode 与 NameNode

    在这里插入图片描述

    datanode和namenode

    A. dn启动后向nn注册
    B. 定时报告心跳给nn,心跳检测机制判断dn是否挂掉
    C. 每6小时上报所有的块信息

     

    心跳机制

    当因为dn宕机或者是网络故障,nn不会马上判断dn挂掉,而是通过计算TimeOut判断。
    TimeOut = 2A +10B
    A=dfs.namenode.heartbeat.recheck-interval 默认5分钟 心跳检查间隔
    B=dfs.heartbeat.interval 默认3秒,心跳间隔

     

    数据完整性校验

    Dn读取block时,会计算checkSum值,如果和创建时不一致则判断文件损坏。
    Dn会定期校验block的checkSum值。

  • 相关阅读:
    冰冰学习笔记:进程概念
    「Redis」02 Redis中的数据类型(含Redis6.0:Bitmaps、HyperLogLog、Geospatial)
    一篇文章带你弄懂Kerberos的设计思路
    el-table滚动加载、懒加载(自定义指令)
    【服务器 | 测试】如何在centos 7上面安装jmeter
    配置Insecure Docker Registry支持http请求 (更改默认的https请求)
    openGauss学习笔记-75 openGauss 数据库管理-创建和管理序列
    轻拍牛头(求约数C++)
    基于Face++网络爬虫+人脸融合算法智能发型推荐程序——深度学习算法应用(含Python及打包exe工程源码)+爬虫数据集
    Web1.0——Web2.0时代——Web3.0
  • 原文地址:https://blog.csdn.net/hiliang521/article/details/126733901