Политика размещения блоков используется, когда новый блок данных записывается в HDFS. Это может быть, когда данные попадают в HDFS или задание записывает данные в HDFS и т. Д. Он используется для оптимального размещения блоков, так что в кластере HDFS есть единые блоки распределения.
См., Например, алгоритм, используемый блок по умолчанию класса политики размещения (BlockPlacementPolicyDefault
) является: политика размещения
The replica placement strategy is that if the writer is on a datanode,
the 1st replica is placed on the local machine, otherwise a random datanode.
The 2nd replica is placed on a datanode that is on a different rack. The 3rd
replica is placed on a datanode which is on a different node of the rack as
the second replica.
Блока также используется следующий HDFS утилиты:
- Balancer: Остатков использование дискового пространства на HDFS , В этом случае
BlockPlacementPolicy
может быть использован для размещения блоков на других узлах, чтобы перебалансировать кластер
- NamenodeFsck: - Утилита для проверки HDFS на наличие несоответствий. В этом случае
BlockPlacementPolicy
используется для проверки количества неверно реплицированных блоков.
У вас может быть собственный класс размещения блоков. Для этого вам необходимо расширить класс BlockPlacementPolicy
и задать параметр конфигурации dfs.block.replicator.classname
для вашего пользовательского имени класса в hdfs-site.xml.
По умолчанию BlockPlacementPolicyDefault
класса используется для размещения блока:
final Class<? extends BlockPlacementPolicy> replicatorClass = conf.getClass(
DFSConfigKeys.DFS_BLOCK_REPLICATOR_CLASSNAME_KEY,
DFSConfigKeys.DFS_BLOCK_REPLICATOR_CLASSNAME_DEFAULT,
BlockPlacementPolicy.class);
Вы не можете изменить политику размещения блока для каждого задания. Причиной этого является то, что политика размещения блоков создается один раз, когда появляется NameNode.
Ниже приведена последовательность вызовов для инициализации BlockPlacementPolicy
. Эти шаги выполняются, при запуске NameNode:
Initialize NameNode
, когда NameNode
запускается
NameNode::initialize(conf); // Initialize NameNode
NameNode::loadNamesystem(conf); // Load name system
Initialize FsNameSystem
. FsNameSystem
делает всю работу бухгалтерского учета на NameNode
FSNamesystem.loadFromDisk(conf); // Loads FS Image from disk
Instantiate BlockManager
.Это называется в то время как инстанцировании FsNameSystem
this.blockManager = new BlockManager(this, conf);
Instantiate BlockPlacementPolicy
. Это называется BlockManager
.
blockplacement = BlockPlacementPolicy.getInstance(
conf, datanodeManager.getFSClusterStats(),
datanodeManager.getNetworkTopology(),
datanodeManager.getHost2DatanodeMap());
Поскольку этот экземпляр один раз, вы не можете изменить это для каждого задания.
Хорошо, это означает, что в общем кластере HDFS, в котором у нас нет доступа администратора, мы не можем изменить BlockPlacementPolicy, потому что он уже запущен и работает, и мы не можем его перезапустить. – Wajahat
Вы можете изменить политику. Но он применим для кластера. Вы не можете изменить его для каждой работы. –
Можем ли мы изменить его, не нарушая работу, выполняемую другими людьми в кластере? – Wajahat