分布式系統和大資料處理平台是目前業界關注的熱門技術。
1.RabbitMQ
RabbitMQ是一個支援AMQP的開源消息隊列實作,由Erlang編寫,因以高性能、高可用以及可伸縮性出名。它支援多種用戶端,如:Java、Python、PHP、Ruby、.NET、JavaScript等。
它主要用于分布式系統中存儲和轉發消息,友善組之間的解耦,消息的發送無需知道消息使用者的存在,反之亦然。
AMQP架構中有兩個主要元件:Exchange和Queue,兩者都在服務端,又稱Broker,由RabbitMQ實作。用戶端通常有Producer和Consumer兩種類型。
在使用RabbitMQ過程中需要注意的是,它将資料存儲在Node中,預設情況為hostname。是以在使用docker run指令運作容器的時候, 應該通過-h/--hostname參數指定每一個rabbitmq daemon運作的主機名。這樣可以輕松得地管理和維護資料了:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuEDZ5gTZ1gTMiNDNmR2MjNGZkVzNkNWO5EzNiNjNwYGZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
使用者使用rabbitmqctl工具進行遠端管理,或跨容器管理的時候,會需要設定持久化的Cookie。如果需要了解關于Erlang Cookie的資訊,可以參見RabbitMQ官網的叢集指南。
這裡可以使用RABBITMQ_ERLANG_COOKIE參數進行設定:
docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3 bash
2.Celery
除了通用的消息隊列外,任務隊列在分布式進行中也十分重要。任務隊列的輸入是工作的一個單元,稱為任務,有多個工作者監聽隊列來擷取任務并執行。
Celery是一個簡單、靈活、高可用、高性能的開源分布式任務處理系統,專注于實時處理的任務隊列管理,同時也支援任務排程。Celery基于Python實作,跟包括的Django、Flask、Tornado等Web架構都無縫內建,有龐大的使用者與貢獻者社群。Celery可用單機運作,也可以在多台機器上運作,甚至可以跨越資料中心運作。
(1)使用官方鏡像
docker run --link some-rabbit:rabbit --name some-celery -d celery:latest
檢查叢集狀态:
docker run --link some-rabbit:rabbit --rm celery celery status
啟動一個celery worker,即Redis Broker
docker run --link some-redis:redis -e CELERY_BROKER_URL=redis://redis --name some-celery -d celery
docker run --link some-redis:redis -e CELERY_BROKER_URL=redis://redis --rm celery celery status
(2)使用Celery庫
如果使用者使用的架構已有Celery庫,那麼使用起來更加友善。
Python調用CeLery:
from celery import Celery
app = Celery('hello',broker='amqp://guest@localhost//')
@app.tast
def hello():
return "hello world"
3.Hadoop
作為當今大資料處理領域的經典分布式平台,Apache Hadoop主要基于Java語言實作,由三個核心子系統組成:HDFS、YARN、MapReduce,其中HDFS是一套分布式檔案系統;YARN是資源管理系統,MapReduce是運作在YARN上的應用,負責分布式處理管理。如果從作業系統的角度看,HDFS相當于Linux的ext3/ext4檔案系統,而Yarn相當于Linux的程序排程和記憶體配置設定子產品。
使用官方鏡像
可以通過docker run指令運作鏡像,同時打開bash指令行,如下所示:
docker run -it sequenceiq/hadoop-docer:2.7.0 /etc/bootstrap.sh -bash
此時可以檢視各種配置資訊和執行操作,例如檢視namenode日志等資訊:
cat /usr/local/hadoop/logs/yarn-root-nodemanager-8c266b1ce6d8.out
4.Spark
Apache Spark是一個圍繞速度、易用性和複雜分析建構的大資料處理架構,基于Scala開發。最初在2009年由加州大學伯克利分校的AMPLap開發,并于2010年成為Apache的開源項目之一。
與Hadoop和Storm等其他大資料和MapReduce技術相比,Spark支援靈活的函數定義,可以将營業處理速度提升到一兩個數量級,并且提供了衆多友善的實用工具,包括SQL查詢、流處理、機器學習和圖處理等:
Spark體系包括如下三個主要組成:資料組成、API、管理架構。
docker pull sequenceiq/spark:1.6.0
也可以使用docker build指令建構spark鏡像:
docker build --rm -t sequenceiq/spark:1.6.0 .
另外,使用者在運作容器時,需要映射YARN UI需要的端口:
docker run -it -p 8088:8088 -p 8042:8042 -h sandbox sequenceiq/spark:1.6.0 bash
啟動後,可以使用bash指令來檢視namenode日志等資訊:
cat /usr/local/hadoop/logs/hadoop-root-namenode-sandbox.out
(2)驗證
基于YARN部署Spark系統時,使用者有兩種部署方式可選:YARN用戶端模式和YARN叢集模式。
a.YARN用戶端模式
在YARN用戶端模式中,SparkContext(或稱為驅動程式,driver program)運作在客戶程序中,應用的master僅處理來自YARN的資源管理請求:
#運作spark shell
spark-shell \
--master yarn-client \
--driver-memory 1g \
--executor-memory 1g \
--executor-cores 1
#執行以下指令傳回1000則符合預期
sc.parallelize(1 to 1000).count()
b.YARN叢集模式
在YARN叢集模式中,Spark driver驅動程式運作于應用master的程序中,即由YARN從叢集層面進行管理。下面,使用者以Pi值計算為例子,展現兩種模式的差別:
Pi計算(YARN叢集模式):
#執行以下指令,成功後,日志中會新增記錄 "Pi is roughly 3.1418"
#叢集模式下使用者必須制定--files參數,以開啟metrics
spark-submit \
--class org.apache.spark.examples.SparkPi \
--files $SPARK_HOME/conf/metrics.properties \
--master yarn-cluster \
--executor-cores 1 \
$SPARK_HOME/lib/spark-examples-1.6.0-hadoop2.6.0.jar
Pi計算(YARN用戶端模式):
#執行以下指令,成功後,指令行将顯示"Pi is roughly 3.1418"
--master yarn-client
--executory-cores 1 \
(3)容器外通路Spark
如果需要從容器外通路Spark環境,則需要設定YARN_CONF_DIR環境變量。yarn-remote-client檔案夾内置遠端通路的配置資訊:
export YARN_CONF_DIR="`pwd`/yarn-remote-client"
隻能使用根使用者通路Docker的HDFS環境。當使用者從容器叢集外部,使用非根使用者通路Spark環境時,則需要配置HADOOP_USER_NAME環境變量:
export HADOOP_USER_NAME=root
5.Storm
Apache Storm 是一個實時流計算架構,由Twitter在2014年正式開源,遵循Eclipse Public License1.0.Storm基于Clojre等語言實作。
Storm叢集與Hadoop叢集在工作方式上十分相似,唯一差別在于Hadoop運作的是MapReduce任務,在Storm上運作的則是topology。MapReduce任務完成處理即會結束,而topology則永遠在等待消息并處理。
(1)示意架構圖
其中包含如下容器:
Zookeeper:Apache Zookeeper三節點部署
Nimbus:Storm Numbus.
UI:Storm UI
Supervisor:Storm Supervisor(一個或多個)
(2)本地開發測試
git clone https://github.com/denverdino/docker-storm.git
cd docker-swarm/local
代碼庫中的docker-compose.yml檔案描述了典型的Storm應用架構。
使用者可以直接運作下列指令建構測試鏡像:
docker-compose build
一鍵部署一個storm應用:
docker-compose up -d
利用如下指令,可以伸縮supervisor的數量,比如伸縮到4個執行個體
docker-compose scale supervisor=4
朋友們也許會發現Web界面中并沒有運作中的topology。這是因為Docker Compose目前隻能保證容器的啟動順序,但是無法確定所依賴容器中的應用已經完全啟動并可以正常通路。
為了解決這個問題,需要運作如下指令來再次啟動topolgoy服務應用來送出更新的拓撲:
docker-compose start topology
随後重新整理下UI界面,可以發現Storm應用已經部署成功。
6.Elasticsearch
Elasticsearch是一個基于Lucene的開源搜尋伺服器,主要基于Java實作。它提供一個分布式的,多租戶的全文搜尋引擎,内含RESTful web接口。
Elasticsearch提供了實時的分布式資料存儲和分析查詢功能,很容易擴充到上百台伺服器,支援處理PB級結構化或非結構化資料。配合Logstash、Kibana等元件,可以快速建構一套對日志資訊的分析平台。
拉取官方鏡像:
docker run -d elasticsearch
也可以在啟動時傳入一些額外的配置參數:
docker run -d elasticsearch elasticsearch -Des.node.name="TestNode"
目前使用的鏡像内含預設配置檔案,包含了預先定義好的預設配置。如果使用者要使用自定義配置,可以使用資料卷,挂載自定義配置檔案到/usr/share/elasticsearc/config:
docker run -d -v "$PWD/config":/usr/share/elasticsearch/config elasticsearch
如果需要資料持久化,可以使用資料卷指令,挂載至/usr/share/elasticsearch/data:
docker run -d -v "$PWD/esdata":/usr/share/elasticsearch/data elasticsearch
此鏡像會暴露9200 9300兩個預設的HTTP端口,可以通過此端口進行服務通路。9200端口是對外提供服務的API使用的端口。9300端口是内部通信端口,這些通信包括心跳,叢集内部資訊同步。