近期的一項任務是對比Hadoop和Spark兩種分布式計算框架的迭代性能,為了更加充分合理地管理集群中的資源,用到了mesos這種資源管理平台。mesos最初是UC Berkeley AMP實驗室的一個研究項目,后來開源,並加入Apache,成為一個孵化器項目。
從其主頁可以了解到mesos是一種集群管理器,它為不同的分布式應用或框架提供高效的資源隔離與共享服務。在mesos上面可以運行Hadoop, MPI, Hypertable, Spark和其他應用。
mesos的用途有四點:1. 在一個動態共享的結點池中運行Hadoop, MPI, Spark和其他框架 2. 在同一個集群上運行多個Hadoop實例,以隔離生產和實驗作業,甚至是多個版本的Hadoop作業 3. 在相同的結點集合上以批應用的形式運行長期服務(比如Hypertable, Hbase) 4. 無需重新設計低級基礎設施就可以構建新的集群計算框架,並使其與現存框架共存。
mesos的特征有:1. 使用Zookeeper,使主結點具有容錯性 2. 使用快速、事件驅動的C++實現,能夠擴展到1萬個結點 3. 使用Linux Containers實現了任務之間的隔離 4.多種資源調度(內存和CPU) 5. 高效的應用控制調度機制,讓不同框架獲得它們自身的安置目標(比如數據局部性)6.支持使用Java, Python, C++來開發新的並行應用 7. Web界面查看集群狀態。
首先說明一下集群環境。整個集群由四台主機組成,其中一台為master,另外三台為slave。這四台主機運行的系統為Ubuntu 11.10。主結點的hostname為master,三個從結點的hostname分別為slave1, slave2, slave3。這四台主機的/etc/hosts文件中均包含如下四行映射關系:

