HDFS到底是怎么分配块的??

HDFS到底是怎么分配块的??

比如现在有一个  名字叫   a.big  大小为 300MB 的文件    

它被分成了  3个block  ,   且  副本有 2个  (2个台服务器,分别运行着  dataNode,即和课程环境一样)


为什么视频中说     nameNode不知道这些block放在哪里呢??


1. 我的问题就是    到底   被分成的3个 block 放哪里???   是不是随机分配到    dataNode1  和   dataNode2中的服务器上去???


2. 那  2个副本   6个block   又怎么分配存储  ,, 它们存储的数量都是随机的吗???

 3.   亦或是  平均分配

               DN1  存着   原3个block    ,,  6个副本block

     同理   DN2  存着   原3个block    ,,  6个副本block

??????????????


4.  到底是怎么分配block的??

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

问:为什么视频中说     nameNode不知道这些block放在哪里呢??

答:这样说是因为namenode的fsimage(edits)中只包含了file和block list之间的关系,当namenode重启的时候,namenode是无法直接获取到具体这些block存在哪些节点上面的,这份信息是在datanode重启的时候上报给namenode的(datanode在启动的时候会扫描自己节点中的block块信息,然后把block块信息和节点信息一块上报给namenode)。当datanode把这份信息上报给namenode之后,namenode就知道block在哪了。



1. 被分成的3个block会首先在集群内随机找datanode节点存储这些block

随机的情况下其实大概率会出现2个block分配到某一个datanode节点上,第3个block分配到另一个datanode上。


2.目前咱们这个一主两从的集群,一个block块最多只能存储2份(通过dfs.replication设置的值为2),因为只有两个从节点,集群不允许存储超过2份。

在上面第一个问题里面,已经对这3个block块分别存储了1份,所以对应的还需要对这3个block块再分别复制一份副本存储到其他datanode节点上

(在这有一个规则,同一个block的副本不能存储到一个节点上,否则是没有意义的,所以在给这个block块分配副本的时候会按照这样的策略:先到其它远程机架上随机寻找目标节点,如果能找到,就把副本分配到这个节点上,这样主要是为了保证数据安全,如果在其它远程机架上没有找到可用节点,则退而求其次,在当前机架内随机寻找节点分配数据)


3  4

假设block1、block2被随机分到了datanode1上,block3被随机分到了datanode2上

则对应的block1和block2的副本一定会存在datanode2上(因为我们这个集群就两个datanode节点,如果有多个的话就不一定是datanode2了)

block3的副本一定会存在datanode1上。



HDFS的block块分配策略没有讲的特别细,是因为这块在工作中偏运维了,还需要涉及到机架这些概念,如果大家感兴趣,后面我可以画个图仔细描述一下这个分配策略,到时候推送到微信公众号上。





  • py_builder 提问者 #1
    谢谢老师。。我基本看明白了,但还是麻烦老师画下图,分析下block块到底是怎么分布存放的??
    2020-10-26 09:12:27
  • py_builder 提问者 #2
    完全看明白了,谢谢老师
    2020-10-26 09:14:04
  • 老师,datanode把block信息上报给namenode的话,启动datanode后,可以在namenode中查看到datanode上报的信息吗?

    2021-07-13 22:26:25
徐老师 2020-10-26 09:09:23

这里的2个副本,包含了原始的那一份block块

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师