Hadoop中必须配置hostname的源码分析

搭建Hadoop的时候必须配置两个文件:/etc/sysconfig/network和/etc/hosts

/etc/sysconfig/network的作用是设定机器的hostname

/etc/hosts的作用是主机名与ip地址的匹配,如果没有DNS服务器的话,系统上的所有网络程序都通过查询该文件解析主机名对应的ip地址

在Hadoop中,各个结点先通过getLocalHost()读取host,然后对应到ip,NodeManager开始启动

其中getLocalHost()方法是InetAddress类的静态方法,在getLocalHost()方法中会调用InetAddressImpl接口的getLocalHostName()方法

String local = impl.getLocalHostName();

getLocalHostName()方法的实现是native方法,此native方法中最终会调用linux的gethostname内核函数

linux中的hostname是个变量,由系统初始化的时候在shell启动脚本中/etc/rc.d/rc.sysinit中的$HOSTNAME环境变量赋值,$HOSTNAME环境变量由/bin/hostname赋值,主要是读取/etc/sysconfig/network中的HOSTNAME的值

需要注意:

如果文件中没有HOSTNAME,那么默认会使用localhost

因此String local的值即是linux中调用hostname命令所获取的值

如果local的值是localhost,则返回127.0.0.1(IPV4)或者::1

否则调用此代码

InetAddress.getAddressesFromNameService(local, null)

此代码需要查询/etc/hosts文件

因此必须在/etc/sysconfig/network和/etc/hosts中配置好别名和ip的对应

不然会出现异常:org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed NodeManager login

你可能感兴趣的:(Hadoop,2.x源码分析)