Docker實戰(十)之分布式處理與大數據平台


分布式系統和大數據處理平台是目前業界關注的熱門技術。

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運行的主機名。這樣可以輕松得地管理和維護數據了:

 用戶使用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、管理框架。

(1)使用官方鏡像

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 \

--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 \

--executory-cores 1 \

$SPARK_HOME/lib/spark-examples-1.6.0-hadoop2.6.0.jar

(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端口是內部通信端口,這些通信包括心跳,集群內部信息同步。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM