1. 程式人生 > >Hadoop中hostname和/etc/hosts配置檔案的關係

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