隨著云時代的到來,大數據也吸引了越來越多多關注。而Spark做為大數據處理的佼佼者,越來越受到人們的關注。正是由于Spark技術的出現,使得在云計算上構建超大規模的大數據平臺成為了可能。
Spark誕生于伯克利大學AMPLab,是現今大數據領域里最為活躍,最為熱門,最為高效的大數據通用計算平臺。Spark是基于MapReduce算法實現的一個分布式計算框架,Spark繼承了Hadoop的MapReduce的所有優點,但是比Hadoop更為高效。
Spark成功使用Spark SQL/Spark Streaming/MLlib/GraphX近乎完美的解決了大數據中的Batch Processing、Streaming Processing、Ad-hoc Query三大核心問題。并且Spark的四大子框架和庫之間可以無縫地共享數據和操作,這樣的優勢使得Spark在當今大數據計算領域中,處于無可匹敵的領先地位,也讓Spark成為了大數據處理首選的計算平臺。
為了適應國內云計算IaaS基礎架構的需要,我們對Spark提出了更多苛刻的要求。首先,我們希望能自動化部署Spark集群到IaaS上并自動擴展計算節點。其次,我希望能維護所有的計算集群資源能像使用一臺主機上的體驗一樣。再次,對于Spark的部署,希望能脫離主機的環境限制,按照業務需要自動擴展Spark集群環境,做到真正的動態,可擴展,有彈性的大數據計算平臺。事實上對于這些問題,業界已經提供了非常優秀的開源項目Apache Mesos來支持資源調度,讓我們得以開展實施我們的計劃。但即使是這樣,對于資源的隔離仍然不是很理想。因為對于高性能的機器,Spark不一定能完全占用完所有資源。為了能充分利用Spark的計算資源,我們最好是把大容量的機器劃分為類似2G CPU/4G RAM大小的基礎樣機,使用Docker容器把Mesos/Spark包裝起來,就可以很好的解決這個隔離需求。所以經過我們的實戰需要,我們在最后終于有了非常確定的架構藍圖,也就是使用Mesos構建出一整套云計算分布式平臺,在此基礎之上我們再啟用Spark引擎,讓彈性分布式數據集(resilient distributed dataset,RDD)可以自由的穿梭在每個Mesos Slave節點。那么這里就要介紹一下Mesos這個優秀的框架了。
Mesos誕生于UC Berkeley的一個研究項目,現已成為Apache中頂級項目,當前業界知名企業已經開始使用Mesos管理集群資源,比如Twitter、AirBnb、愛奇藝等。
Mesos采用master/slave結構,并且Mesos采用Zookeeper來解決分布式中最常見的單點故障問題,通常我們將master設置為三份,通過zookeeper來選舉真正的master,做到高可靠性。master僅僅保存了mesos應用程序(通常稱之為framework,包括四大類型,分別為Long Running Services,Big Data Processing,Batch Scheduling和Data Storage)和slave的一些狀態,這些狀態很容易通過framework和slave重新注冊而進行重構。
Mesos中主要包含四個服務(實際上是一個socket server),分別是Mesos Master, Mesos Slave, SchedulerProcess和ExecutorProcess。各個服務之間通過Protocal Buffer消息進行通信 ,每個服務內部注冊了若干種Protocal Buffer消息處理器,一旦接收到某種消息,則會調用相應的消息處理器進行處理。
實戰
我們將以三個節點為例子,通過Docker來安裝部署Mesos集群,并且調用Docker來部署Mesos的Framework(Marathon,Chronos,Spark)
注:所有的Dokcer image都可以通過registry.dataman.io下載。
角色IP |
192.168.100.30 |
192.168.100.31 |
192.168.100.32 |
zookeeper |
√ |
√ |
√ |
mesos-master |
√ |
√ |
√ |
meoss-slave |
√ |
√ |
√ |
marathon |
√ |
√ |
√ |
spark-driver |
√ |
安裝Mesos
想要在物理機上快速部署Mesos集群,我們必須先在物理機上安裝Docker,詳細的安裝過程我們可以通過查看Docker官網文檔來進行,這里不做詳細敘述。
啟動zookeeper
docker run --net=host registry.dataman.io/zookeeper /bin/bash /usr/local/share/zookeeper/start.sh -h=192.168.100.25:1,192.168.100.27:2,192.168.100.28:3
-h為預先分配好的zookeeper的IP+ID,格式為ip1:id1[,ip2:id2[,ip3:id3]]
更多zookeeper啟動參數可以參照 https://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html#sc_configuration
啟動mesos-master
docker run --net=host registry.dataman.io/mesos-master --zk=zk://192.168.100.30:2181,192.168.100.31:2181,192.168.100.32:2181/dataman --cluster=DataManCloud --quorum=2 --work_dir=/tmp --hostname=`ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'`
--quorum=VALUE 這是復制節點的法定數量。這個數量必須大于master/2的數量。
啟動mesos-slave
docker run --net=host registry.dataman.io/mesos-slave --master=zk://192.168.100.30:2181,192.168.100.31:2181,192.168.100.32:2181/dataman --hostname=`ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'`
安裝Marathon一旦我們通過Docker將Mesos集群安裝成功后,安裝Marathon將變得很簡單。
啟動marathon
docker run --net=host registry.dataman.io/marathon:v0.7.6 --ha --master zk://192.168.100.30:2181,192.168.100.31:2181,192.168.100.32:2181/dataman --zk_hosts 192.168.100.30:2181,192.168.100.31:2181,192.168.100.32:2181 --hostname `ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'`在瀏覽器中輸入192.168.100.30:8080可以看到Marathon的App管理界面如下圖
運行HelloWorld
點擊Marathon左上角的New App按鈕
在ID里面輸入App ID,例如:dataman
在Command輸入框中輸入要運行的命令,例如:top -b
其他配置使用默認配置,然后點擊Create按鈕創建第一個App
可以在Marathon的管理界面上看到dataman為running狀態,證明該App正在運行。
安裝Chronos接下來我們安裝分布式定時任務管理器Chronos
啟動chronos
docker run --net=host registry.dataman.io/chronos /usr/local/bin/chronos --master zk://192.168.100.30:2181,192.168.100.31:2181,192.168.100.32:2181/dataman --zk_hosts 192.168.100.30:2181,192.168.100.31:2181,192.168.100.32:2181 --http_port 8081'`在瀏覽器中輸入192.168.100.30:8081可以看到Chronos的Job管理頁面
運行HelloWorld
點擊Chronos管理頁面右上角的New Job按鈕
在NAME中輸入Job的ID,例如:dataman
在COMMAND中輸入Job的命令,例如:pwd
其他配置使用默認配置,點擊Create按鈕
點擊Force Run,運行Job
可以在Chronos中管理界面中看到dataman為綠色的success狀態。
run spark-job
docker run --rm -e "MASTER=mesos://zk://192.168.100.30:2181,192.168.100.31:2181,192.168.100.32:2181/dataman" --net=host registry.dataman.io/spark-on-dataman /bin/bash -c "nginx &&wget http://www.datman.io/download/examples.jar&&/usr/local/share/spark/bin/spark-submit --class org.apache.spark.examples.SparkPi --conf spark.executor.uri=http://192.168.100.30/spark-on-dataman.tgz /usr/local/share/examples.jar 2"運行結果如下圖所示:
在上述的實戰中,我們通過簡單的輔助shell腳本,利用Docker快速的構建起了一套Mesos集群,并且成功部署了三個Mesos Framework(Marathon,Chronos,Spark),成功通過測試。
總結
Mesos作為分布式的計算平臺,幫助我們快速的搭建出高可靠的大數據基礎平臺,由于社區的活躍度非常高,我們的工具鏈可以很容易的搭建出來。當然,Mesos只是一個資源調度系統,并不是一套完整的大數據處理平臺,我們需要在這個平臺基礎之上做出定制的大數據框架才能滿足用戶的需求。所以,我們在定制大數據框架的過程中,遇到了一個小問題,分享給大家,歡迎大家反饋交流:
1.Spark無法使用IP進行通信,github上的issue:https://github.com/apache/spark/pull/3893在最新的1.3.0版本中,可以通過配置SPARK_LOCAL_HOSTNAME的值為IP來解決該問題。
2.Spark運行時候生成的動態鏈接庫.so文件無法在Spark Job跑完之后動態刪除,造成了Mesos Slave硬盤爆滿。這個問題,github上還沒有相關的issue,我們會嘗試修復它,并patch上去。最后我們采用定時自動重啟Mesos Slave系統來解決這個問題。
3.還有一個問題就是Marathon的應用運行時容器無法在運行結束后干凈的被清除,也沒有相關工具能刪除干凈這類問題,并且這個問題github上也并沒有相關的issue。我們現在采用手動的方式來刪除已經停止的容器。
4.在chronos-2.0.1版本的時候,chronos的docker job無法啟動,原因為chronos的job路徑帶有冒號,無法mount到docker container上,github上的issue如下:https://github.com/mesos/chronos/issues/250
通過Mesos這套框架的使用,我們已經獲得了很可靠的資源管理平臺,所以也幫助我們在此平臺之上可以構建大數據計算平臺建立了信心。所以,我們可以這么說:Mesos是我們構建新一代容器云計算Big Data Platform的最佳實踐首選工具,推薦給大家。