本文包含如下内容:
① 通过图解+源码分析/a1/b1/node1和 /a1/b2/node2 这两个节点的网络距离怎么算出来的
② 客户端读文件时,副本的优先级。(怎么排序的,排序规则都有哪些?)
③ 我们集群发现的一个问题。
客户端读时,通过调用getblocklocations rpc 获取文件的各个块。
在给客户端返回这些块信息之前,namenode会对每个块的各个副本(例如默认的3副本)按照一定规则排序。
这些规则大概有:
① 把在decommissioned/stale/slow这些状态节点上的副本移到后面;
② 计算客户端与每个副本所在节点的网络距离,把距离小的放在前面;
③ 同时也会考虑 storage type、节点的load(xceiver线程数)等因素。
顺着 clientprotocol#getblocklocations 这个rpc方法往下找,最终找到相关的源码位置,
在org.apache.hadoop.hdfs.server.namenode.fsnamesystem#sortlocatedblocks
方法:
此方法参数:
- clientmachine:代表客户端机器的字符串,一般是ip;
- blocks:客户端要读的文件的块的信息(locatedblocks对象里有locatedblock对象的列表)。
private
发表评论