Hadoop中hostname和/etc/hosts配置文件的关系

前言

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

     /etc/sysconfig/network的作用是设定机器的主机名:hostname。

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

     一般/etc/hosts 的内容一般有如下类似内容:

127.0.0.1 localhost.localdomain localhost 
192.168.1.100 linmu100.com linmu100 
192.168.1.120 ftpserver ftp120

     一般情况下hosts文件的每行为一个主机,每行由三部份组成,每个部份由空格隔开。其中#号开头的行为注释,不被系统解释。

     hosts文件的格式如下:

IP地址 主机名/域名  
第一部份:网络IP地址; 
第二部份:主机名或域名; 
第三部份:主机名别名;

     当然每行也可以是两部份,即主机IP地址和主机名;比如 192.168.1.100 linmu100。

     这里可以稍微解释一下主机名(hostname)和域名(Domain)的区别:主机名通常在局域网内使用,通过hosts文件,主机名就被解析到对应ip;域名通常在internet上使用,但如果本机不想使用internet上的域名解析,这时就可以更改hosts文件,加入自己的域名解析。

第一步:读取hostname值

     在Hadoop中,各个结点先通过getLocalHost()读取host,然后对应到IP,NodeManager开始启动,其中getLocalHost()方法是InetAddress类的静态方法,在getLocalHost()方法中会调用InetAddressImpl接口的getLocalHostName()方法,getLocalHostName()方法的实现是native方法,此native方法中最终会调用linux的gethostname内核函数。

String local = impl.getLocalHostName();//调用方法,得到hostname值

     linux中的hostname是个变量,由系统初始化的时候在shell启动脚本中/etc/rc.d/rc.sysinit中的$HOSTNAME环境变量赋值,$HOSTNAME环境变量由/bin/hostname赋值,读取/etc/sysconfig/network中的HOSTNAME的值,如果文件中没有HOSTNAME,那么默认会使用localhost。

第二步:读取hostname对应的IP

     为了根据此hostname得到对应的IP,会调用如下的方法:

 InetAddress.getAddressesFromNameService(local, null)//得到hostname对应的IP

     此代码需要查询/etc/hosts文件,因此必须在/etc/sysconfig/network和/etc/hosts中配置好别名和ip的对应,不然会出现异常:

2018-12-15 13:23:09,967 ERROR org.apache.hadoop.metrics2.impl.MetricsSystemImpl:
 Error getting localhost name. Using 'localhost'... java.net.UnknownHostException: 
fang.fri.com: fang.fri.com

猜你喜欢

转载自blog.csdn.net/qq_22310551/article/details/85015282