天天看點

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

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

 使用者使用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)示意架構圖

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

其中包含如下容器:

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端口是内部通信端口,這些通信包括心跳,叢集内部資訊同步。

繼續閱讀