如何解决启动大规模HDFS服务时的上线风暴?
在大规模集群启动HDFS服务时,由于同时上线的服务器太多,会造成NameNode的压力太大。一旦NameNode压力过大将导致DataNode连接NameNode失败,从而系统以为该DataNode下线,造成大量Data Block的重分布计算,又进一步恶化了NameNode压力,从而导致NameNode无法完成启动,整个HDFS服务无法上线。
解决的方法是限制同时上线的DataNode的数量,分批次将DataNode上线。
准备阶段
- 备份当前HDFS元数据,包括namedir下的FSImage以及JournalNode的EditsLog;
- 记录先有文件数目以及block数目,包括pending deletion,miss以及under-replicated的数目和信息
启动阶段
启动NameNode
- 尽量减少NameNode负担, 如去掉Debug日志输出等;
- 恢复safemode退出缺省参数,如dfs.namenode.safemode.threshold-pct参数,保障集群数据正确,如:
<property> <name>dfs.namenode.safemode.threshold-pct</name> <value>1f</value> </property>
- 启动iptables服务;
- 使用iptables限制网络端口8020最大连接数为20:
其中8020为ipc端口iptables -A INPUT -p tcp --dport 8020 -m connlimit --connlimit-above 20 --connlimit-mask 0 -j REJECT
- 启动NN服务,确保进入safemode
启动DataNode
- 按20个DataNode节点一批,启动服务或者运行下面的命令:
其中,ipc_port的缺省值为50020hdfs dfsadmin -triggerBlockReport datanode_host:ipc_port
- 操作完成后,等待NameNode退出SafeMode。
- 使用命令,强制再次进入SafeMode:
hdfs dfsadmin -safemode enter
检查
- 登录NameNode的50070页面,的DataNode列表页,比如http://52.78.156.157:50070/dfshealth.html#tab-datanode ,统计每一个datanode的block的总数,确保与NameNode总数以及之前备份的block总数相同。
- 退出HDFS安全模式:
hdfs dfsadmin -safemode leave
- 删除不必要的文件或日志;
- 禁止iptables服务,并对外提供服务。