【发布时间】:2020-04-16 09:48:33
【问题描述】:
从某个时间点开始,我们的 JVM(实际上是 Yarn NodeManager)开始报告 UnknownHostException; 由JVM代码报告
return InetAddress.getByName(host);
接下来的2天多,异常一直存在;在报告此错误期间,我进行了以下测试:
- 在错误发生期间,ping 可以成功并获得 IP 地址(很奇怪);
- 报错期间,我写了一个简单的测试用例来检查主机名解析,它也可以成功:
- 重启JVM后,错误消失了;
这是我用来测试的代码:
public class Main {
public static void main(String[] args){
InetSocketAddress addr = NetUtils.createSocketAddr("host-name:8020");
System.out.println(addr.isUnresolved());
}
}
# NetUtils is a YARN class which simply call the InetAddress.getByName()
public static InetSocketAddress createSocketAddrForHost(String host, int port) {
String staticHost = getStaticResolution(host);
String resolveHost = (staticHost != null) ? staticHost : host;
InetSocketAddress addr;
try {
InetAddress iaddr = SecurityUtil.getByName(resolveHost);
// if there is a static entry for the host, make the returned
// address look like the original given host
if (staticHost != null) {
iaddr = InetAddress.getByAddress(host, iaddr.getAddress());
}
addr = new InetSocketAddress(iaddr, port);
} catch (UnknownHostException e) {
addr = InetSocketAddress.createUnresolved(host, port);
}
return addr;
}
我们好久没改/etc/hosts了;
环境变量: JDK:java版本“1.8.0_121” 操作系统:
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
我相信在错误开始发生的时间点,是的,网络有问题。但奇怪的是:
- 为什么网络恢复后无法恢复(例如,当我 发现这个错误并做一些测试和ping)。其实网络 问题只发生了 30 分钟,但 JVM 仍然报告这些 错误;
- 为什么重启JVM后问题消失了?
我检查了JVM配置,networkaddress.cache.ttl和networkaddress.cache.negative.ttl都是默认值;所以,当我们找到未解析的主机名时,我应该重试,网络恢复后应该会成功;
【问题讨论】:
标签: jvm inetaddress unknown-host