Hadoop副本放置策略+读写流程+磁盘均衡+安全模式+hdfs dfs命令

一. Hdfs副本放置策略

假设设置为3个副本:
第一个副本: 1) 假如上传节点本身为DN节点,优先放置本节点; 2) 否则就随机挑选一台磁盘不太慢,CPU不太繁忙的节点;
第二个副本: 放置在与第一个副本的不同机架的节点上
第三个副本: 放置在与第二个副本的相同机架的不同节点上
在这里插入图片描述

CDH机架有一个默认机架 虚拟的概念,一般不调整这种默认机架

二. Client读写流程:站在客户端的角度,读入(In)写出(Out)

1.文件写流程

执行命令hadoop fs -put xxx.log /时,文件上传过程对用户是无感知的。后台代码的逻辑如下:
在这里插入图片描述

1.1 Client调用FileSystem.create(filePath)方法,与NN交互

Client与NN进行【rpc】通信,NN检查是否目录、文件是否存在 及 是否有权限创建:
1)假如不ok,NN就返回错误信息;
2)假如ok,NN就创建一个新文件,不关联任何的block块,返回一个FSDataOutputStream对象;

1.2 Client调用FSDataOutputStream对象的write()方法,

Client先将第一块的第一个副本写到第一个Datanode DN1,第一个副本写完;
DN1就传输给第二个Datanode DN2,第二个副本写完;
DN2就传输给第三个Datanode DN3,第三个副本写完后,DN3返回一个ack packet确认包给DN2,DN2接收到
DN3的ack packet确认包,加上自身ok,就返回一个ack packet确认包给DN1,DN1接收到DN2的ack packet确认包加上自身ok,就返回ack packet确认包给FSDataOutputStream对象,标志第一个块的3个副本写完。
然后余下的块依次这样写。

1.3 当向文件写入数据完成后

文件的其余的块依次这样写。
Client调用FSDataOutputStream.close()方法,关闭输出流。

1.4 调用FileSystem.complete()方法,告诉NN该文件写入成功。
2.文件读流程

在这里插入图片描述

2.1 Client调用FileSystem.open(filePath)方法,

Client与NN进行【rpc】通信,NN返回该文件的部分或者全部的block列表,也就是返回FSDataInputStream对象。

2.2 Client调用FSDataInputStream对象read()方法;
  • a) 与第一个块最近的DN进行read,读取完成后,会check:1) 假如ok,就关闭与当前DN的通信;2) 假如失败,会记录
    失败块+DN信息,下次不会再读取,并去该块的第二个DN地址读取。
  • b) 然后去第二个块的最近的DN上通信读取,check后,关闭通信。
  • c) 假如block列表读取完成后,文件更新还未结束,FileSystem会再次从NN获取该文件的下一批次的block列表。
    (感觉就是连续的数据流,对于客户端操作是透明无感知的)
2.Client调用FSDataInputStream.close()方法,关闭输入流。

3. 整理多节点,单节点的磁盘均衡

3.1 多节点的磁盘均衡

在集群搭建刚开始的时候就应该部署脚本定期进行多节点的数据均衡,保证每台节点上空间使用率在一个比较平均的水位
命令:

[ruoze@rzdata001 sbin]$ pwd
/home/ruoze/app/hadoop/sbin
[ruoze@rzdata001 sbin]$ ls | grep balancer
start-balancer.sh
stop-balancer.sh
[ruoze@rzdata001 sbin]$ 

以5%为阈值进行多节点的数据均衡:(单节点空间使用率-集群空间平均使用率)>5%,进行数据均衡。默认是10%。

[ruoze@rzdata001 sbin]$ ./start-balancer.sh  -threshold 5     # 以5%为阈值进行多节点的数据均衡。(单节点空间使用率-集群空间平均使用率)>5%,进行数据均衡。默认是10%
starting balancer, logging to /home/ruoze/app/hadoop-2.6.0-cdh5.16.2/logs/hadoop-ruoze-balancer-rzdata001.out
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved
[ruoze@rzdata001 sbin]$ 

停止数据均衡的操作

[ruoze@rzdata001 sbin]$ ./stop-balancer.sh 
no balancer to stop
[ruoze@rzdata001 sbin]$ 
文件参数默认值描述
hdfs-site.xmldfs.datanode.balance.bandwidthPerSec30m进行数据均衡是每秒限制的带宽
3.2 单节点多磁盘的数据均衡

官网文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSDiskbalancer.html

hdfs diskbalancer -plan rzdata001                 # 生成rzdata001.plan.json
hdfs diskbalancer -execute rzdata001.plan.json    # 执行
hdfs diskbalancer -query rzdata001                # 查询状态
  • 前提: 开启功能
[ruoze@rzdata001 sbin]$ hdfs diskbalancer -plan rzdata001
19/12/08 18:44:25 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/12/08 18:44:26 ERROR tools.DiskBalancerCLI: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.diskbalancer.DiskBalancerException): Disk Balancer is not enabled.
        at org.apache.hadoop.hdfs.server.datanode.DiskBalancer.checkDiskBalancerEnabled(DiskBalancer.java:302)
        at org.apache.hadoop.hdfs.server.datanode.DiskBalancer.getVolumeNames(DiskBalancer.java:259)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.getDiskBalancerSetting(DataNode.java:3259)
        at org.apache.hadoop.hdfs.protocolPB.ClientDatanodeProtocolServerSideTranslatorPB.getDiskBalancerSetting(ClientDatanodeProtocolServerSideTranslatorPB.java:361)
        at org.apache.hadoop.hdfs.protocol.proto.ClientDatanodeProtocolProtos$ClientDatanodeProtocolService$2.callBlockingMethod(ClientDatanodeProtocolProtos.java:17901)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2278)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2274)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1924)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2272)

[ruoze@rzdata001 sbin]$ 
文件参数默认值描述
hdfs-site.xmldfs.disk.balancer.enabledtrue单节点磁盘均衡是否开启
[ruoze@rzdata001 sbin]$ hdfs diskbalancer -plan rzdata001
19/12/08 22:13:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/12/08 22:13:19 INFO planner.GreedyPlanner: Starting plan for Node : rzdata001:50020
19/12/08 22:13:19 INFO planner.GreedyPlanner: Compute Plan for Node : rzdata001:50020 took 2 ms 
19/12/08 22:13:20 INFO command.Command: No plan generated. DiskBalancing not needed for node: rzdata001 threshold used: 10.0
[ruoze@rzdata001 sbin]$ 
  • 什么时候手动或调度执行?
    a.新盘加入
    b.监控服务器的磁盘剩余空间 小于阈值 10%,发邮件预警 手动执行

  • 多个磁盘作为datanode的数据目录时,是加在 dfs.datanode.data.dir这个参数中,默认英文逗号(comma-delimited)分隔。集群的所有节点的磁盘应该保持一致。

  • 为什么datanode在生产上挂载多个物理的磁盘目录,比如:
    /data01 disk1
    /data02 disk2
    /data03 disk3
    答:为了高效率写 ,高效率读

4. 安全模式

  • HDFS集群故障时,必要的话需要启动安全模式,暂停数据写入:hdfs dfsadmin -safemode enter
  • 故障修复时关闭安全模式:hdfs dfsadmin -safemode leave
  • 安全模式只对写有影响,在生产上应该在架构时在数据写入的时候做好闸门,必要的时候关闭数据写入,避免集群进入安全模式时抛出大量异常影响生产。如果Namenode日志显示进入safe mode,正常手动让其离开安全模式。

5.hdfs dfs命令

待补充

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值