什么时候使用块放置策略?
When is the Block Placement Policy used?
我知道 dfs.block.replicator.classname 属性 可以用来改变 BlockPlacementPolicy。我想知道这个策略到底是什么时候用来放置数据的?就像在执行 -copyFromLocal/-put 时使用它一样吗?
我觉得一个job的输出也会按照这个policy来放。
其次,在 conf 文件中指定的 属性 将影响整个 hadoop 集群。如果我使用的是共享集群,有没有办法只为在我的用户下执行的作业更改 BlockPlacement 策略,或者有没有办法为每个作业更改策略?
我在 4 节点集群上使用 hadoop streaming jar。
每当将新数据块写入 HDFS 时,都会使用块放置策略。它可能是当数据被摄取到 HDFS 或作业将数据写入 HDFS 等。它用于块的最佳放置,以便在 HDFS 集群中有一个均匀分布的块。
例如默认块放置策略 class (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: 平衡磁盘 space 在 HDFS 上的使用。在这种情况下,
BlockPlacementPolicy
可用于将块放置到其他节点,以重新平衡集群
- NamenodeFsck: - 检查 HDFS 不一致的实用程序。在这种情况下
BlockPlacementPolicy
用于检查错误复制块的数量。
您可以拥有自己的自定义方块放置 class。为此,您需要扩展 BlockPlacementPolicy
class 并将配置参数 dfs.block.replicator.classname
设置为您在 hdfs-site.xml.
中的自定义 class 名称
默认BlockPlacementPolicyDefault
class用于块放置:
final Class<? extends BlockPlacementPolicy> replicatorClass = conf.getClass(
DFSConfigKeys.DFS_BLOCK_REPLICATOR_CLASSNAME_KEY,
DFSConfigKeys.DFS_BLOCK_REPLICATOR_CLASSNAME_DEFAULT,
BlockPlacementPolicy.class);
您不能更改每个作业的块放置策略。这样做的原因是,块放置策略在 NameNode 出现时实例化一次。
以下是初始化 BlockPlacementPolicy
的调用顺序。这些步骤在 NameNode 启动时执行:
初始化NameNode
,当NameNode
启动时
NameNode::initialize(conf); // Initialize NameNode
NameNode::loadNamesystem(conf); // Load name system
初始化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());
由于这是一次实例化,您不能为每个作业更改它。
我知道 dfs.block.replicator.classname 属性 可以用来改变 BlockPlacementPolicy。我想知道这个策略到底是什么时候用来放置数据的?就像在执行 -copyFromLocal/-put 时使用它一样吗? 我觉得一个job的输出也会按照这个policy来放。
其次,在 conf 文件中指定的 属性 将影响整个 hadoop 集群。如果我使用的是共享集群,有没有办法只为在我的用户下执行的作业更改 BlockPlacement 策略,或者有没有办法为每个作业更改策略?
我在 4 节点集群上使用 hadoop streaming jar。
每当将新数据块写入 HDFS 时,都会使用块放置策略。它可能是当数据被摄取到 HDFS 或作业将数据写入 HDFS 等。它用于块的最佳放置,以便在 HDFS 集群中有一个均匀分布的块。
例如默认块放置策略 class (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: 平衡磁盘 space 在 HDFS 上的使用。在这种情况下,
BlockPlacementPolicy
可用于将块放置到其他节点,以重新平衡集群 - NamenodeFsck: - 检查 HDFS 不一致的实用程序。在这种情况下
BlockPlacementPolicy
用于检查错误复制块的数量。
您可以拥有自己的自定义方块放置 class。为此,您需要扩展 BlockPlacementPolicy
class 并将配置参数 dfs.block.replicator.classname
设置为您在 hdfs-site.xml.
默认BlockPlacementPolicyDefault
class用于块放置:
final Class<? extends BlockPlacementPolicy> replicatorClass = conf.getClass(
DFSConfigKeys.DFS_BLOCK_REPLICATOR_CLASSNAME_KEY,
DFSConfigKeys.DFS_BLOCK_REPLICATOR_CLASSNAME_DEFAULT,
BlockPlacementPolicy.class);
您不能更改每个作业的块放置策略。这样做的原因是,块放置策略在 NameNode 出现时实例化一次。
以下是初始化 BlockPlacementPolicy
的调用顺序。这些步骤在 NameNode 启动时执行:
初始化
NameNode
,当NameNode
启动时NameNode::initialize(conf); // Initialize NameNode NameNode::loadNamesystem(conf); // Load name system
初始化
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());
由于这是一次实例化,您不能为每个作业更改它。