HDFS 机架感知是一种逻辑上的网络架构设计,它主要是用来区分不同节点的网络拓扑情况下,保证数据是能够高性能写入和查询的一种机制,毕竟跨网络的数据读写是有网络带宽消耗的,当没有配置机架信息时,所有的机器hadoop都默认在同一个默认的机架下,名为 “/default-rack”,这种情况下,任何一台datanode机器,不管物理上是否属于同一个机架,都会被认为是在同一个机架下,此时,就很容易出现之前提到的增添机架间网络负载的情况。在没有机架信息的情况下,namenode默认将所有的slaves机器全部默认为在/default-rack下,此时写block时,三个datanode机器的选择完全是随机的。
当配置了机架感知信息以后,hadoop在选择三个datanode时,就会进行相应的判断:
通过以上策略,namenode在选择数据块的写入datanode列表时,就充分考虑到了将block副本分散在不同机架下,并同时尽量地避免了之前描述的网络开销
实际场景配置导致数据不均衡
本场景是基于HDP+Ambari的配置实现,其他集群搭建模式其实也会遇到该问题,首先看实际问题截图
会发现实际的数据写入很不均衡,初次怀疑是HDFS副本写入机制的问题,HDFS副本写入机制进行了解
查看ambari中host的rack,默认的/default-rack后面还有个id,每个节点的id不同,
eg. /default-rack/fdd9cc43ce8aee1f3bb3d8b1832ab29f3b17a8a986607d5241b2f107
使用 hdfs dfsadmin -printTopology命令查看拓扑分布情况
HDFS Rack特性验证
一、增加节点 [ host=10.120.7.155 ] 只修改ambari 主机rack信息
(1)拓扑文件topology_mappings.data
(2) 拓扑结构
2、修改 [ host=10.120.7.155 ] Ambari 的rack 信息:
(1)修改Ambari 页面rack信息
(2)select * from hosts where ipv4='10.120.7.155'; 可以查询rack信息已经修改
(3)hdfs 拓扑信息没有发生变化
(4)hdfs 拓扑映射文件没有发生变化
(4)namenode 日志文件没有发生变化
2、安装datanode节点在 [ host=10.120.7.155 ]
(1)安装datanode 节点
(2)集群拓扑信息没有发生变化
(3)集群拓扑信息发生变化,即使设置了ambari机架信息/rack2将主机[ host=10.120.7.155 ] 挂载默认的/default-rack下
二、增加节点 [ host=10.120.6.206 ] 修改ambari 主机rack信息,同时修改拓扑文件topology_mappings.data
(1)select * from ambari.hosts where ipv4='10.120.6.206'; 可以查询rack信息已经修改,修改后集群拓扑文件,集群拓扑结构没有发生变化
(2)添加 [ host=10.120.6.206 ] 拓扑文件信息,namenode日志与集群拓扑没有发生变化,
(3)添加datanode节点,namenode 日志,拓扑结构没有发生变化
(4)启动datanode 组件服务,hdfs集群的拓扑结构添加到设置的/rack2下
二、重启namenode服务,查看拓扑结构的变化
1、重启namenode 后[host=10.120.7.155] 的rack 信息变成ambari设置的rack信息
四、手动修改topology_mapps.data
1、手动修改topology_mapps.data
2、重新该datanode 节点,拓扑结构中rack信息没有变化
HDFS Rack特性总结
通过以上测试可以得知:ambari设置rack 信息会保存在ambari.hosts 表中。
(1)10.1.7.155通过ambari设置rack信息,不填写topology_mapps.data文件,安装启动datanode组件,会将主机挂到/default-rack下,拓扑文件没有自动填写信息。
(2)10.1.6.206 通过ambari设置rack信息,填写主机对应topology_mappings文件,安装启动datanode组件,会将主机节点挂载到ambari设置 /rack2下
(3)重启namenode 组件,发现 10.120.7.155 的拓扑信息自动填写拓扑文件中,并且rack信息是ambari设置的rack信息。
(4)修改topology_mapps.data文件的主机rack信息,重启datanode节点,hdfs集群的拓扑结构没有发生变化,namenode日志显示还是旧的rack信息,这时候没有读取拓扑文件中的信息。
【结论】:
(1)扩展启动datanode节点时,会读取 topology_mapps.data 文件配置信息,如果文件中没有配置该节点的rack信息,该节点会被挂载到/default-rack下;如果文件中配置了该节点rack信息,则将该节点rack信息添加内存中;
(2)重启namenode组件会从ambari设置的 ambari.hosts中读取rack信息,写入文件
topology_mapps.data中。更新集群的拓扑信息。
(3)修改topology_mappings.data文件,重启datanode, 集群的拓扑结构没有发生变化。