本文共 2191 字,大约阅读时间需要 7 分钟。
在HDFS(分布式文件系统)中,文件块的写入策略由两大类策略决定:副本放置策略(BlockPlacementPolicy)和磁盘选择策略(VolumeChoosingPolicy)。这两者在目标节点选择上存在某种矛盾,值得深入探讨。
副本放置策略通过BlockPlacementPolicy类决定文件块的目标写入节点,而磁盘选择策略则通过VolumeChoosingPolicy类决定目标节点上的具体磁盘目录。目前的实现中,DataNode端完全忽略NameNode提供的目标位置选择,这种做法是否合理值得商榷。
以下代码展示了服务端选择目标存储位置的逻辑:
DatanodeStorageInfo chooseStorage4Block(DatanodeDescriptor dnd, long blockSize, Listresults, 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 chooseStorage4Block(StorageType t, long blockSize) { final long requiredSize = blockSize * HdfsServerConstants.MIN_BLOCKS_FOR_WRITE; final long scheduledSize = blockSize * getBlocksScheduled(t); long remaining = 0; DatanodeStorageInfo storage = null; for (DatanodeStorageInfo s : getStorageInfos()) { if (s.getState() == State.NORMAL && s.getStorageType() == t) { if (storage == null) { storage = s; } long r = s.getRemaining(); if (r >= requiredSize) { remaining += r; } } } if (requiredSize > remaining - scheduledSize) { LOG.debug("The node {} does not have enough {} space (required={}, scheduled={}, remaining={}).", this, t, requiredSize, scheduledSize, remaining); return null; } return storage;} 为解决此问题,我们提出了“选择一致化”改造,旨在优化目标存储位置的选择逻辑。
数据传输改进:
storageId。服务端存储选择策略:
DatanodeStorageInfoChoosingPolicy,负责服务端磁盘目录的选择。一致化策略实现:
VolumeChoosingPolicyt,同时实现VolumeChoosingPolicy和DatanodeStorageInfoChoosingPolicy接口,确保服务端选择结果与DataNode策略一致。副本块的存储策略与磁盘选择策略的协同优化对HDFS的读写效率至关重要。建议将提案应用于内部版本进行测试和分析,以进一步提升HDFS的性能表现。
转载地址:http://tang.baihongyu.com/