赞
踩
假设设置为3个副本:
第一个副本: 1) 假如上传节点本身为DN节点,优先放置本节点; 2) 否则就随机挑选一台磁盘不太慢,CPU不太繁忙的节点;
第二个副本: 放置在与第一个副本的不同机架的节点上
第三个副本: 放置在与第二个副本的相同机架的不同节点上
CDH机架有一个默认机架 虚拟的概念,一般不调整这种默认机架
执行命令hadoop fs -put xxx.log /
时,文件上传过程对用户是无感知的。后台代码的逻辑如下:
Client与NN进行【rpc】通信,NN检查是否目录、文件是否存在 及 是否有权限创建:
1)假如不ok,NN就返回错误信息;
2)假如ok,NN就创建一个新文件,不关联任何的block块,返回一个FSDataOutputStream对象;
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个副本写完。
然后余下的块依次这样写。
文件的其余的块依次这样写。
Client调用FSDataOutputStream.close()方法,关闭输出流。
Client与NN进行【rpc】通信,NN返回该文件的部分或者全部的block列表,也就是返回FSDataInputStream对象。
在集群搭建刚开始的时候就应该部署脚本定期进行多节点的数据均衡,保证每台节点上空间使用率在一个比较平均的水位
命令:
[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.xml | dfs.datanode.balance.bandwidthPerSec | 30m | 进行数据均衡是每秒限制的带宽 |
官网文档: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.xml | dfs.disk.balancer.enabled | true | 单节点磁盘均衡是否开启 |
[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
答:为了高效率写 ,高效率读
hdfs dfsadmin -safemode enter
hdfs dfsadmin -safemode leave
待补充
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。