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
如果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