#ip-host映射關系 192.168.2.100 master 192.168.2.101 slave1 192.168.2.102 slave2 192.168.2.103 slave3
注:以上映射關系非常重要,在接下來的配置過程中會一直用到。
還有一點極其關鍵,在/etc/hosts文件中的第二行是127.0.1.1 hostname,要將所有主機上的這一行都注釋調,否則在啟動集群時,主結點總是無法啟動。更改之后最好重啟系統,以使配置生效。
有關master和slave之間的ssh配置就不多說了,網上有很多教程,最后一定要確保從master上能夠無密碼登錄到三個slave上。
安裝mesos之前的系統要求:
(1)g++ 4.1或更高版本
(2)Python 2.6 (用於mesos的web界面)
(3) Python 2.6 developer packages
(4)cppunit (用於構建zookeeper)
(5)Java JDK 1.6 或更高版本
(1) - (4)的安裝如下:
sudo apt-get install g++ python-dev libcppunit-dev libcppunit-doc
以下是具體安裝的過程:
(1)從鏡像網站下載Mesos 0.9.0-incubating,得到壓縮文件mesos-0.9.0-incubating.tar.gz。
(2) 將壓縮文件拷貝到master結點的某個目錄中,使用如下命令解壓文件, 得到文件夾mesos-0.9.0,進入該文件。
tar zxvf mesos-0.9.0-incubating.tar.gz
(3)進入文件夾mesos-0.9.0后,使用configure腳本配置mesos。有兩個比較重要的參數需要傳遞,一個是JDK安裝的根目錄,另一個是安裝mesos的目標位置。(請將上述兩個參數換成你自己系統中的具體位置。如果不指定安裝的目標位置,默認位置是/usr/local。)具體命令如下:
./configure --with-java-home=/home/dummy/.java/jdk1.6.0_33 --prefix=/home/dummy/mesos
(4)還是在文件夾mesos-0.9.0下使用如下兩個命令來build和安裝mesos。 mesos被安裝在第(3)步中--prefix參數指定的位置,即/home/dummy/mesos目錄下,下面都使用<prefix>來代表mesos的安裝目錄。
make make install
(5)使用如下命令將mesos拷貝到所有的slave結點。注意,主結點和所有從結點上mesos的位置要保持一致。
scp -r ~/mesos slave1:~/ scp -r ~/mesos slave2:~/ scp -r ~/mesos slave3:~/
(6)在master結點上做如下兩個配置。
編輯文件<prefix>/var/mesos/deploy/masters(如果沒有可以創建),在文件中列出主結點的主機名或者IP地址。
編輯文件 <prefix>/var/mesos/deploy/slaves(如果沒有可以創建),在文件中列出從結點的主機名或者IP地址。
我的配置如下所示:
#masters文件的內容 master #slaves文件的內容 slave1 slave2 slave3
編輯文件<prefix>/var/mesos/conf/mesos.conf(如果沒有可以創建),配置主結點的日志文件目錄。我的配置如下:
log_dir=/home/dummy/mesos/log/
(7)在所有從結點上做如下配置。
編輯文件<prefix>/var/mesos/conf/mesos.conf(如果沒有可以創建),配置從結點的日志文件目錄、主結點URI和從結點資源。從結點的資源可以根據每個結點的CPU和內存的空閑情況進行配置,以供mesos調度使用。其中cpus后面的數字代表CPU有幾個核,而mem后面的數字代表分配多少空閑內存給mesos使用,單位是MB。
master=master:5050 log_dir=/home/dummy/mesos/log resources=cpus:4;mem:2300
(8)啟動與停止mesos集群管理器。
如果配置正確無誤,就可以進入目錄 <prefix>/sbin/,使用如下命令啟動集群管理器。
bash mesos-start-cluster.sh
如果使用的是 Ubuntu 12.04.2 LTS系統,那么在使用上面的命令啟動集群管理器的時候,會出現如下錯誤:
ulimit: error setting limit (operation not permitted)
該錯誤是由於啟動腳本在調用另一個腳本mesos-daemon.sh時,mesos-daemon.sh中試圖使用ulimit -n 8192命令來修改可以打開最大文件描述符的數量。在Ubuntu 12.04.2 LTS系統中,針對所有用戶,該參數默認設置為1024。而且該參數一旦設置,不能增加。例如當該參數設置為1024后,某一用戶的shell進程及其子進程可以使用命令ulimit -n 1024, ulimit -n 1000; ulimit -n 900; 而且當前命令再設置新值時,新值必須小於等於上一次設置的值,超出就會報出上面的錯誤。因此當mesos-daemon.sh腳本試圖使用ulimit -n 8192命令修改新值時,由於8192 > 1024,因而報錯。我用的Ubuntu系統是桌面系統,如果使用的操作系統是服務器版本的話,我推斷應該不會出現上面的錯誤,用作服務器的操作系統肯定會把默認值設置的很大。
知道了錯誤的原因,改錯就容易了。我們只需要把系統的默認值調大,大於等於8192即可,我將默認值設為了9000。具體做法如下:
在集群的每一台機器上重復下面三個步驟:
1)切換到root用戶,修改/etc/security/limits.conf文件,在文件的最后添加如下兩行並保存。其中的通配符*指代所有用戶,如果只想為特定用戶修改,可以將星號換成特定用戶的用戶名。
* soft nofile 4096 * hard nofile 4096
2)還是在root用戶下,修改/etc/pam.d/common-session文件,在文件的最后添加如下一行並保存。
session required pam_limits.so
3)重啟系統,以使修改將生效。
停止mesos集群管理器的命令如下
bash mesos-stop-cluster.sh
(9) mesos啟動后,可以通過Web界面來查看集群中的資源,以及集群中正在運行的框架和任務。具體的訪問方式是通過瀏覽器訪問master結點的8080接口,即http://master:8080/。如果mesos啟動正常,可以在該web界面上看到整個集群的資源總和和每一個slave結點的資源。如果有框架正在運行,還可以看到框架的信息,以及正在執行的任務信息。
重要提示信息:
1)如果提交作業給mesos后,發現作業執行異常,或無法執行,可以查看每個slave結點的/tmp/mesos/slaves/..../stderr文件,以確定問題原因。
2)mesos安裝目錄下的<prefix>/lib/libmesos-0.9.0.so文件很重要,在以后配置Spark時會需要。