熱門的消息隊列中間件RabbitMQ,分佈式任務處理平臺Celery,大數據分佈式處理的三大重量級武器:Hadoop、Spark、Storm,以及新一代的數據採集和分析引擎Elasticsearch。node
RabbitMQ是一個支持Advanced Message Queuing Protocol(AMQP)的開源消息隊列實現,由Erlang編寫,因以高性能、高可用以及可伸縮性出名。它支持多種客戶端,如:Java、Python、PHP、.NET、Ruby、JavaScript等。它主要用於在分佈式系統中存儲和轉發消息,方便組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。git
AMQP架構中有兩個主要組件:Exchange和Queue,二者都在服務端,又稱Broker,由RabbitMQ實現的。客戶端一般有Producer和Consumer兩種類型。github
在使用RabbitMQ過程當中須要注意的是,它將數據存儲在Node中,默認狀況爲hostname。所以在使用docker run指令運行容器的時候,應該經過-h/--hostname參數指定每個rabbitmq daemon運行的主機名。這樣就能夠輕鬆地管理和維護數據了:web
$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3redis
3f28f6290e05375363ee661151170d37fbc89ada004c3235f02997b711b4cb2bdocker
用戶使用rabbitmqctl工具進行遠程管理,或跨容器管理的時候,會須要設置持久化的cookie。這裏可使用RABBITMQ_ERLANG_COOKIE參數進行設置:shell
$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3apache
使用cookie鏈接至一個獨立的實例:bootstrap
$ docker run -it --rm --link some-rabbit:my-rabbit -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3 bash瀏覽器
root@f2a2d3d27c75:/# rabbitmqctl -n rabbit@my-rabbit list_users
Listing users ...
guest [administrator]
一樣,用戶也可使用RABBITMQ_NODENAME簡化指令:
$ docker run -it --rm --link some-rabbit:my-rabbit -e RABBITMQ_ERLANG_COOKIE='secret cookie here' -e RABBITMQ_NODENAME=rabbit@my-rabbit rabbitmq:3 bash
root@f2a2d3d27c75:/# rabbitmqctl list_users
Listing users ...
guest [administrator]
默認狀況下,rabbitmq會安裝並啓動一些管控插件,如rabbitmq:3-management。一般能夠經過默認用戶名密碼以及標準管控端口15672訪問這些插件:
$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3-management
用戶能夠經過瀏覽器訪問http://container-ip:15672,若是須要從宿主機外訪問,則使用8080端口:
$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management
若是須要修改默認用戶名與密碼(guest:guest),則可使用RABBITMQ_DEFAULT_USER和RABBITMQ_DEFAULT_PASS環境變量:
$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management
若是須要修改默認vhost,能夠修改RABBITMQ_DEFAULT_VHOST環境變量:
$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost rabbitmq:3-management
而後鏈接至daemon:
$ docker run --name some-app --link some-rabbit:rabbit -d application-that-uses-rabbitmq
用戶也能夠訪問官方鏡像倉庫,並對Dockerfile進行更多定製。
除了通用的消息隊列外,任務隊列在分佈式處理中也十分重要。任務隊列的輸入是工做的一個單元,稱爲任務,有多個工做者監聽隊列來獲取任務並執行。
Celery是一個簡單、靈活、高可用、高性能的開源(BSD許可)分佈式任務處理系統,專一於實時處理的任務隊列管理,同時也支持任務調度。Celery基於Python實現,跟包括Django、Pyramid、Pylons、Flask、Tornado等Web框架都無縫集成,有龐大的用戶與貢獻者社區。Celery能夠單機運行,也能夠在多臺機器上運行,甚至能夠跨越數據中心運行。
1.使用官方鏡像
啓動一個celery worker,即RabbitMQ Broker:
$ 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的hello world程序:
from celery import Celery app = Celery('hello', broker='amqp://guest@localhost//') @app.task def hello(): return 'hello world'
做爲當今大數據處理領域的經典分佈式平臺,Apache Hadoop主要基於Java語言實現,由三個核心子系統組成:HDFS、YARN、MapReduce,其中,HDFS是一套分佈式文件系統;YARN是資源管理系統,MapReduce是運行在YARN上的應用,負責分佈式處理管理。若是從操做系統的角度看,HDFS至關於Linux的ext3/ext4文件系統,而Yarn至關於Linux的進程調度和內存分配模塊。
1.使用官方鏡像
能夠經過docker run指令運行鏡像,同時打開bash命令行,以下所示:
$ docker run -it sequenceiq/hadoop-docker:2.7.0 /etc/bootstrap.sh -bash
bash-4.1#
此時能夠查看各類配置信息和執行操做,例如查看namenode日誌等信息:
bash-4.1# cat /usr/local/hadoop/logs/hadoop-root-namenode-d4e1e9d8f24f.out
ulimit -a for user root core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7758 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1048576 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
2.安裝驗證
須要驗證Hadoop環境是否安裝成功。打開容器的bash命令行環境,進入Hadoop目錄:
bash-4.1# cd $HADOOP_PREFIX
bash-4.1# pwd
/usr/local/hadoop
而後經過運行Hadoop內置的實例程序來進行測試:
bash-4.1# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar grep input output 'dfs[a-z.]+'
16/08/31 10:00:11 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 16/08/31 10:00:15 INFO input.FileInputFormat: Total input paths to process : 31 16/08/31 10:00:16 INFO mapreduce.JobSubmitter: number of splits:31 ...
最後可使用hdfs指令檢查輸出結果:
bash-4.1# bin/hdfs dfs -cat output/*
Apache Spark是一個圍繞速度、易用性和複雜分析構建的大數據處理框架,基於Scala開發。最初在2009年由加州大學伯克利分校的AMPLab開發,並於2010年成爲Apache的開源項目之一。與Hadoop和Storm等其餘大數據和MapReduce技術相比,Spark支持更靈活的函數定義,能夠將應用處理速度提高一到兩個數量級,而且提供了衆多方便的實用工具,包括SQL查詢、流處理、機器學習和圖處理等。
Spark體系架構包括以下三個主要組件:數據存儲、API、管理框架,如圖13-3所示。
1.使用官方鏡像
用戶可使用sequenceiq/spark鏡像,版本方面支持Hadoop 2.6.0,Apache Spark v1.6.0(CentOS)。同時此鏡像還包含Dockerfile,用戶能夠基於它構建自定義的Apache Spark鏡像。
用戶使用docker pull指令直接獲取鏡像:
$ 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日誌等信息:
bash-4.1# cat /usr/local/hadoop/logs/hadoop-root-namenode-sandbox.out
2.驗證
基於YARN部署Spark系統時,用戶有兩種部署方式可選:YARN客戶端模式和YARN集羣模式。
下面分別論述兩種部署方式。
1.YARN客戶端模式
在YARN客戶端模式中,SparkContext(或稱爲驅動程序,driver program)運行在客戶端進程中,應用的master僅處理來自YARN的資源管理請求:
#運行spark shell spark-shell \ --master yarn-client \ --driver-memory 1g \ --executor-memory 1g \ --executor-cores 1 #執行如下指令,若返回1000則符合預期 scala> sc.parallelize(1 to 1000).count()
2.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 \ --driver-memory 1g \ --executor-memory 1g \ --executor-cores 1 \ $SPARK_HOME/lib/spark-examples-1.6.0-hadoop2.6.0.jar
Pi計算(YARN客戶端模式):
#執行如下指令,成功後,命令行將顯示"Pi is roughly 3.1418" spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn-client \ --driver-memory 1g \ --executor-memory 1g \ --executor-cores 1 \ $SPARK_HOME/lib/spark-examples-1.6.0-hadoop2.6.0.jar
3.容器外訪問Spark
若是須要從容器外訪問Spark環境,則須要設置YARN_CONF_DIR環境變量。只能使用根用戶訪問Docker的HDFS環境。
yarn-remote-client文件夾內置遠程訪問的配置信息:
export YARN_CONF_DIR="`pwd`/yarn-remote-client"
當用戶從容器集羣外部,使用非根用戶訪問Spark環境時,則須要配置HADOOP_USER_NAME環境變量:
export HADOOP_USER_NAME=root
Apache Storm是一個實時流計算框架,由Twitter在2014年正式開源,遵循Eclipse Public License 1.0。Storm基於Clojure等語言實現。
Storm集羣與Hadoop集羣在工做方式上十分類似,惟一區別在於Hadoop上運行的是MapReduce任務,在Storm上運行的則是topology。MapReduce任務完成處理即會結束,而topology則永遠在等待消息並處理(直到被中止)。
使用Compose搭建Storm集羣
利用Docker Compose模板,用戶能夠在本地單機Docker環境快速地搭建一個Apache Storm集羣,進行應用開發測試。
1.Storm示例架構,Storm架構圖。
其中包含以下容器:
·Zookeeper:Apache Zookeeper三節點部署。
·Nimbus:Storm Nimbus。
·Ui:Storm UI
·Supervisor:Storm Supervisor(一個或多個)。
·Topology:Topology部署工具,其中示例應用基於官方示例storm-starter代碼構建。
2.本地開發測試
首先從Github下載須要的代碼:
$ 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
當UI容器啓動後,用戶能夠訪問容器的8080端口來打開操做界面。
利用以下命令,能夠伸縮supervisor的數量,好比伸縮到3個實例:
$ docker-compose scale supervisor=3
用戶也許會發現Web界面中並無運行中的topology。這是由於Docker Compose目前只能保證容器的啓動順序,可是沒法確保所依賴容器中的應用已經徹底啓動並能夠被正常訪問了。爲了解決這個問題,須要運行下面的命令來再次啓動topolgoy服務應用來提交更新的拓撲:
$ docker-compose start topology
稍後刷新Storm UI,能夠發現Storm應用已經部署成功了。
Elasticsearch是一個基於Lucene的開源搜索服務器,主要基於Java實現。它提供了一個分佈式的,多租戶的全文搜索引擎,內含RESTful web接口。
Elasticsearch提供了實時的分佈式數據存儲和分析查詢功能,很容易擴展到上百臺服務器,支持處理PB級結構化或非結構化數據。配合Logstash、Kibana等組件,能夠快速構建一套對日誌消息的分析平臺。
可使用官方鏡像,快速運行Elasticsearch容器:
$ docker run -d elasticsearch
也能夠在啓動時傳入一些額外的配置參數:
$ docker run -d elasticsearch elasticsearch -Des.node.name="TestNode"
目前使用的鏡像內含默認配置文件,包含了預先定義好的默認配置。
若是用戶要使用自定義配置,可使用數據卷,掛載自定義配置文件至/usr/share/elasticsearch/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端口是內部通訊端口,這些通訊包括心跳,集羣內部信息同步。
分佈式處理與大數據處理領域的典型熱門工具,包括Rabbitmq、Celery、Hadoop、Spark、Storm和Elasticsearch等。這些開源項目的出現,極大下降了開發者進行分佈式處理和數據分析的門檻。
實際上,摩爾定律的失效,必將致使愈來愈多的複雜任務必須採用分佈式架構進行處理。在新的架構和平臺下,如何實現高性能、高可用性,如何讓應用容易開發、方便調試,都是十分複雜的問題。已有的開源平臺項目提供了很好的實現參考,方便用戶將更多的精力放到核心業務的維護上。經過基於容器的部署和使用,極大簡化了對如此複雜系統的使用和維護。