最近集群将增加一批双网卡的机器,这时我就突然想到如何获取这些网卡的IP地址。但是第一次尝试用InetAddress没有得到预期结果。
运行结果这里使用到本机(MAC OS环境)的/etc/hosts这个文件获取相关IP信息(当然InetAddress获取主机名称处理没有这么简单,这里就不详细说明)
// 通过/etc/hosts来获取
InetAddress[] adds = InetAddress.getAllByName("master");
for (InetAddress t_add : adds) {
System.out.println(t_add);
}
后来在网上搜索了下,相关的处理,发现很多都是用调用外部命令的方式来获取,我个人觉得还是有点别扭,后来看看相关的java源码,可以用这个类NetworkInterface实现,使用方法
很简单,代码截取如下:
// 获取本地相关网卡信息 类似于ifconfig
Enumeration<NetworkInterface> list = NetworkInterface
.getNetworkInterfaces();
for (; list.hasMoreElements();) {
NetworkInterface nint = list.nextElement();
System.out.println("Net Card: " + nint.getDisplayName());
for (Enumeration<InetAddress> addresses = nint.getInetAddresses(); addresses
.hasMoreElements();) {
InetAddress i_adr = addresses.nextElement();
System.out.println("------->" + i_adr.getHostAddress());
}
}
就可以获取多个网卡的IP地址了。
运行结果如下:
Net Card: en1
------->fe80:0:0:0:XXXX:XXXX:XXXX:a6c0%5
------->192.168.1.18
Net Card: en0
------->fe80:0:0:0:XXXX:XXXX:XXXX:32e5%4
------->10.XXX.XXX.XXX
Net Card: lo0
------->0:0:0:0:0:0:0:1
------->fe80:0:0:0:0:0:0:1%1
------->127.0.0.1
X表示屏蔽掉真实IP。
其实这里也把MAC地址给解析出来了。
这里就延伸出几个问题:
就是hadoop本身对多网卡的处理机制,在master主机上配置hosts这个文件,如何去修改。
当是多网卡的时候,网卡的利用率如何。
最近在内网试用了下多网卡,发现只要一个网卡口接入网线,另一个网卡口不接网线。还是可以ping通这个网卡(不接网线)的IP地址。