block 的大小选择

HDFS 读取数据时是读取 block,再将不同 block 组成完整的文件. 所以这里涉及到两个时间, 寻址时间和块传输时间.

由于目前磁盘的传输速率普遍为 100MB/s, 而 HDFS的平均寻址时间大概为 10ms, 经过前人的大量测试发现,寻址时间为传输时间的 1% 时,为最佳状态. 所以hadoop将块的大小默认设置为 128M ( 10ms / 0.01 * 100MB/s = 100MB 向上取整 )

生成环境中, 决定block的大小取决于磁盘的传输速率. 可以通过测试磁盘的连续读写速率来调整 block 的大小

block 的元信息大小

每个block 的元数据约 150 byte,需要加载到内存当中。所以需要对 namenode 的内存可以存储块的最大容量进行评估。

与DataNode通信

NameNode 会与 DataNode 之间会通过心跳机制进行通信,每个 DataNode 会定期向 NameNode 发送心跳以及 Blockreport ,Blockreport 上包含了该 DataNode 上的 block 列表,这种心跳机制也是 NameNode 检测 DataNode 是否存活的依据。

默认发送心跳 dfs.heartbeat.interval 的时间是 3 秒,默认判断 DataNode 是否存活的时间是 10 分钟,也就是在超时时间内接收不到该 DataNode 的心跳,则认为它已经宕机,不会再与该 DataNode 发送读写操作。

超时时间的计算公式为

$$ timeout = 2heartbeat.recheck.interval + 10dfs.heartbeat.interval $$

而默认的heartbeat.recheck.interval大小为5分钟,dfs.heartbeat.interval默认为3秒。

<property>
	<name>heartbeat.recheck.interval</name>
	<value>300000</value>
	<description>单位是毫秒</description>
</property>
<property>
	<name>dfs.heartbeat.interval</name>
	<value>3</value>
	<description>单位是秒</description>
</property>

重写副本的触发条件