1. 程式人生 > >Hadoop中必須配置hostname的原始碼分析

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