1. 程式人生 > >從主機名談真實Hadoop叢集與虛擬機器叢集管理

從主機名談真實Hadoop叢集與虛擬機器叢集管理

本文出處:http://blog.csdn.net/chaijunkun/article/details/23283431,轉載請註明。由於本人不定期會整理相關博文,會對相應內容作出完善。因此強烈建議在原始出處檢視此文。

隨著大資料的普及,Hadoop應用也越來越廣泛,然而不斷擴充套件的節點數量對運維管理也提出了更高要求。本文圍繞對主機名的配置這一主題來探討叢集的管理,旨在探討一種可行的Hadoop叢集管理方法。

1.主機命名,有可為有可不為

為什麼要在開篇說這個呢?這來源於做實驗時遇到的第一個問題,為了避免有人走同樣的彎路,先寫下來。我的實驗環境準備了4臺虛擬機器:
IP地址機器名(hostname)作用
192.168.1.101hadoop_1NameNode
192.168.1.102hadoop_2SecondaryNameNode
192.168.1.103hadoop_3DataNode-1
192.168.1.104hadoop_4DataNode-2

當我對NameNode進行格式化後,執行start-all,發現java程序沒有啟動成功(jps發現無任何程序),於是去檢視日誌,得到了下面的異常資訊:

ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.lang.IllegalArgumentException: Does not contain a valid host:port authority: hdfs://hadoop_1:9000

後來搜尋這個問題,原來不止我一個人遇到,就是因為主機名中不能含有下劃線“_”,後來我嘗試了將hostname中的下劃線改成點“.”,發現問題依舊。也就是說,Hadoop叢集中的機器名不僅不能包含下劃線,點也不可以。(關於這個問題,我看到了一篇文章:http://blog.iamzsx.me/show.html?id=54001,文中提到:“雖然linux支援一些特殊字元,但java裡面並不支援”,至於他後面說的“點”可以,我這邊實驗的是不可以的)

常用的分隔符都不行,我們如何管理這些機器呢?要知道,這只是一個實驗環境。到了真正的生產環境,也許你將會面對幾十上百,甚至上千節點。後來沒辦法,嘗試使用“減號”來分隔,將所有的機器名都換成如下形式:

IP地址機器名(hostname)
192.168.1.101hadoop-1
192.168.1.102hadoop-2
192.168.1.103hadoop-3
192.168.1.104hadoop-4

此時執行start-all.sh後終於正常了:

[[email protected] bin]$ jps
1292 NameNode
1498 JobTracker
1438 SecondaryNameNode
1587 Jps

2.茫茫機海,我有GPS

你曾親自參觀過機房嗎?有沒有被一排排一層層的機器所震撼?讓我們先腦補一下機房的樣子,然後對應下面的概念:

叢集:針對不同的任務、不同的機房區域,我們可以把所屬於同一類的一大組機器作為叢集,他們之間是要相互緊密協作的,因此我們把這些機器編組。簡稱g,group

機櫃/機架:在機房中,我們能直接看到的一個個像大衣櫃一樣的東西就是機櫃了,簡稱:c或r,cabinet / rack

機器位/筐位:機櫃的尺寸都符合一定的工業標準,像樓層劃分那樣,由下至上堆疊樓層位置。至於框位這個稱呼是針對刀鋒伺服器來說的,一個刀片框中可以容納多臺刀鋒伺服器,在密集計算中應用比較多。簡稱:f,floor / frame

槽位:這個也是針對刀片式伺服器,在同一個刀片筐中可以放置若干個刀鋒伺服器,每一個放置的位置稱之為槽位。簡稱s,slot

根據上述概念的組合,我們就可以在一個較大規模的叢集中很方便地找到一臺機器的位置了。Hadoop叢集也是從演算法上保證了優先選擇同一機架中的機器協同工作,這樣減少不同機架間的網路IO,提高效率。而網路規劃中必不可少的就是對機器命名的管理。我們要從機器名中就能判斷出它所在的位置。無論是效能優化的角度,還是從硬體維護的角度來說都是有益的。

因此我們不妨對Hadoop叢集中的機器進行如下命名:

hadoop-g-[叢集編號]-r-[機架編號]-f-[筐位編號]-s-[槽位編號]

例如:

hadoop-g-0-r-0-f-0-s-0

這就表示這臺機器屬於0號叢集,在0號機架上0號筐位的0槽位上。是不是很容易定位?

3.Hadoop叢集中真的要去改hosts嗎?

在實驗環境中,我們使用“修改/etc/hosts檔案”的方式來手工繫結機器名和ip地址。這樣做的缺點是一旦一臺機器做出改動之後,要對群集中所有機器的hosts檔案進行同步更新。這對於大型叢集來說簡直是一場噩夢。我們可以使用專門的DNS伺服器來管理這些機器。只要所有的節點使用相同的DNS伺服器,在主機更改時只需要修改DNS伺服器即可,而且DNS也可以實現高可用。

在實體機上通過開啟多個虛擬機器來搭建真實的Hadoop叢集是非常節省成本的學習方法。然而無論是網上的資料還是培訓老師那裡,關於IP地址與主機名對映的解決辦法都是逐一修改hosts檔案。有沒有好辦法呢?其實,只要修改實體機的hosts檔案即可。

以vmware workstation為例,詳細步驟如下(注意紅框部分):

首先進入虛擬網路介面卡:


把虛擬機器使用的網絡卡調整成如下配置,其實Host-Only應該也可以,只是為了方便虛擬機器上網,才做成的NAT:


這裡把子網配置成192.168.1.0/24(192.168.1.XXX網段,掩碼255.255.255.0),然後點右邊中間的“NAT設定”


得知內網的閘道器地址是192.168.1.2。接下來就逐一配置虛擬機器IP地址

虛擬機器的網路介面卡選擇為:


再以CentOS 6為例看下網路介面卡設定:

DEVICE=eth0
HWADDR=00:0c:29:40:13:75
TYPE=Ethernet
UUID=43370169-e5ef-483d-b24e-4be77ef1cffea
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.1.11
GATEWAY=192.168.1.2
NETMASK=255.255.255.0
DNS設定:
search localdomain
nameserver 192.168.1.2
把所有機器的IP配置好後我們進行規劃和命名。最後只改動宿主機的hosts檔案:
192.168.1.11    zookeeper1
192.168.1.12    zookeeper2
192.168.1.13    zookeeper3

192.168.1.21    namenode1
192.168.1.22    namenode2

192.168.1.31    datanode1
192.168.1.32    datanode2
192.168.1.33    datanode3
隨便找臺機器互ping:
[[email protected] ~]# ping zookeeper1
PING zookeeper1.localdomain (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=3.17 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.264 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.237 ms

都是通的。至此,配置完畢。

4寫在最後:

我們往往將hosts檔案中,IP對應的主機名稱和/etc/sysconfig/network的HOSTNAME屬性設定成一致的,雖然理論上可以寫成不一樣的,但是在某些時候配置成不一樣的會帶來額外的麻煩。感興趣的朋友可以參閱這篇文章,帶你看一個因為配置得不一樣而引發的麻煩:http://blog.csdn.net/chaijunkun/article/details/44238163