2015-11-29 2 views
1

Я знаю, что свойство dfs.block.replicator.classname можно использовать для изменения BlockPlacementPolicy. Я хочу знать, когда именно эта политика используется для размещения данных? Как и при использовании -copyFromLocal/-put? Я думаю, что выход задания также будет размещен в соответствии с этой политикой.Когда используется политика размещения блоков?

И, во-вторых, свойство, указанное в файле conf, будет влиять на весь кластер приложений. Если я использую общий кластер, существует ли способ изменить политику BlockPlacement только для заданий, выполняемых под моим пользователем, или есть способ изменить политику для каждой работы?

Я использую банду хаоса для потоковой передачи на кластере из 4 узлов.

ответ

2

Политика размещения блоков используется, когда новый блок данных записывается в 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:

  1. Initialize NameNode, когда NameNode запускается

    NameNode::initialize(conf); // Initialize NameNode 
    NameNode::loadNamesystem(conf); // Load name system 
    
  2. Initialize FsNameSystem. FsNameSystem делает всю работу бухгалтерского учета на NameNode

    FSNamesystem.loadFromDisk(conf); // Loads FS Image from disk 
    
  3. Instantiate BlockManager.Это называется в то время как инстанцировании FsNameSystem

    this.blockManager = new BlockManager(this, conf); 
    
  4. Instantiate BlockPlacementPolicy. Это называется BlockManager.

    blockplacement = BlockPlacementPolicy.getInstance(
           conf, datanodeManager.getFSClusterStats(), 
           datanodeManager.getNetworkTopology(), 
           datanodeManager.getHost2DatanodeMap()); 
    

Поскольку этот экземпляр один раз, вы не можете изменить это для каждого задания.

+0

Хорошо, это означает, что в общем кластере HDFS, в котором у нас нет доступа администратора, мы не можем изменить BlockPlacementPolicy, потому что он уже запущен и работает, и мы не можем его перезапустить. – Wajahat

+0

Вы можете изменить политику. Но он применим для кластера. Вы не можете изменить его для каждой работы. –

+0

Можем ли мы изменить его, не нарушая работу, выполняемую другими людьми в кластере? – Wajahat

Смежные вопросы