赞
踩
说明:3.5开头目录是因为和上篇文章内容同属一章,所以开头使用了3.5
1、 Hadoop 是 Master/Slave 结构,Master 中有 NameNode 和 ResourceManager,Slave 中有 Datanode 和 NodeManager
2、 Master 启动的时候会启动一个 IPC(Inter-Process Comunication,进程间通信)server 服 务,等待 slave 的链接
3、 Slave 启动时,会主动链接 Master 的 ipc server 服务,并且每隔 3 秒链接一次 Master ,这 个间隔时间是可以调整的,参数为 dfs.heartbeat.interval,这个每隔一段时间去连接一次 的机制,我们形象的称为心跳。Slave 通过心跳汇报自己的信息给 master,master 也通过心跳给 slave 下达命令
4、 NameNode 通过心跳得知 Datanode 的状态 ResourceManager 通过心跳得知 NodeManager 的状态
5、 如果 master 长时间都没有收到 slave 的心跳,就认为该 slave 挂掉了!
HDFS 默认的超时时间为 10 分钟+30 秒。课堂上具体讲解
NameNode进入安全模式的原理:
a、 NameNode发现集群中的 block 丢失率达到一定比例时(0.1%), NameNode就会进入 安全模式,在安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息(比 如 ls/mkdir)
这个丢失率是可以手动配置的,默认是 dfs.safemode.threshold.pct=0.999f
新版本的配置是:dfs.namenode.safemode.threshold-pct=0.999f
b、如何退出安全模式?
1、找到问题所在,进行修复(比如修复宕机的 datanode)
2、或者可以手动强行退出安全模式(但是并没有真正解决数据丢失问题)
1、 作用: 数据分块存储和副本的存放,是保证可靠性和高性能的关键
2、 方法: 将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,这些数据块副本分布在不同的机器节点上
副本存储策略:
1、第一个副本块选取和客户端相同的节点上
2、第二个副本块选取跟第一个副本的存储节点相邻机架的任意一个节点
3、第三个副本存储在和第二个副本块所在机架不同的节点上
来自于官网的描述:
官网链接:https://hadoop.apache.org/docs/r3.2.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Replica_Placement:_The_First_Baby_Steps
客户端将要读取的文件路径发送给 NameNode ,NameNode 获取文件的元信息(主要是 block 的存放位置信息)返回给客户端,客户端根据返回的信息找到相应 DataNode 逐个获取文件 的 block 并在客户端本地进行数据追加合并从而获得整个文件
注:此图来源于网络,若有疑问,请联系删除。
客户端要向 HDFS 写数据,首先要跟 NameNode 通信以确认可以写文件并获得接收文件 block 的 DataNode ,然后,客户端按顺序将文件逐个 block 传递给相应 DataNode ,并由接收到 block 的 DataNode 负责向其他 DataNode 复制 block 的副本
1、 Client 发写数据请求
2、 NameNode 相应请求,然后做一系列校验,如果能上传该数据,则返回该文件的所有切块应该被存在哪些 DataNode 上的 DataNodes列表
blk-001:hadoop02 hadoop03
blk-002:hadoop03 hadoop04
3、 Client 拿到 DataNode 列表之后,开始传数据
4、 首先传第一块 blk-001,DataNode 列表就是 hadoop02,hadoop03, client 就把 blk-001 传到 hadoop02 和 hadoop03 上
5、 以此类推, 用传第一个数据块同样的方式传其他的数据
6、 当所有的数据块都传完之后,Client 会给 NameNode 返回一个状态信息,表示数据已全部写入成功,或者是失败的信息
7、 NameNode 接收到 Client 返回的状态信息来判断当次写入数据的请求是否成功,如果成功,就需要更新元数据信息
注:此图来源于网络,若有疑问,请联系删除。
HDFS写数据的时候,NameNode会选择距离上传数据最近的DataNodes。
那最近距离怎么算?其实就是两个节点到达最近的共同祖先节点的距离总和。
负责客户端请求(读写数据)的响应
元数据的管理(查询,修改)
配置副本存放策略
管理集群数据块负载均衡问题
WAL(Write ahead Log): 预写日志系统
在计算机科学中,预写式日志(Write-ahead logging,缩写 WAL)是关系数据库系统中用于提供原子性和持久性(ACID 属性中的两个)的一系列技术。在使用 WAL 的系统中,所有的修改在提交之前都要先写入log文件中。
Log 文件中通常包括 redo 和 undo 信息。这样做的目的可以通过一个例子来说明。假设 一个程序在执行某些操作的过程中机器掉电了。在重新启动时,程序可能需要知道当时执行的操作是成功了还是失败了。如果使用了WAL,程序就可以检查 Log 文件,并对突然掉电时计划执行的操作内容跟实际上执行的操作内容进行比较。在这个比较的基础上,程序就可以决定是撤销已做的操作还是继续完成已做的操作,或者是保持原样。
现场查看:
1、VERSION:存放HDFS集群的版本信息
#Thu Sep 09 19:59:17 CST 2021 #时间
namespaceID=1133752196 #文件系统的唯一的标识符
clusterID=CID-98b396cc-04b3-4e1e-ae99-d9c1f2026996 #集群统一的标识符
cTime=1630242976706 #fsimage创建的时间,初始0
storageType=NAME_NODE #节点类型
blockpoolID=BP-1075021137-192.168.22.136-1630242976706 #数据块池的id
layoutVersion=-65 #版本号
2、seen_txid:
存放transactionId的文件,format之后是0
3、edits 文件信息:
hdfs oev -i edits_0000000000000001222-0000000000000001233 -o edits.xml
cat edits.xml
4、 fsimage 镜像文件信息:
hdfs oiv -i fsimage_0000000000000001233 -p XML -o fsimage.xml
cat fsimage.xml
A、内存中有一份完整的元数据(内存 metadata)
B、磁盘有一个元数据镜像(fsimage)文件(在 namenode 的工作目录中)
C、用于衔接内存 metadata 和持久化元数据镜像 fsimage 之间的操作日志(edits 文件)
当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入edits日志
文件中,当客户端操作成功后,相应的元数据会更新到内存 metadata 中
每隔一段时间,会由 secondary namenode 将 namenode 上积累的所有 edits 和一个最新的 fsimage 下载到本地,并加载到内存进行 merge,这个过程称为 checkpoint 。
时间的设置:
1、一般情况下面,SecondaryNameNode每间隔1小时执行一次
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600s</value>
<description>
The number of seconds between two periodic checkpoints.
Support multiple time unit suffix(case insensitive), as described
in dfs.heartbeat.interval.
</description>
</property>
2、当操作记录的数量达到1百万时,SecondaryNameNode执行一次。每间隔1分钟检查一次操作次数。
<property> <name>dfs.namenode.checkpoint.txns</name> <value>1000000</value> <description>The Secondary NameNode or CheckpointNode will create a checkpoint of the namespace every 'dfs.namenode.checkpoint.txns' transactions, regardless of whether 'dfs.namenode.checkpoint.period' has expired. </description> </property> <property> <name>dfs.namenode.checkpoint.check.period</name> <value>60s</value> <description>The SecondaryNameNode and CheckpointNode will poll the NameNode every 'dfs.namenode.checkpoint.check.period' seconds to query the number of uncheckpointed transactions. Support multiple time unit suffix(case insensitive), as described in dfs.heartbeat.interval. </description> </property>
1、存储管理用户的文件块数据
2、定期向 namenode 汇报自身所持有的 block 信息(通过心跳信息上报)
3、为客户端提供读写数据提供辅助
上传一个文件,观察文件的 block 具体的物理存放情况: 在每一台 datanode 机器上的这个目录中能找到文件的切块:
/software/hadoop/data/datanode/current/BP-1120666852-192.168.22.128-1592207887778/current/finalized/subdir0/subdir0
SecondaryNamenode 的作用就是分担namenode 的合并元数据的压力。所以在配置 SecondaryNamenode 的工作节点时,一定切记,不要和 namenode 处于同一节点。
但事实上,只有在普通的伪分布式集群和分布式集群中才有会 SecondaryNamenode 这个角色,在HA或者联邦集群中都不再出现该角色。在HA和联邦集群中,都是有standby namenode承担。
见单独的图片
1、所谓的高可用是指7*24小时不中断服务,也就是HA(High Available)。
2、Hadoop2.0之前的版本,在HDFS集群中NameNode存在单点故障(SPOF:Single Point of Failure)。
3、NameNode主要在以下两个方面影响HDFS集群
NameNode机器发生意外,如宕机等导致集群将无法使用
NameNode机器需要升级,如软件、硬件升级等导致集群无法使用
4、HDFS 高可用功能通过配置Active/Standby两个NameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障自动切换。
1、为什么要有 Federation 机制呢?
在 Hadoop 2.0 之前,HDFS 的单 NameNode 设计带来很多问题,包括单点故障、内存受限等。为了解决这些问题,除了用HA 解决单点故障,我们还可以用 HDFS 的 Federation 机制来解决内存受限这个问题。
2、什么是 Federation 机制?
HDFS Federation 是指 HDFS 集群可同时存在多个 NameNode。
这种设计可解决单 NameNode 存在的以下几个问题:
(1)HDFS 集群扩展性。
(2)性能更高效。
(3)良好的隔离性。
声明:
文章中代码为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。
By luoyepiaoxue2014
B站: https://space.bilibili.com/1523287361 点击打开链接
微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。