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的??
正在回答
问:为什么视频中说 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块分配策略没有讲的特别细,是因为这块在工作中偏运维了,还需要涉及到机架这些概念,如果大家感兴趣,后面我可以画个图仔细描述一下这个分配策略,到时候推送到微信公众号上。
- 参与学习 1151 人
- 提交作业 5960 份
- 解答问题 1144 个
不用Java初级内容充数!不用与大数据岗位无关内容占课时!我们做的就是“精华版”大数据课程
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星