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