HDFS工作机制

Hadoop心跳机制(heartbeat)

1.为什么会出现心跳机制?

​ 心跳机制是主节点master监控从节点slaver的状态的,如果没有心跳机制,slaver宕机或者存储的块数据出现异常依旧处于工作状态,等master在下达命令时在连接,会严重影响任务的进行。所以出现了心跳机制

2.心跳机制是什么?

​ 简单来说就跟老师和学生,学生每隔一段时间向老师交一次作业,老师根据所交的作业来判断你是否学会了课程。如果没有交作业的话,老师就会处理没有交作业的学生。

​ Hadoop是Master/slaver 结构,老师就相当于master学生就相当于slaver。Master中有NameNode和ResouceManager,slaver中有DataNode和NodeManager.

​ 当Master启动时会启动一个IPC(Inter-Process Comunication.进程间通信)服务,等待slaver的连接。当启动slaver时,slaver就会自动连接到master的IPC server 服务,并且每隔3秒连接一次,这个连接的时间间隔可以通过参数dfs.heartbeat.interval来进行调整,这种每隔一段时间连接一次我们称为心跳机制。slave会通过心跳机制把自己的信息会报给master,master也通过心跳机制给slaver下达命令。

​ NameNode获得的是DataNode的状态,ResourceManager获得的是NodeManager的状态

​ 如果master长时间没有连接slave的心跳,就认为该slaver挂掉了。

NameNode感知到DataNode掉线死亡时长计算;

​ HDFS默认的超时时间是:10分钟+30秒

​ 计算公式:超时时间timeout=2heartbeat.recheck.interval+10****dfs.heartbeat.interval

而默认的 heartbeat.recheck.interval 大小为 5 分钟,dfs.heartbeat.interval 默认的大小为 3 秒。
需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 单位毫秒, dfs.heartbeat.interval 的单位为秒 所以,举个例子,如果 heartbeat.recheck.interval 设置为 5000(毫秒),dfs.heartbeat.interval 设置为 3(秒,默认),则总的超时时间为 40 秒

heartbeat.recheck.interval=namenode.heartbeat.recheck-interval

 <property>        
   <name>heartbeat.recheck.interval</name>        
   <value>5000</value> 
 </property> 
 <property>         
   <name>dfs.heartbeat.interval</name>
   <value>3</value>
 </property> 

NameNode:元数据信息

​ 内存中:存有完整的元数据metdata(目录树,块信息,块所在dn信息)

​ 磁盘中:日志文件edits,fsimage(镜像文件)+预写日志(edits-progress)没有块所在的dn信息

​ namenode冷启动内存的数据丢失,需要dn通过到ipc连接到namenode,通过心跳机制将信息汇报给namenode.

我们可以理解为:比如手机屏幕常量,你必须 给它反馈觉得你在用它,如果超过一定时间不触发,就会自动进入锁屏状态

HDFS安全模式

为什么会进入安全模式?

​ namenode发现集群中的block丢失率达到一定比例时(0.1%),namenode就会进入安全模式,安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息.

比如:集群启动后,可以查看目录,但是上传文件时报错,打开web页面可看到namenode正处于safemode状态

怎么处理?

如何退出安全模式:1.找出问题所在,进行修复(比如修复宕机的datanode)2.手动强制退出安全模式(不推荐)

HDFS集群正常冷启动时的原理(也会进入安全模式相当长的一段时间):

​ namenode 的内存元数据中,包含文件路径、副本数、blockid,及每一个 block 所在 datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那么,当 namenode 冷启动时,此时内存中的元数据只能从 fsimage 中加载而来,从而就没有 block 所在的 datanode 信息——>就会导致 namenode 认为所有的 block 都已经丢失——>进入安全模式— —>datanode 启动后,会定期向 namenode 汇报自身所持有的 blockid 信息,——>随着 datanode 陆续启动,从而陆续汇报 block 信息,namenode 就会将内存元数据中的 block 所 在 datanode 信息补全更新——>找到了所有 block 的位置,从而自动退出安全模式

hdfs dfsadmin -safemode leave //强制 NameNode 退出安全模式

hdfs dfsadmin -safemode enter //进入安全模式

hdfs dfsadmin -safemode get //查看安全模式状态

hdfs dfsadmin -safemode wait //等待,一直到安全模式结束

我们可以理解为:比如在公交车上有人的钱包被偷,警察来了后所有人都不能走,而且要搭车的人也不能搭车,等抓到小偷后才可以解除危险。

副本存放策略

1.为什么副本存放需要策略?

​ 在存放副本时我们希望存放的是最佳的效果的位置。要减轻集群的压力

2.存储策略:分散存储,冗余备份(高可靠)

​ 从三个点来进行副本存放:1.安全可靠 2.节省带宽 3.负载均衡

3.如果有三个副本理想的存放状态:

​ 1:存放到和client同节点的node中

