1.心跳机制
master和slave之间通过ipc服务通信,通信有固定是时间周期(默认3秒),称之为心跳。
dfs.heartbeat.interval:配置心跳时间
slave超时时间的计算:(默认2倍检查时间+10倍心跳间隔)
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval
默认值: dfs.namenode.heartbeat.recheck-interval 300000(5 min)
dfs.heartbeat.interval 3 (3 sec)
-
安全模式
-
safemode是namenode的一种状态(active/standby/safemode)
集群中的文件不能被操作(自我保护) -
进入safemode的状况
dfs.namenode.safemode.threshold-pct(默认值0.999f)
block块丢失率达到0.1% -
退出safemode
修复宕机的节点(推荐),自动退出
强制退出safemode(没有解决问题,有可能再次出现数据丢失) -
为什么集群启动时会自动进入safemode,然后又自动退出?
block所在的datanode的信息存在于内存中,而不在磁盘中。
所以冷启动时,刚开始找不到block所在的节点的。
5.常见命令
hdfs dfsadmin -safemode get:获取当前的safemode状态
hdfs dfsadmin -safemode enter:进入safemode状态
hdfs dfsadmin -safemode leave:退出safemode状态
hdfs dfsadmin -safemode wait:等待 -
副本存放策略
作用:
分散冗余存储,保证可靠性和高效性
副本存放: -
原则
高可靠
考虑负载均衡
考虑带宽 -
如何存放
- 尽可能存放在本地节点(datanode)
- 存放在不同的机架的节点
- 存放在和第二个副本同机架的不同节点
-
修改副本数
默认副本数是3
修改hdfs-site.xml
dfs.replication
通过shell命令实现:
hdfs dfs -setrep 2 文件
4.负载均衡
1.节点的磁盘利用率尽可能的均等
2.如果出现节点宕机或者新添加节点,都可能导致出现负载不均衡(节点中负载时动态)
3.如何实现负载均衡
start-balancer.sh: 实现负载均衡,默认移动速度1m/s(出于带宽考虑,读写)
hdfs dfsadmin -setBalanacerBandwidth 10485760: 设置默认的移动速度
stat-balancer.sh -t 10%: 负载最高的节点和最低节点之间的数据差距比例不超过10%
5.读写原理之写流程
- client向namenode请求连接;
- namenode需要进行校验(是否有权限,是否存在等),响应逻辑切分,并且返回blk分配的节点列表;
- client会在dn的节点之间建立pipeline,同时每个块以packet形式传输(组建packet queue),每个packet有64k的大小,同时再传输512k后需要校验;
- 块的每个packet有client传输给在pipeline的第一个节点(缓存和data目录),由当前节点进行异步复制到pipeline的其他节点;
- pipeline上的节点在接收到数据之后会创建ack queue反馈给client;
- 等到所有的block在pipeline传输完毕则client会通知namenode更新元数据;
- 如果在pipeline中dn发生异常,则需要向nn重新申请dn节点;
- 写入成功的标志,client写入dfs.replication.min(默认1)个副本数则表示写入成功。
6.读写原理之读流程
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 验证,如果读取 datanode 时出现错误,客户端会
通知 namenode,然后再从下一个拥有该 block 拷贝的 datanode 继续读。
- 元数据管理
- 内存元数据: 完整元数据(包括目录树结构,以及文件和数据块和副本存储地的映射关系)
- 磁盘元数据: 准完整元数据 (block所在datanode 信息)
hadoopdata/name/current
- 镜像文件: fsimage_xxx
每间隔一小时将之前的历史操作日志进行合并生成镜像文件
hdfs oiv -i fsimage_0000000000000000232 -p XML -o fsimage.xml - 历史日志文件: edits_xxx
默认每间隔一小时创建日志文件记录操作
生成xml文件:
hdfs oev -i edits_0000000000000000003-0000000000000000100 -o edits.xml - 预写日志文件: edits_inprogress_xxx
- 镜像文件: fsimage_xxx
8.checkpoint
每间隔一定时间,2nn下载nn的镜像和日志文件,用于合并生成最新的镜像文件并返回,称之为checkpoint
默认时间: 3600s
默认操作: 1000000
注:
1.SecondaryNamenode 的作用就是分担 namenode 的合并元数据的压力。所以在配置SecondaryNamenode 的工作节点时,一定切记,不要和 namenode 处于同一节点。但事实上,只有在普通的伪分布式集群和分布式集群中才有会 SecondaryNamenode 这个角色,在 HA 或者联邦集群中都不再出现该角色。在 HA 和联邦集群中,都是有 standby namenode 承担。