副本放置策略
假设在数据中心的一个机架上面有5个服务器。一般正常的机架放10个,为什么10个,这个是按照机架的电量去算的,每个服务器分配多少安培的电流,一个机柜的电流安培数是有标准的,一个机柜的电流大小除以一个服务器的电流大小,算一个估算值。】
正常情况下,就是三个副本。副本不是越多越好,越多,需要的存储空间就大了,而且写的越慢。
第一个副本:
放置在上传的DN节点上,比如现在用client客户端上传的文件提交到HDFS上面,上传的那台机器正好是DataNode节点,会优先在自己所在的节点上上传一个副本,这样就不需要通过网络IO通过网线去传输数据包,这样会节省时间。
如果是集群外提交,则随机挑选一台磁盘不太慢、CPU不太忙的节点上。(老大NN是知道哪些节点是空闲的,会返回地址列表让你去上传)。
第二个副本:
放置在与第一个副本不同的机架的节点上。
第三个副本:
放置在与第二个副本相同机架的不同节点上。
假如还有更多的副本,就随机放,随机放在节点上。
生产上 尽量将上传数的动作,读写的动作 选取DataNode节点上。优先自己,这样减少网络带宽消耗,减少时间。
面试题:
集群上有DataNode 3个,其中一个DataNode挂了,那么一个文件有三个副本,
那么我现在能够正确读取文件内容吗?
待补充........
(网上:第一不会给储存带来影响,因为有其他的副本保存着,不过建议尽快修复,第二会影响运算的效率,机器少了,reduce在保存数据时选择就少了,一个数据的块就大了所以就会慢。)
其中DataNode挂了其实就是block Miss,那么怎样去修复?
1.手动修复
参考:
hdfs |grep debug
hdfs debug
Usage: hdfs debug <command> [arguments]
verify [-meta <metadata-file>] [-block <block-file>]
recoverLease [-path <path>] [-retries <num-retries>]