Hadoop-day06 Hadoop进程理解
hadoop相关进程
HDFS相关(NN,DN,SNN)
NameNode(NN)
NameNode中存储的信息:
1.文件 --> 元数据
元数据包括:名称,大小,时间,权限等等
2.文件 --> Blocks(每128M生成一个Block块)
block0 - 111
block1 - 222
Hadoop中block块的副本数量默认为三个,但在配置文件中可以修改备份在节点的数量
3.block块 --> DN
block0 - 111:DN1 DN2 DN4
block1 - 222:DN1 DN2 DN5
注意:
namenode和元数据,元数据和 block 块的信息会被持久化的到磁盘中,但是block与datenode的信息存在于内存中,随着关机电脑的关机就会消失,但是下次开机时,各个节点会将自己节点上的信息发送给namenode--- 启动汇报机制.
系统启动时
a. NN关机的时候是不会存储任何的Block与DataNode的映射信息的(会存储namenode和元数据,元数据和 block 块的信息,但是Block与DataNode的映射信息只会短暂存储在内存中,关机时存储信息就会消失)
b. DN启动的时候会自动将自己节点上存储的Block信息汇报给NN
c. NN接收请求之后会重新生成映射关系
File ----> Block
Block---> DN
d. 如果数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点
集群运行中
a. NN与DN保持pingpong机制(心跳机制),三秒钟发送一次
b. 如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况
c. 可以让客户端读取存活的DN节点
d. 如果NN与DN三秒没有心跳则认为DN出现异常,此时不会让新的数据写到这个异常的DN中,客户端访问的时候不提供异常DN节点地址
e. 如果超过十分钟没有心跳,那么NN会将当前DN节点存储的数据(有其他节点的副本)转移到其他的节点
NameNode为了效率,将所有的操作都在内存中进行
a. 执行速度快
b. NameNode不会和磁盘进行任何的数据交换
但是会存在两个问题:
1)数据的持久化
2)数据保存在内存中,断电丢失
DataNode(DN)
1、存放的是文件的数据信息,以及验证文件完整性的校验信息
2、数据会存放在硬盘上
NameNode非常排斥存储小文件(无论之1k还是100M都会分别存入一个单独的block块中)(能存,但是不推荐!!面试必问)
一般小文件在存储之前需要进行压缩
3、启动-汇报机制
1)启动时
汇报之前会验证Block文件是否被损坏
向NN汇报当前DN上block的信息
2)运行中
向NN保持心跳机制
4、当客户端读写数据的时候,首先会先去NN查询file与block与DN的映射,然后客户端直接与DN建立连接,然后读写数据
SecondaryNameNode(SNN)
1、传统的内存持久化方案
1)日志机制
a. 做任何操作之前先记录日志
b. 在数据改变之前先记录对应的日志,当NN停止的时候
c. 当我下次启动的时候,只需要重新按照以前的日志“重做一遍”即可
缺点:
a. log日志文件的大小不可控,随着时间的发展,集群启动的时间会越来越长
b. 有可能日志中存在大量的无效日志
优点:
a. 绝对不会丢失数据
2)拍摄快照
a. 我们可以将内存中的数据写出到硬盘上(序列化)
b. 启动时还可以将硬盘上的数据写回到内存中(反序列化)
缺点:
a. 关机时间过长
b. 如果是异常关机,数据还在内存中,没法写入到硬盘
c. 如果写出的频率过高,导致内存使用效率低
优点:
启动时间较短
2、SNN的解决方案(面试题)
1)解决思路
a. 让日志大小可控(每64M)
b. 快照需要定时保存(每隔1h)
c. 日志+快照
2)解决方案
a.当我们启动一个集群的时候,会产生4个文件 ..../name/current/
b.我们每次操作都会记录日志-->edits-inprogress- edits_00000001,随着时间的推移,日志文件会越来越大-当达到阈值的时候(64M或3600秒),会生成新的日志文件,edits_inprogress-000000001 -->edits_0000001,创建新的日志文件 edits_inprogress-0000000016。
SNN日志合并
namenode将正在记录操作的日志文件,将inprogress后缀去掉,加上在日志文件的首和尾的标识
生成一个新的edits-inp-xxx文件,继续记录客户端的操作
SNN将去掉后缀的日志文件拉到本地来,还把上一次的快照拉过来(HTTP),(实际上,SNN与NN中的快照文件和日志文件一致,这样的好处是免去了从NN拉去的时间)
将上一次的快照fsimage与最新的日志文件做合并,合并生成一个新的快照fsimage(默认只保留最新的两次快照)(64M/1h)
同步一份快照给NN
后面以此类推
SNN工作流程
SNN通知 NN切换edits文件
SNN从NN获得fsimage和sdits(通过http)
SNN将fsimage载入内存,然后开始合并edits
SNN将新的fsimage发回给NN
NN用新的fsimage替换旧的fsimage(保留最近的两次快照)
面试题
简诉SecondaryNameNode的作用
SecondaryNameNode 会按照一定的规则被唤醒,进行fsimage和edits的合并,防止文件过大。
合并的过程是,将NameNode的fsimage和edits下载到SecondryNameNode 所在的节点的数据目录,然后合并到fsimage文件,最后上传到NameNode节点。合并的过程中不影响NameNode节点的操作
SecondaryNameNode被唤醒的条件可以在Core-site.xml中配置:
fs.checkpoint.period:单位秒,默认值3600,检查点的间隔时间,当距离上次检查点执行超过该时间后启动检查点
fs.checkpoint.size:单位字节,默认值67108864(64M),当edits文件超过该大小后,启动检查点
SecondaryNameNode一般处于休眠状态,当两个检查点满足一个,即唤醒SecondaryNameNode执行合并过程。
安全模式
安全模式是 HDFS 的一种工作状态,处于安全模式的状态下,只向客户端提供文件的只读视图,不接受对命名空间的修改;同时 NameNode 节点也不会进行数据块的复制或者删除,
NameNode 启动时,
1)首先将镜像文件( fsimage )载入内存,并执行编辑日志( edits )中的各项操作。
2)一旦在内存中成功建立文件系统元数据的映射,则创建一个新的 fsimage 文件和一个空的编辑日志。
3)NameNode 开始监听 RPC 和 Http 请求。
4)此时 NameNode 处于安全模式,只接受客户端的读请求。 5)处于这个状态是为了保护数据的安全所以只能被客户端访问读取数据
# 对安全模式的理解
# 1.工作流程
a.启动 NameNode,NameNode 加载 fsimage 到内存,对内存数据执行 edits log 日 志中的事务操作。
b.文件系统元数据内存镜像加载完毕,进行 fsimage 和 edits log 日志的合并,并创 建新的 fsimage 文件和一个空的 edits log 日志文件。
c.NameNode 等待 DataNode 上传 block 列表信息,直到副本数满足最小副本条件。
d.当满足了最小副本条件,再过 30 秒,NameNode 就会退出安全模式。最小副本条件指 整个文件系统中有 99.9%的 block 达到了最小副本数(默认值是 1,可设置)
# 在 NameNode 安全模式(safemode)
对文件系统元数据进行只读操作
当文件的所有 block 信息具备的情况下,对文件进行只读操作
不允许进行文件修改(写,删除或重命名文件)
# 2.注意事项
a.NameNode 不会持久化 block 位置信息;DataNode 保有各自存储的 block 列表信息。 正常操作时,NameNode 在内存中有一个 blocks 位置的映射信息(所有文件的所有文 件块的位置映射信息)。
b.NameNode 在安全模式,NameNode 需要给 DataNode 时间来上传 block 列表信息到 NameNode。如果 NameNode 不等待 DataNode 上传这些信息的话,则会在 DataNode 之间进行 block 的复制,而这在大多数情况下都是非必须的(因为只需要等待 DataNode 上传就行了),还会造成资源浪费。
c.在安全模式 NameNode 不会要求 DataNode 复制或删除 block。
d.新格式化的 HDFS 不进入安全模式,因为 DataNode 压根就没有 block。
# 4.命令操作
# 通过命令查看 namenode 是否处于安全模式:
hdfs dfsadmin -safemode get
Safe mode is ON HDFS 的前端 webUI 页面也可以查看 NameNode 是否处于安全模式。 有时候我们希望等待安全模式退出,之后进行文件的读写操作,尤其是在脚本中,此时:
`hdfs dfsadmin -safemode wait`
# your read or write command goes here 管理员有权在任何时间让 namenode 进入或退出安全模式。进入安全模式:
`hdfs dfsadmin -safemode enter`
Safe mode is ON 这 样 做 可 以 让 namenode 一 直 处 于 安 全 模 式 , 也 可 以 设 置 `dfs.namenode.safemode.threshold-pct` 为 1 做到这一点。 离开安全模式:
`hdfs dfsadmin -safemode leave`
Safe mode is OFF
系统中的数据块的位置并不是由 NameNode 维护的,而是以块列表的形式存储在 DataNode 中。
[root@node01 ~]# rm -rf /var/yjx/hadoop/full/dfs/name/current/*
[root@node01 ~]# scp -r
root@node02:/var/yjx/hadoop/full/dfs/namesecondary/current/*
/var/yjx/hadoop/full/dfs/name/current安全模式下
a. 安全模式下,各个 DataNode 会向 NameNode 发送自身的数据块列表
b. 当 NameNode 有足够的数据块信息后,便在 30 秒后退出安全模式
c. NameNode 发现数据节点过少会启动数据块复制过程
如果 NN 收集的 Block 信息没有达到最少副本数,就会将缺失的副本 , 从有的 DN 上拷贝到其他 DN
a. dfs.replication.min=2
b. 但是默认最低副本数为 1
c. 在拷贝的过程中系统还是处于安全模式
安全模式相关命令
hadoop dfsadmin -safemode leave 强制 NameNode 退出安全模式
hadoop dfsadmin -safemode enter 进入安全模式
hadoop dfsadmin -safemode get 查看安全模式状态
hadoop dfsadmin -safemode wait 等待一直到安全模式结束
2.4 HDFS的权限
HDFS对权限的控制
a. 只能防止好人做错事
b. 不能防止坏人做坏事
但是告诉你是谁,他就认为你是谁!!
2.5 机架感知
机架感知是为了保证副本在集群中的安全性
我们需要将节点放在不同的DN节点上,节点也需要一定的考量
可靠性,可用性,带宽消耗
第一个节点:
集群内部(优先考虑和客户端相同的节点作为第一个节点)
集群外部(选择资源丰富且不繁忙的节点作为第一个节点)
第二个节点:
第二个节点选择与第一个节点不同机架的其他节点
第三个节点:
与第二个相同机架相同的其他节点
第N个节点:
与前面节点不重复的其他节点第一种模式:
第二种模式:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!