• HDFS总结(未完待续)


    1. 概述

    HDFS(Hadoop Distributed File System)是一个分布式文件系统;
    使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。

    优点:
    1)高容错性
    数据自动保存多个副本。它通过增加副本的形式,提高容错性。
    某一个副本丢失以后,它可以自动恢复。
    2)适合处理大数据
    数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据;
    文件规模:能够处理百万规模以上的文件数量,数量相当之大。
    3)可构建在廉价机器上,通过多副本机制,提高可靠性。

    缺点:
    1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。 //不能像Mysql那样快速增删改查;
    2)不适合大量的小文件进行存储。
    存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;
    3)不支持并发写入、文件随机修改。
    一个文件只能有一个写,不允许多个线程同时写
    仅支持数据append(追加),不支持文件的随机修改

    1.1 HDFS的组成

    在这里插入图片描述

    (1)NameNode(nn)管理者:存储文件的元数据,即文件与数据块的映射表以及数据块与数据节点的映射表;
    向DataNode下达命令;
    和客户端Client交互;

    (2)DataNode(dn) 工作者:在本地文件系统存储文件块数据,以及块数据的校验和。
    DataNode执行NameNode的命令;

    (3)Secondary NameNode(2nn) 副本:每隔一段时间对NameNode中的 元数据 备份;
    在紧急情况下,可辅助恢复NameNode。 (只能恢复一部分)

    1.2 HDFS、YARN、MapReduce三者间的关系

    假设客户端要查找某个 .avi文件:
    在这里插入图片描述
    client提交查找.avi视频的需求,此时RM找到节点开启一个container。
    client→Yarn→Map: 由ApplicationMaster向ResourceManager提出申请资源,由ApplicationMaster开启MapTask,这就是Map阶段;
    →Reduce→HDFS: 检索完成后会把结果汇总后写到磁盘上,这就是Reduce阶段。这个过程中,NameNode负责计量操作,DataNode负责存储操作,2nn负责备份数据操作。

    配置文件:
    core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 四个配置文件

    问:为什么块的大小不能设置太小,也不能设置太大?

    1.文件块存储在磁盘,如果设置太小,导致块文件很多,会增加寻址时间,程序一直在找块的起始位置;
    2.如果块设置的太大,从磁盘传输数据的时间太长,读取不灵活,一旦故障造成资源浪费;

    寻址时间为传输时间的1% 则为最佳传输状态;
    数据块大小默认为128mb ;

    总结:HDFS块的大小设置主要取决于磁盘传输速率。(如果是固态硬盘,可以设置为256mb)

    2. 基本操作

    (1)启动脚本
    整体启动/停止 HDFS :[abc@hadoop102 hadoop-3.1.3] sbin/ start-dfs.sh/ stop-dfs.sh
    整体启动/停止 YARN :[abc@hadoop102 hadoop-3.1.3] sbin/ start-yarn.sh/ stop-yarn.sh

    组件逐一启动:
    hdfs --daemon start/stop namenode/datanode/secondarynamenode
    yarn --daemon start/stop resourcemanager/nodemanager

    (2)上传命令
    本地拷贝到HDFS:
    hdfs dfs -put ./wuguo.txt /sanguo

    剪切到 HDFS:
    hdfs dfs -moveFromLocal ./wuguo.txt /sanguo

    追加一个文件到已存在的文件末尾:
    hdfs dfs -appendToFile ./liubei.txt /sanguo/shuguo.txt

    (3)下载命令
    hdfs dfs -get /sanguo/shuguo.txt ./(客户端地址)

    (4)HDFS内命令
    -ls: 显示目录信息:
    -cat: 显示文件内容
    -chgrp、-chmod、-chown:Linux: 文件系统中的用法一样,修改文件所属权限
    -mkdir: 创建路径
    -cp: 从 HDFS 的一个路径拷贝到 HDFS 的另一个路径
    -mv: 在 HDFS的目录中移动文件
    -tail: 显示一个文件的末尾 1kb 的数据
    -rm: 删除文件或文件夹
    -rm -r: 递归删除目录及目录里面内容
    -du 统计文件夹的大小信息 -s意味总大小 -h易读计量单位
    -setrep: 设置 HDFS 中文件的副本数量

    3. HDFS读写过程

    详细

    3.1 向HDFS中写数据

    1. Client→NameNode:
      客户端向NameNode发起RPC调用 建立连接,NameNode返回是否可以上传,
      客户端对文件按128mb(块大小)进行切分,客户端给NameNode发送上传第一个快文件的请求;
      NameNode根据存储策略 返回 DataNode地址;(存储策略:第一个块副本在客户端节点,第二个副本在另一个节点,第三个副本在第二个块所在节点)
    2. Client→DataNode:
      客户端与DataNdoe 建立链接 ,多个DataNdoe会逐级应答;
      客户端通过FSDataOutPutStream对象以流的形式将数据传给DataNode,
      当第一个块传完后,客户端再次请求NameNoed上传第二个块;
    • 网络拓扑-节点距离计算
      在 HDFS 写数据的过程中,NameNode 会先选择距离待上传数据最近距离的 DataNode 接收数据。
      节点距离:两个节点 到达最近的共同祖先的距离总和
      在这里插入图片描述

    9和5的节点距离是:共同祖先是8,距离为1+2=3

    3.2 向HDFS中读数据

    1. Client→NameNode:
      客户端通过创建一个DistributedFileSystem对象向 NameNode 发起RPC请求建立连接
      NameNode 通过查询元数据,找到并返回一个block 列表,对于每个 block,NameNode 都会返回含有该 block 副本的 DataNode 地址。
    2. Client→DataNode:
      客户端拿到DataNode地址,根据就近原则选一个DataNode,就使用FSDataInputStream对象的read()方法,通过流的方式进行读取;
      每读取完一个 block 都会进行 checksum 验证;
      最终读取来所有的 block 会合并成一个完整的文件;

    4. NameNode 和 SecondaryNameNode

    NameNode中的元数据存在哪?
    由于存磁盘效率低,所以元数据需要存放在内存中;
    由于安全性问题,所以在磁盘中有备份文件Fsimage(数据+元数据);

    引入Edits日志文件:
    如果同时更新 Fsimage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦 NameNode 节点断电,就会产生数据丢失。
    因此,引入Edits操作文件(不进行计算, 只进行操作的追加,效率很高)。
    每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到 Edits 中

    引入SecondaryNameNode节点:
    Edits 太大,就将Edits和Fsimage进行合并,
    合并的触发条件 定时时间到 Edits中数据满了。

    备份过程:

    Edits的操作+fsimage镜像文件,合并了就是内存中最新的数据;

    第一阶段:NameNode工作机制

    1. 第一次启动 NameNode 格式化后,创建 FsimageEdits 文件。
      如果不是第一次启动,直接加载镜像文件fsimage和编辑日志Edits到内存。
    2. 客户端对数据进行修改;
    3. NameNode 会①Edits中记录流程(日志),②再更改内存。(如果先更改内存再记账,中途断电将导致数据丢失)
    4. NameNode 在内存中对元数据进行增删查改操作;

    第二阶段:Secondary NameNode工作机制

    1. 2nn询问NameNode 是否需要checkpoint,是则执行;
    2. NameNode 将之前的(Edits日志文件和fsimage文件)拷贝到2nn,2nn会将其合并为新的fsimage.chkpoint,并将新的fsimage文件传回NameNode;
    3. NameNode将传回的 文件覆盖原来的fsimage文件,即最新的备份;

    checkpoint时间设置

    1)通常情况下,SecondaryNameNode 每隔一小时执行checkpoint一次;
    2)或者操作次数(默认100万次)达到上限,2nn执行一次checkpoint;(每1分钟检查一次文件数是否到了100w次)

    5. DataNode工作机制

    5.1 注册 register

    当DataNode启动的时候,DataNode将自身信息告诉NameNode。作用是使得这个DataNode成为HDFS集群中的成员;

    5.2 汇报+自查

    DataNode向 NameNode注册通过后,会周期性(6 小时)的向NameNode 汇报 所有的块信息(块是否完好)以维持NameNode和数据块之间的映射关系,这一步完成后,DataNode才正式启动完成;

    DN 扫描自己节点块信息列表的时间(自查时间)也是 6 小时一次,查完就向nn报道;

    5.3 心跳机制

    默认3秒一次;
    如果超过 10 分钟+30秒(10次心跳)没有收到某个 dn的心跳,则认为该节点不可用。,则以后nn就不会允许客户端往该节点读、写数据;

    作用:
    ①告诉NameNode 当前块的状态
    ②心跳机制是NameNode和DataNode 交互的主要方式,NameNode通过心跳响应中将命令给到DataNode ;

  • 相关阅读:
    指针——C语言初阶
    java计算机毕业设计SpringBoot在线答疑系统
    两级页表(单级页表存在的问题,两级页表的地址转换)
    Hive--07---函数简介--常用函数1
    语义分割生成混淆矩阵
    深拷贝与浅拷贝
    【vue3|第20期】vue3中Vue Router路由器工作模式
    通信-CAN-01 总线拓扑
    Google Earth Engine(GEE)——利用sentinel-2数据进行农作物提取分析
    PostgreSQL manual
  • 原文地址:https://blog.csdn.net/Swofford/article/details/126122918