​ 2:存放到就近的机架中 (尽可能就近选择,如果机架比较忙(满),此时需要选择其他机架)

​ 3:存放和第二个副本同机架的不同节点 (如果第二个副本机架比较满,则选择第一个节点机架)

4.修改副本数:1.第一种方式:修改集群文件 hdfs-site.xml

​ dfs.replication

​ 1

​ 2.命令设置:bin/hadoop fs -setrep -R 1 /

我们可以理解为:我们买股票时,把鸡蛋不会放在同一个篮子里,为了安全起见,都会选择优质的股票来分散投资,如果一个亏了,另一个赚了的话也会挽回损失

负载均衡

1.什么情况下需要负载均衡?

磁盘利用率不平衡HDFS集群非常容易出现的情况

尤其是在 DataNode 节点出现故障或在现有的集群上增加新的 DataNode 的时候重新分析数据块分布和重新均衡 DataNode上的数据分布的工具

2.命令: sbin/start-balancer.sh

自动进行均衡非常慢,一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求

原因:HDFS 集群默认 不允许 balance 操作占用很大的网络带宽,因为有上传下载会需要很大带宽。这个带宽是可以调整的

修改带宽命令:

​ hdfs dfsadmin -setBalanacerBandwidth 10485760 单位字节配置10M/s 默认是1M/s

或者: hdfs-site.xml------> dfs.balance.bandwidthPerSec

3平衡标准:

​ 机器容量最高的那个值 和 最低的那个值得差距 不能超过 10

​ sbin/start-balancer.sh -t 10%

HDFS工作机制

概述:

​ 1.HDFS集群主要有两大角色:namenode,datanode(secondarynamenode和cilent)

​ 2.namenode 主要负责管理整个文件系统元数据,块信息,块列表等,并且负责响应客户端的请求

​ 3.datanode负责管理用户的文件数据块,并且通过心跳机制汇报给namenode

​ 4.文件会按照固定大小(dfs.blocksize)切成块之后,分布式存储在datanode上

​ 5.每一个文件块会有多个副本,并按副本存放策略,存放在不同的namenode上

​ 6.datanode会定期通过心跳向namenode汇报自身状态和保存的文件block信息,而namenode则负责保持文件的副本数量

​ 7.HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过namenode申请来访问的。

HDFS写数据流程

​ 读写原理:1.客户端:申请数据传输,切割块,向dn传输packet(队列64k),通过pipiline(管道)在dn链上进行数据传输和复制;传输完成告知namenode,更新元数据。

​ 2.namenode:接收客户端连接 ; 规划数据块和副本,返回datanode列表(预写日志);记录元数据(块id,目录树);通过fsimage镜像来更新元数据

​ 3.datanode:创建pipeline实现datanode间的文件复制;响应传输状态;

HDFS工作机制_第1张图片

读流程

​ 1.client请求block和所在datanode节点列表

​ 2.client从较佳位置读取block信息(逐个读取)

​ 3.再通过io流读取时需要校验每个块信息(checksum)

HDFS工作机制_第2张图片

概述
客户端将要读取的文件路径发送给 namenode,namenode 获取文件的元信息(主要是 block 的存放位置信息)返回给客户端,客户端根据返回的信息找到相应 datanode 逐个获取文件 的 block 并在客户端本地进行数据追加合并从而获得整个文件

详细步骤说明

1、使用 HDFS 提供的客户端 Client,向远程的 namenode 发起 RPC 请求;

2、namenode 会视情况返回文件的全部 block 列表,对于每个 block,namenode 都会返回有 该 block 拷贝的 datanode 地址;

3、客户端Client会选取离客户端最近的datanode来读取block;如果客户端本身就是datanode, 那么将从本地直接获取数据;

4、读取完当前 block 的数据后,关闭当前的 datanode 链接,并为读取下一个 block 寻找最 佳的 datanode; 5、当读完列表 block 后,且文件读取还没有结束,客户端会继续向 namenode 获取下一批的 block 列表;

6、读取完一个 block 都会进行 checksum 验证(校验每个块的信息通过偏移量和预写值对比,写的时候是校验packet的信息),如果读取 datanode 时出现错误,客户端会 通知 namenode,然后再从下一个拥有该 block 拷贝的 datanode 继续读

NameNode

职责:1.复制与客户端连接响应

​ 2.复制元数据存储和管理(目录树,block,block存放的节点列表,副本等)

​ 3.负载均衡和副本存放策略

元数据:内存+磁盘(准完整)

​ 1.内存中的metdata:完整的元数据:元数据镜像文件+预写日志文件

​ 2.磁盘fsimage:元数据镜像文件(历史操作日志文件的合并创建成fsimage)

​ 3.历史操作日志文件:edits_0000000000000000001-0000000000000000002默认每小时创建操作日志保存元数据信息

​ 4.预写操作日志文件:edits_inprogress_0000000000000000245

你可能感兴趣的:(Hadoop)