更新时间:2022-02-22 GMT+08:00

NameNode节点长时间满负载,HDFS客户端无响应

问题

当NameNode节点处于满负载、NameNode所在节点的CPU 100%耗尽时,导致NameNode无法响应,对于新连接到该NameNode的HDFS客户端,能够主备切换连接到另一个NameNode,进行正常的操作,而对于已经连接到该NameNode节点的HDFS客户端可能会卡住,无法进行下一步操作。

回答

目前出现上述问题时使用的是默认配置,如表1所示,HDFS客户端到NameNode的RPC连接存在keep alive机制,保持连接不会超时,尽力等待服务器的响应,因此导致已经连接的HDFS客户端的操作会卡住。

对于已经卡住的HDFS客户端,可以进行如下操作:

  • 等待NameNode响应,一旦NameNode所在节点的CPU利用率回落,NameNode可以重新获得CPU资源时,HDFS客户端即可得到响应。
  • 如果无法等待更长时间,需要重启HDFS客户端所在的应用程序进程,使得HDFS客户端重新连接空闲的NameNode。

解决措施:

为了避免该问题出现,可以在客户端的配置文件“core-site.xml”中做如下配置。

表1 参数说明

参数

描述

默认值

ipc.client.ping

当配置为true时,客户端会尽力等待服务端响应,定期发送ping消息,使得连接不会因为tcp timeout而断开。

当配置为false时,客户端会使用配置项“ipc.ping.interval”对应的值,作为timeout时间,在该时间内没有得到响应,即会超时。

在上述问题场景下,建议配置为false。

true

ipc.ping.interval

“ipc.client.ping”配置为true时,表示发送ping消息的周期。

“ipc.client.ping”设置为false时,表示连接的超时时间。

在上述问题场景下,建议配置一个较大的超时时间,避免服务繁忙时的超时,建议配置为900000,单位为ms。

60000