HDFS分布式存储文件 核心设计

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)

  1. 安全模式

  2. safemode是namenode的一种状态(active/standby/safemode)
    集群中的文件不能被操作(自我保护)

  3. 进入safemode的状况
    dfs.namenode.safemode.threshold-pct(默认值0.999f)
    block块丢失率达到0.1%

  4. 退出safemode
    修复宕机的节点(推荐),自动退出
    强制退出safemode(没有解决问题,有可能再次出现数据丢失)

  5. 为什么集群启动时会自动进入safemode,然后又自动退出?
    block所在的datanode的信息存在于内存中,而不在磁盘中。
    所以冷启动时,刚开始找不到block所在的节点的。
    5.常见命令
    hdfs dfsadmin -safemode get:获取当前的safemode状态
    hdfs dfsadmin -safemode enter:进入safemode状态
    hdfs dfsadmin -safemode leave:退出safemode状态
    hdfs dfsadmin -safemode wait:等待

  6. 副本存放策略
    作用:
    分散冗余存储,保证可靠性和高效性
    副本存放:

  7. 原则
    高可靠
    考虑负载均衡
    考虑带宽

  8. 如何存放

    1. 尽可能存放在本地节点(datanode)
    2. 存放在不同的机架的节点
    3. 存放在和第二个副本同机架的不同节点
  9. 修改副本数
    默认副本数是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.读写原理之写流程

  1. client向namenode请求连接;
  2. namenode需要进行校验(是否有权限,是否存在等),响应逻辑切分,并且返回blk分配的节点列表;
  3. client会在dn的节点之间建立pipeline,同时每个块以packet形式传输(组建packet queue),每个packet有64k的大小,同时再传输512k后需要校验;
  4. 块的每个packet有client传输给在pipeline的第一个节点(缓存和data目录),由当前节点进行异步复制到pipeline的其他节点;
  5. pipeline上的节点在接收到数据之后会创建ack queue反馈给client;
  6. 等到所有的block在pipeline传输完毕则client会通知namenode更新元数据;
  7. 如果在pipeline中dn发生异常,则需要向nn重新申请dn节点;
  8. 写入成功的标志,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 继续读。

  1. 元数据管理
  • 内存元数据: 完整元数据(包括目录树结构,以及文件和数据块和副本存储地的映射关系)
  • 磁盘元数据: 准完整元数据 (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

8.checkpoint
每间隔一定时间,2nn下载nn的镜像和日志文件,用于合并生成最新的镜像文件并返回,称之为checkpoint
默认时间: 3600s
默认操作: 1000000

注:
1.SecondaryNamenode 的作用就是分担 namenode 的合并元数据的压力。所以在配置SecondaryNamenode 的工作节点时,一定切记,不要和 namenode 处于同一节点。但事实上,只有在普通的伪分布式集群和分布式集群中才有会 SecondaryNamenode 这个角色,在 HA 或者联邦集群中都不再出现该角色。在 HA 和联邦集群中,都是有 standby namenode 承担。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值