hadoop啟動主機名解析錯誤解決
一、Hadoop啟動報錯問題:
1.hadoop啟動時datanode報錯Shutting down DataNode at java.net.UnknownHostException: master1.hadoop: master1.hadoop: 未知的名稱或服務
2.java.net.UnknownHostException: localhost.localdomain: localhost.localdomain
二、原因分析
很明顯無法解析使用者DataNode中所配置的hostname名稱無法在/etc/hosts中找到對應的DNS(ip對地址的對映),實質就是hostname和/etc/hosts矛盾的問題。就是hostname配置的名字無法在/etc/hosts裡面找到對應的DNS解析。
1.hostname
Linux作業系統的hostname是一個kernel變數,可以通過hostname命令來檢視本機的hostname。也可以直接cat /proc/sys/kernel/hostname檢視。
2./etc/hosts
Linux 的/etc/hosts是配置ip地址和其對應主機名的檔案,這裡可以記錄本機的或其他主機的ip及其對應主機名。
Hosts - The static table lookup for host name(主機名查詢靜態表)
hosts檔案是Linux系統中一個負責IP地址與域名快速解析的檔案,以ASCII格式儲存在“/etc”目錄下,檔名為“hosts”(不同的linux版本,這個配置檔案也可能不同。比如Debian的對應檔案是/etc/hostname)。hosts檔案包含了IP地址和主機名之間的對映,還包括主機名的別名。在沒有域名伺服器的情況下,系統上的所有網路程式都通過查詢該檔案來解析對應於某個主機名的IP地址,否則就需要使用DNS服務程式來解決。通常可以將常用的域名和IP地址對映加入到hosts檔案中,實現快速方便的訪問。
- 配置檔案
這個檔案可以配置主機ip及對應的主機名,對於伺服器型別的linux系統其作用還是不可忽略的。在區域網或是INTERNET上,每臺主機都有一個IP地址,它區分開每臺主機,並可以根據ip進行通訊。但IP地址不方便記憶,所以又有了域名。在一個區域網中,每臺機器都有一個主機名,用於區分主機,便於相互訪問。
Linux主機名的相關配置檔案就是/etc/hosts;這個檔案告訴本主機哪些域名對應那些ip,那些主機名對應哪些ip:
- 配置檔案格式說明
一般/etc/hosts 的內容一般有如下類似內容:
127.0.0.1 localhost.localdomain localhost
22.106.102.22 ftpserver ftp120
一般情況下hosts檔案的每行為一個主機,每行由三部份組成,每個部份由空格隔開。其中#號開頭的行做說明,不被系統解釋。
hosts檔案的格式如下:
IP地址 主機名/域名
第一部份:網路IP地址;
第二部份:主機名或域名;
第三部份:主機名別名;
當然每行也可以是兩部份,即主機IP地址和主機名;比如 22.106.102.22 ftpserver
主機名(hostname)和域名(Domain)的區別:主機名通常在區域網內使用,通過hosts檔案,主機名就被解析到對應ip;域名通常在internet上使用,但如果本機不想使用internet上的域名解析,這時就可以更改hosts檔案,加入自己的域名解析。
3.hostname與/etc/hosts的區別與聯絡
- hostname跟/etc/hosts 下配置有關係嗎?
如果從我上面的實驗來看,其實hostname跟/etc/hosts下的配置是沒有關係的。hostname的修改、變更完全不依賴hosts檔案。 其實hosts檔案的作用相當如DNS,提供IP地址到hostname的對應。早期的網際網路計算機數量少,單機hosts檔案裡足夠存放所有聯網計算機。不過隨著網際網路的發展,這就遠遠不夠了。於是就出現了分散式的DNS系統。由DNS伺服器來提供類似的IP地址到域名的對應。具體可以man hosts檢視相關資訊。
Linux系統在向DNS伺服器發出域名解析請求之前會查詢/etc/hosts檔案,如果裡面有相應的記錄,就會使用hosts裡面的記錄。/etc/hosts檔案通常裡面包含這一條記錄
127.0.0.1 localhost.localdomain localhost
127.0.0.1到localhost這一條建議不要修改,因為很多應用程式會用到這個,比如sendmail,修改之後這些程式可能就無法正常執行。
但是呢在特殊條件下hostname和/etc/hosts會保持一致。在/etc/rc.d/rc.sysinit中,有如下邏輯判斷,當hostname為localhost或者localhost.localdomain時,將會使用介面IP地址對應的hostname來重新設定系統的hostname。這相當於linux系統為了保持本地dns解析的一致性做的自動化操作,等於預設替使用者執行了這個操作。
# In theory there should be no more than one network interface active
# this early in the boot process -- the one we're booting from.
# Use the network address to set the hostname of the client. This
# must be done even if we have local storage.
ipaddr=
if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
ipaddr=$(ip addr show to 0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
if [ -n "$ipaddr" ]; then
eval $(ipcalc -h $ipaddr 2>/dev/null)
hostname ${HOSTNAME}
fi
fi
我們來實驗一下吧,修改hosts、network檔案,修改後的值如下所示:
[[email protected]localhost ~]# more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
::1 localhost.localdomain localhost
127.0.0.1 localhost.localdomain localhost
192.168.244.128 DB-Server.localdomain DB-Server
[[email protected] ~]# more /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=localhost.localdomain
重啟系統後,我們再截圖看看情況
所以這也是有時候人們以為hostname的值跟hosts檔案有關係的緣故
三、解決方案
1.直接修改本地hosts檔案新增對應hostname的對映
vim /etc/hosts
127.0.0.1 yourname #hostname對映
然後reboot系統生效。
這種方法比較直接,但往往localhost等名字不是我們自己想要的,也缺乏名稱的辨識度,所以是不大好的一種解決方案;
2.修改hostname為我們想要的名稱譬如master.hadoop slave1.hadoop slave2.hadoop
命令語法為:
sudo hostnamectl set-hostname <newhostname>
這條命令會刪除/etc/hostname檔案中的主機名,然後替換為新的主機名。和第一種方法一樣,我們也需要更新/etc/hosts檔案。這兩種方法的本質都是一樣的。
然後可以用hostname 或者hostnamectl檢視hostname相關資訊,其中hostnamectl顯示的更為全面
[email protected] logs]# hostnamectl
Static hostname: slave1.hadoop
Icon name: computer-desktop
Chassis: desktop
Machine ID: 76547338655241a2b56abe659fe05dc1
Boot ID: 2d0f564b16f24bd7959ff4608d790223
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-862.11.6.el7.x86_64
Architecture: x86-64
本文部分內容參考:https://blog.csdn.net/dufufd/article/details/75330423