最初接觸Docker是在2013年初,當時Docker才剛起步不久,知之甚少。在不到一年的時間里,Docker已經家喻戶曉,成為時下最熱門的雲計算技術之一,出現了許多圍繞docker的新興產品(僅供參考):
- Flynn:一個使用go語言編寫的開源PaaS平台,目標是簡化分布式環境中應用的部署和維護,可以通過git push命令,將應用部署到Docker,從而省去復雜的配置和操作。
- CoreOS:一種新的架構體系重新設計的Linux發型版,可以運行在既有的硬件活着雲服務器上。CoreOS不提供類似yum或apt的包管理工具,用戶不需要在CoreOS中安裝軟件,而是讓程序都在Docker容器中運行。
- Fig:是一個基於Docker的用於快速搭建開發環境的工具,目前Fig團隊已經加入Docker公司。
- Kubernets:來自Google的容器集群管理工具,支持跨平台。目前已經得到微軟,IBM,紅帽,CoreOS等公司的支持。
- Boot2Docker:專為Docker設計的輕量級Linux發型包,解決Windows或OS X用戶不能安裝Docker的問題。
什么是Docker。Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、相互隔離的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、OpenStack 集群和其他的基礎應用平台。
Docker應用場景:
- web應用的自動化打包和發布。
- 自動化測試和持續集成,發布。
- 在服務型環境中部署和調整數據庫或其他的后台應用。
- 從頭編譯或者擴展現有的OpenShift或Cloud Foundry平台來搭建自己的PaaS環境等。
本文主要介紹docker在大數據方面的應用,經過一段時間的研究和實際操作,提出了Hadoop on Docker架構。大概思路就是將硬件(或雲服務器)通過Docker搭建成為一個“超級服務器”,這里的超級是指,擁有足夠的CPU,內存,並且提供7*24小時不宕機服務(除非同一時間所有物理主機全宕機)。每個Docker容器作為超級服務器資源的一個實例,可以根據需求動態增加實例,以滿足計算性能要求。下圖是整個Hadoop on Docker的架構

從上自下,依次為:
- Zookeeper:協調集群中物理主機之間的同步,包括維護一張每個服務器上運行着的容器名單,所有服務器上Docker容器的ip域名映射表(動態更新),Docker容器配置。
- Server:上面運行着很多docker容器,每個容器運行着特定功能的服務。把應用打包到容器中運行的好處是,應用間是相互隔離的,一個容器宕掉不會影響主機上及其他容器,並且在創建容器的時候可以定制不同的資源(CPU,內存等)。
- FS:外部文件系統有兩個作用:
1. 將datanode容器掛載到外部文件存儲系統中,可以通過增加外部文件系統的磁盤大小來提高hdfs存儲能力。
2. 將所有配置文件存放在公共文件系統中,可以方便整個系統的配置管理,減少重復操作。
- Yarn:資源管理系統,最終的目標是可以將不同的集群容器(storm,spark等)放在同一個yarn系統中,通過yarn的調度來為不同集群分配不同資源。
有人會有疑問:如今服務器已經很廉價,完全可以在不同服務器上運行不同服務,沒必要使用docker。
如果硬件服務器對你來說確實是廉價的,以至於搭建100個節點的hadoop集群,大多數情況下運行mapreduce job的節點書不超過10個,剩余90台服務器常年處於休息狀態,對你來說也無關緊要的話,我無話可說。拋開硬件成本不說,docker容器的隔離機制也是集群部署中的一大亮點!
本文的目的是通過docker容器,使用更少的硬件資源來運行同樣的job,容器相對於服務器來說是更細粒度的資源。同時由於容器的隔離機制,一個容器發生故障並不影響到其他容器及宿主主機。此外這種架構還解決了單點故障問題,每台服務器運行着相同的docker鏡像,通過定時向zookeeper發送心跳,來監控所有容器的健康狀態,心跳是一份包含該服務器上所有運行着的容器的名單。那么有可能發生兩種突發情況:
- docker容器掛掉
- 宿主主機宕機
對於第一種情況,由於心跳包含所有運行着容器的名單,當服務器某個容器掛掉,比如mysql意外終止,zookeeper通過兩次心跳對比,發現缺少mysql,於是啟動應急措施,重啟該服務器的mysql容器。如果宿主主機宕機,zookeeper在一段時間內未接受該服務器的心跳,發現宕機,然后在其余剩下的服務器中重啟上一次心跳名單中運行着的容器,如圖所示

整個系統的實現還有一個前提,就是使不同宿主主機上的docker容器能夠通信,可以參見這篇。
最終的目的是使整個架構看起來像在一台超級服務器(cpu,內存足夠大,並且永不宕機)上運行hadoop。
本文持續更新。。。
