前言
我们知道,在HDFS里,有2个与文件块写入紧密相连的策略选择类:副本放置策略(BlockPlacementPolicy)和磁盘选择策略(VolumeChoosingPolicy)。这两者有什么作用上的区别呢?前者决定了文件块的目标写入节点,后者决定了目标节点上哪个磁盘目录被写入。之前笔者已经写过相关策略的介绍文章了,感兴趣的同学可以点击此链接:HDFS副本放置策略和DataNode引用计数磁盘选择策略。如果这2个策略你都已经或多或少了解了,那么下面就开始进入本文的主题。
副本放置策略和磁盘选择策略之间的“矛盾”
这里为什么笔者会用了“矛盾”这个词呢?“矛盾”的地方在哪里呢?这个得从BlockPlacementPolicy策略类中的目标节点选择逻辑说起,请看下面一段执行代码:
//在候选节点内为块选出一个合适的存储目录位置
DatanodeStorageInfo chooseStorage4Block(DatanodeDescriptor dnd,
long blockSize,
List<DatanodeStorageInfo> results,
StorageType storageType) {
DatanodeStorageInfo storage =
dnd.chooseStorage4Block(storageType, blockSize);
if (storage != null) {
results.add(storage);
} else {
logNodeIsNotChosen(dnd, "no good storage to place the block ");
}
return storage;
}
然后是接下来的选择逻辑了,下面的代码很关键,请仔细看,
public DatanodeStorageInfo choo