一、HDFS概述

1.1HDFS产生背景

随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。

1.2HDFS定义

Hadoop Distributed File System,是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

HDFS的使用场景:适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

1.3HDFS优缺点

优点:
(1)高容错性

  • 数据自动保存多个副本。它通过增加副本的形式,提高容错性。
  • 某个副本丢失以后,它可以自动恢复。

(2)适合处理大数据

  1. 数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据。
  2. 文件规模:能够处理百万规模以上的文件数量,数量相当之大。

(3)可构建在廉价机器上,通过多副本机制,提高可靠性。

缺点:

(1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。

(2)无法高效的对大量小文件进行存储。

  • 存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;(理解:书包含目录和具体内容)
  • 小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。

(3)不支持并发写入,文件随机修改。

  • 一个文件只能有一个写,不允许多个线程同时写;
  • 仅支持数据追加append,不支持文件的随机修改。

1.4HDFS组成架构

NameNode(nn):就是Master老板,主管、管理者。管理HDFS的名称空间;配置副本策略;管理数据块(Block)映射信息;处理客户端的读写请求。

DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。存储实际的数据块;执行数据块的读/写操作。

Client:就是客户端。

  1. 文件切分。文件上传HDFS的时候,Client将文件切分成为一个一个的Block,然后进行上传;
  2. 跟NameNode交互,获取文件的位置信息·;
  3. DataNode交互,读取或写入数据;
  4. Client提供一些命令来管理HDFS,比如NameNode格式化;
  5. Client可以通过一些命令来访问HDFS,比如对HDFS增删改查操作。

Secondary NameNode:并非NameNode的热备,当NameNode挂掉的时候,它不能马上替换NameNode并提供服务。

  1. 辅助NameNode,分担其工作量,比如定期合并Fsimage(硬盘,为了防止断电数据丢失)和Edits,并推送给nameNode
  2. 在紧急情况下,可辅助恢复NameNode

1.5文件块block大小(面试重点)

HDFS中文件在物理上是分块存储(Block),块的大小可以通过配合参数(dfs.blocksize)来规定,默认大小在Hadoop2.x版本中128M,老版本是64M。

block1.....block66

1.如果寻址时间10ms,即查找到目标block的时间约为10ms。

2.寻址时间为传输时间的1%时,则为最佳状态。传输时间*0.01=10ms,传输时间为1000ms=1s

3.目前磁盘的输出速率普遍为100MB/s       块大小:100M/s * 1s=100M       128M

普通机械硬盘80M/s~90M/s                     块大小:80M/s * 1s=80M~90M     64M,128M

固态硬盘200M/s~300M/s                        块大小:200M/s * 1s=200M~300M    256M

思考:为什么块的大小不能设置太小,也不能设置太大?
(1)HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置。
(2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始新的位置所需要的时
间(寻址时间)。导致程序在处理这块数据时,会非常慢。

总结:HDFS块的大小设置主要取决于磁盘传输速率。

1.6HDFS的Shell操作(10分)

1.基本语法

bin/hadoop fs 具体的命令

bin/hdfs dfs 具体的命令

2.常用的操作命令

(0)启动Hadoop集群

sbin/start-dfs.sh 启动hdfs

sbin/start-yarn.sh 启动yarn

(1)-help 输出这个命令的参数
(2)-ls:显示目录信息;列出 HDFS 根目录下的文件 / 文件夹
(3)-mkdir:在HDFS上创建目录/文件夹
(4)-moveFromLocal:从本地剪切粘贴到HDFS上

hadoop fs -moveFromLocal 本地文件 HDFS路径

  • 执行后:本地文件会消失,文件跑到 HDFS 里
  • -put 的区别:
    • -put = 复制(本地还留着)
    • -moveFromLocal = 剪切(本地不留)

hadoop fs -touch /路径/文件名

在 HDFS 里创建一个【空文件】

  • 就像是右键新建文本文档
  • 文件大小 = 0

(5)-appendToFile:追加一个文件到已经存在的文件的末尾

①要有一个本地文件

touch文件名(创建一个空文件)

vi文件名(编辑这个文件)

cat文件名(查看这个文件)

②把本地文件追加到 已经存在的HDFS系统里面的 文件的末尾

hadoop fs -appendToFile本地文件和地址HDFS已经存在的文件的路径以及文件名

(6)-cat文件名:查看文件
(7)-chgrp,-chown,-chmod:Linux文件系统中的用法一样,修改文件所属权限
①chgrp = change group → 改组   chgrp[R]组名 文件或目录名

权限 ↓                      owner    group👇

作用:修改文件 / 文件夹属于哪个 “组”你可以把 “组” 理解成:权限小组


②chown = change owner → 改主人  /所有者和组
hadoop fs -chown文件所有者:组别名字 hdfs的文件或者文件夹
作用:修改文件 / 文件夹的主人是谁;谁是这个文件的 “拥有者”,谁就最大权限。

③chmod = change mode → 改 权 限

作用:改文件能不能读、能不能改、能不能运行

d r w x 就是文件 / 文件夹的 “身份牌 + 权限牌”

1.d = directory = 文件夹

  • 开头是 d文件夹

  • 开头是 -普通文件

2.r = read 可读(能打开看)w = write 可写(能修改、删除)x = execute 可执行(能运行 / 进入)

3.开头 d → 文件夹;r w x → 权限:

  • 所有者:可读、可写、可进入

  • 同组用户:可读、可进入

  • 其他用户:可读、可进入

drwxr-xr-x
  • 4 = 读(r)

  • 2 = 写(w)

  • 1 = 运行(x)

加起来就是权限:

  • 7 = 4+2+1 = 全部权限

  • 6 = 4+2 = 读写

  • 5 = 4+1 = 读和运行

  • 0 = 啥都不能干

例如:

chmod 777 文件名

意思:所有人都能读、能改、能运行。

二、HDFS写数据流程

2.1 完整流程图解

2.2 八步详细解析

(1)客户端通过Distributed FileSystem 模块向NameNode请求上传文件,NameNode检查目录文件是都已经存在,父目录是否存在。

(2)NameNode返回是否可以上传。

(3)客户端请求第一个Block上传到哪几个DataNode服务器上。

(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3(几个节点与副本数有关)

(5)客户端通过FSDataOutputStream模块请求dn1上传数据dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。

(6)dn1、dn2、dn3逐级应答客户端。

(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到本地内存缓存),以Packet为单位,dn1收到一个Packet就会上传到dn2,dn2会传给dn3;dn1没上传一个Packet会放入一个应答队列等待应答。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)

三、机架感知与副本存储策略

3.1 网络拓扑与节点距离计算

在HDFS写数据的过程中,NameNode选择DataNode时,遵循**“就近原则”**。节点距离 = 两个节点到达最近共同祖先的距离总和。

距离计算示例:

场景                          路径                                                      距离
同一节点上的进程    /d1/r1/n1 → /d1/r1/n1                              0
同一机架不同节点    /d1/r1/n1 → /d1/r1/n2                       2 (n1→r1→n2)
同一数据中心不同机架   /d1/r1/n1 → /d1/r2/n0            4 (n1→r1→d1→r2→n0)
不同数据中心           /d1/r1/n1 → /d2/r4/n0                   6 (n1→r1→d1→root→d2→r4→n0)

3.2 机架感知(副本存储节点选择)

机架感知(replication副本存储节点选择)数据可靠性,传递速度快

副本节点的选择:

第一个副本在Client所在的节点上;如果客户端在集群外,随机选一个节点。【上传速度最快。利用数据局部性,减少网络传输】

第二个副本在另一个机架的随机一个节点。【数据可靠性。防止机架故障导致数据丢失】

第三个副本在第二个副本所在机架的随机节点。【速度】

四、HDFS读数据流程

4.1 完整流程图解

4.2 四步详细解析

(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,返回文件块所在的DataNode地址列表。

(2)客户端挑选一台DataNode(就近原则 → 然后随机)服务器,请求读取数据。

(3)DataNode从磁盘读取数据输入流,以Packet为单位做校验开始传输数据给客户端。

(4)客户端以Packet为单位接受,先在本地缓存,然后写入目标文件。

💡 就近原则:优先选择距离客户端最近的DataNode,若该节点负载过高或数据损坏,则自动切换到其他副本节点。

五、NameNode与SecondaryNameNode工作机制

5.1 核心问题:NameNode中元数据存储在哪儿?——内存/磁盘;如何持久化?

NameNode的元数据存储在内存中,但断电会丢失。解决方案:FsImage(镜像文件、存储数据)+ Edits(编辑日志、追加修改)关机或者checkpoint合并到fsimage,开机时就会将fsimage加载到内存

文件 作用 特点
FsImage 元数据的完整快照 体积大,不频繁更新
Edits 元数据变更的操作日志 只追加不修改,效率高
5.2 工作机制图解

5.3 两阶段工作流程
第一阶段:NameNode启动

1. 第一次启动NameNode格式化后,创建FsImage和Edits文件。非首次启动:直接加载镜像文件FsImage和编辑日志Edits到内存

2.客户端发起增删改请求

3.NameNode记录操作日志 → 更新滚动日志

4.NameNode在内存中执行元数据变更(增删改,查并不影响)

第二阶段:SecondaryNameNode工作(CheckPoint)
步骤 操作 说明
询问CheckPoint Secondary NameNode询问NameNode是否需要执行CheckPoint。直接带回NameNode是否检查结果。
请求执行 NameNode同意,触发CheckPoint流程。Secondary NameNode请求执行CheckPoint。
滚动Edits NameNode滚动正在写的edits日志
拷贝文件 将滚动前的editsfsimage拷贝到SecondaryNameNode
加载合并 SecondaryNameNode加载editsfsimage到内存,合并生成新的镜像
生成新镜像 生成fsimage.chkpoint文件
拷贝回NameNode fsimage.chkpoint拷贝到NameNode
重命名 NameNode将fsimage.chkpoint重命名为fsimage

⚠️ 重要澄清:SecondaryNameNode不是NameNode的热备份!它只是辅助合并元数据,NameNode故障时无法自动接管。

🤔 思考题:FsImage中没有记录块对应的DataNode,为什么?
💡 答案:集群启动后,DataNode会主动向NameNode上报块信息,并周期性(6小时)再次上报。动态维护比静态记录更准确。

六、DataNode工作机制

 数据块存储结构&心跳机制

(1)每个数据块在DataNode上以两个文件存储在磁盘上:

  • 数据文件:数据本身。实际的数据内容
  • 元数据文件:数据块长度、块数据的校验和(Checksum),以及时间戳

(2)DataNode启动后向NameNode注册,通过后,周期性(1h)的向NameNode上报所有的块信息。

(3)向NameNode报告存活状态,接收NameNode给该DataNode的指令(如复制块数据到另一台机器、删除块数据)。如果超过10min没有收到某个DataNode的心跳,则认为该节点不可用。

(4)集群运行中可以安全加入和退出一些机器(DataNode10-100).

七、MapReduce

编程模型
1.1MapReduce定义

MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。

MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。

1.2MapReduce优缺点

1.2.1优点

1.MapReduce易于编程

它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得MapReduce编程变得非常流行。

2.良好的扩展性

当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。

3.高容错性

MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成。

4.适合PB级以上海量数据的离线处理

可以实现上千台服务器集群并发工作,提供数据处理能力。

1.2.2缺点

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