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