Hadoop 何时使用块放置策略?

Hadoop 何时使用块放置策略?,hadoop,hdfs,yarn,hadoop-streaming,Hadoop,Hdfs,Yarn,Hadoop Streaming,我知道dfs.block.replicator.classname属性可用于更改BlockPlacementPolicy。我想知道这个策略何时用于放置数据?比如在执行-copyFromLocal/-put时使用它? 我认为一项工作的产出也将根据这一政策进行安排 其次,在conf文件中指定的属性将影响整个hadoop集群。如果我使用的是共享集群,是否有办法仅更改在我的用户下执行的作业的BlockPlacement策略,或者有办法更改每个作业的策略 我在4节点集群上使用hadoop streamin

我知道dfs.block.replicator.classname属性可用于更改BlockPlacementPolicy。我想知道这个策略何时用于放置数据?比如在执行-copyFromLocal/-put时使用它? 我认为一项工作的产出也将根据这一政策进行安排

其次,在conf文件中指定的属性将影响整个hadoop集群。如果我使用的是共享集群,是否有办法仅更改在我的用户下执行的作业的BlockPlacement策略,或者有办法更改每个作业的策略


我在4节点集群上使用hadoop streaming jar。

每当向HDFS写入新的数据块时,就会使用块放置策略。它可以是当数据被摄入HDFS或作业将数据写入HDFS等时。它用于块的最佳放置,以便在HDFS群集中有一个统一的分布块

例如,默认块放置策略类(
BlockPlacementPolicyDefault
)使用的算法为:


以下HDFS实用程序也使用块放置策略:

  • 平衡器:平衡HDFS上的磁盘空间使用。在这种情况下,
    BlockPlacementPolicy
    可用于将块放置到其他节点,以便重新平衡集群
  • NamenodeFsck:-用于检查HDF不一致性的实用程序。在这种情况下,
    BlockPlacementPolicy
    用于检查错误复制的块的数量
您可以拥有自己的自定义块放置类。为此,您需要扩展
BlockPlacementPolicy
class,并将配置参数
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);
  • 初始化
    FsNameSystem
    FsNameSystem
    在NameNode上执行所有簿记工作

    FSNamesystem.loadFromDisk(conf); // Loads FS Image from disk
    
  • 实例化
    BlockManager
    。在实例化
    FsNameSystem

    this.blockManager = new BlockManager(this, conf);
    
  • 实例化
    BlockPlacementPolicy
    。这由
    BlockManager
    调用

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

  • 因为这是一次实例化,所以不能为每个作业更改它

    好的,这意味着在我们没有管理员访问权限的共享HDFS群集中,我们无法更改BlockPlacementPolicy,因为如果群集已经启动并运行,我们无法重新启动。您可以更改策略。但它适用于集群范围。您不能针对每个作业更改它。我们可以在不中断其他人在群集中运行的作业的情况下更改它吗?如果您更改它,您需要重新启动NameNode,因为在启动NameNode时BlockPlacementPolicy已实例化。
    this.blockManager = new BlockManager(this, conf);
    
    blockplacement = BlockPlacementPolicy.getInstance(
                     conf, datanodeManager.getFSClusterStats(),
                     datanodeManager.getNetworkTopology(),
                     datanodeManager.getHost2DatanodeMap());