DCOS實踐分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)

這篇文章入選CSDN極客頭條

http://geek.csdn.net/news/detail/71572

當前,要保證業務的市場競爭力,僅靠設計一個可用并且好看的產品,已經完全不能滿足要求。全球消費者都希望產品能夠足夠的智能化,通過大數據分析來改善他們的用戶體驗。簡言之,物聯網和大數據終將成為改變生活的技術驅動力。

近幾年涌現了大量的技術架構與設計模式,開發者和科學家可以利用它們為大數據和物聯網開發實時的數據分析工作流應用。其中批處理架構,流式處理架構,lambda架構,Kappa架構,都是其中的代表。所有這些架構,都需要一個易擴展的大數據處理平臺作為基礎。于是2014年底,一組可相互兼容,互相協作的開源組件被整合起來作為這個基礎平臺。SMACK應運而生。

SMACK包括Spark, Mesos, Akka, Cassandra, 以及Kafka,功能如下:

  • 包含廣泛應用于大數據數據處理場景的輕量級工具包
  • 包含被健壯測試并廣泛應用的開源軟件,有強大的社區支持
  • 可保證低延時下的可伸縮性和數據備份。
  • 統一的集群管理平臺來管理多樣的,不同負載的應用。

在部署具體的應用的時候,大數據平臺往往要和普通應用一起配合使用,近年來,普通應用微服務化,容器技術如火如荼,我們需要一個平臺技能管理容器,也能管理大數據平臺。

能夠管理容器的框架很多,有Docker陣營的,Kubernetes陣營的,各有優劣。能夠管理大數據的平臺也很多,從Hadoop到Spark。但是部署的時候,往往需要各個集群分開運維,容器應用一個集群,Hadoop一個集群,Spark一個集群,增加了運維的難度和硬件的開銷。DC/OS解決了這個問題,它可以將容器,普通應用,大數據應用在同一個框架管理起來,共享資源,簡化運維。

本文將帶大家來領略如何基于DC/OS的SMACK運行一個應用,以及SMACK中的各個組件如何整合。

總體架構

下圖是一個基于SMACK的經典應用的總體架構。此應用會接入大量的數據,并對數據做分析。具體說來,此應用從用戶家里的智能儀表收集能源使用數據,這些數據會被大數據分析,從而生成一個地區的能源消耗分布圖。可以被相關部門用于預估另一個地區的能源消耗。

圖片描述

如圖所示,智能儀表的數據會通過互聯網調用計量服務的HTTP接口,發送到數據中心。計量服務將消息通過Kafka發送到模擬器服務。模擬器服務獎數據存儲在Cassandra里面。

Spark從Cassandra里面讀取數據進行分析,將分析的結果存入Cassandra。

模擬器服務可以將Cassandra中的分析結果讀出。

當用戶從手機和電腦上打開網頁的時候,網頁訪問計量服務的HTTP接口,計量服務從模擬器服務讀取分析結果,展示給用戶。

詳細設計

前提條件

  • 安裝一個DC/OS集群
  • 部署一個DC/OS命令行工具

DC/OS服務

接下來,我們要保證所有必需的DC/OS的服務都處于正常狀態。下面列表中的某些服務是DC/OS的核心組件,我們把他們列在這里,是因為我們的應用十分依賴于這些組件。

Marathon

Marathon是DC/OS的核心組件,DC/OS安裝好后就自帶Marathon。在使用他之前,我們最好查看一下他的狀態。

dcos marathon about | jq ".elected == true"

Marathon LB - external (用于外部訪問的Marathon負載均衡器)

默認的Marathon負載均衡器框架會創建一個用于外部訪問的負載均衡器實例。

如需詳細了解DC/OS如何使用Marathon負載均衡器框架,可訪問此鏈接。

快速安裝:

dcos package install marathon-lb

Marathon負載均衡器是基于haproxy的,可用過下面的URL訪問http://p1.dcos:9090/haproxy?stats。Mesos DNS作為DC/OS內部的DNS會記錄Marathon負載均衡器的域名為marathon-lb.marathon.mesos。Mesos DNS也是DC/OS的核心組件。Marathon負載均衡器會被安裝在任一DC/OS的公網節點上,例如p1是一個公網節點的域名,可以通過http://p1.dcos訪問Marathon負載均衡器。

Marathon LB - internal (用于內部訪問的Marathon負載均衡器)

需要創建另一個Marathon的負載均衡器,用于內部組件的相互訪問,而不需要內部組件之間的網絡流量也經過公網。

快速安裝:

cat < marathon-internal-lb-options.json { "marathon-lb":{ "name":"marathon-lb-internal", "haproxy-group":"internal", "bind-http-https":false, "role":"" } } EOF dcos package install --options=marathon-internal-lb-options.json marathon-lb 

內部的Marathon負載均衡器在Mesos DNS中的域名為marathon-lb-internal.marathon.mesos。

Kafka

Kafka已經在DC/OS的服務庫中,所以我們可以直接拿過來用,而不需要自己管理和維護一個Kafka集群

快速安裝:

dcos package install --yes kafka

只需要運行下面的命令就可以驗證服務的狀態。

dcos package list kafka; dcos kafka help

Kafka服務作為Marathon的一個Job運行,從而可以實現長期運行,高可用,彈性伸縮。安裝Kafka需要幾分鐘的時間,可以通過Marathon查看進度。

Kafka默認有三個Broker實例。你可以定制化Kafka服務,根據所需要處理的負載情況,創建更多的Broker。Kafka中的Topic的創建以及消息的消費都是由應用層進行處理。

Cassandra

作為大數據基礎架構,把Cassandra運行在DC/OS上也是必須的。Cassandra已經放在了DC/OS的服務庫中了。

快速安裝:

$ dcos package install cassandra
Installing Marathon app for package [cassandra] version [1.0.0-2.2.5] Installing CLI subcommand for package [cassandra] version [1.0.0-2.2.5] New command available: dcos cassandra DC/OS Cassandra Service is being installed.

安裝Cassandra需要幾分鐘的時間。默認情況下,Cassandra會安裝3個節點,其中2個是種子節點。

ssh到Cassandra集群

Cassandra集群已經運行起來了,下面需要連接到這個集群。讓我們通過下面的命令先得到連接信息。

$ dcos cassandra connection
{"nodes": ["192.168.65.111:9042","192.168.65.121:9042", "192.168.65.131:9042" ] } 

因為IP都是私有IP,因此我們首先要ssh到DC/OS集群中,然后才能練到Cassandra集群。

$ dcos node ssh --master-proxy --leader

現在我們進入到了DC/OS集群內部,可以直接連接Cassandra集群了。我們使用cqlsh客戶端,選取一個Cassandra的節點進行連接。運行下面的命令。

$ docker run -ti cassandra:2.2.5 cqlsh 10.0.2.136 cqlsh>

創建keyspace

我們已經連接到了Cassandra集群,創建一個名為iot_demo的keyspace.

cqlsh> CREATE KEYSPACE iot_demo WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };

創建好了keyspace,我們可以添加一些表及模擬數據到keyspace里面,從而我們的應用可以使用Cassandra.

服務發現

基于DC/OS命令行的服務發現

我們可以使用DC/OS的工具進行服務發現。在Docker的Entrypoint里面,可以嵌入腳本,通過DC/OS的命令行發現服務,并export在環境變量里面。

Akka的服務發現

為了發現Akka節點,在Docker的entrypoint腳本docker-entrypoint.sh中,嵌入下面的命令:

export AKKA_SEED_NODES=`dcos marathon app show  | jq -r ".tasks[].host" | tr '\n' ','  | sed 's/,$//g'`

應用的配置可以使用這個環境變量。如果自己是Akka集群的第一個節點,則創建一個Akka集群,如果已經存在一個Akka集群,則可以發現并加入這個集群。

我們考慮了下面這個特殊的場景:

當前容器中的Akka節點是第一個節點,在這種特殊情況下,服務發現這一步的結果是發現了自己,此結果是正確的,做默認處理即可。

Kafka的服務發現

類似,我們同樣可以在Docker的entrypoint里面嵌入下面的腳本發現Kafka的所有的broker。

export KAFKA_BROKERS_LIST=`dcos kafka connection --dns | jq -r ".names[]" | tr '\n' ','  | sed 's/,$//g'`

基于Marathon負載均衡器的服務發現

可以使用內部的和外部的Marathon負載均衡器作為服務發現的另一種方式。

應用層的部署

我們已經部署完了DC/OS的服務,并且配置了服務發現。接下來,我們來部署應用,使用這些DC/OS服務。

我們將使用Marathon部署應用層,從而達到應用的長時間運行。應用的組件會作為Marathon的任務運行在Docker里面。組件之間的相互配置和依賴關系,都可以通過Marathon來實現。

應用層保護兩個微服務,計量服務和模擬器服務,另外還有一個簡單的網頁做展示。

計量服務

計量服務構成一個Akka集群,暴露REST接口被模擬器服務和網頁訪問。

計量服務定義為下面的json,發送給Marathon進行部署

{"id": "meter","container": { "type": "DOCKER", "docker": { "image": "cakesolutions/iot-demo-meter" } }, "labels":{ "HAPROXY_GROUP":"external,internal" } … } 

Marathon的任務定義包含一個特殊的標簽HAPROXY_GROUP,通過這個標簽,Marathon負載均衡器知道是否暴露這個應用。”external”是默認的用于外部訪問的Marathon負載均衡器,說明外部可以訪問這個服務。

“internal”是用于內部訪問的Marathon負載均衡器,說明此服務可以通過下面的DNS,被內部的其他組件訪問:marathon-lb-internal.marathon.mesos:1900。模擬器服務就可以使用這個DNS訪問計量服務的REST API。

用于外部訪問的Marathon負載均衡器需要保證內部的DNS marathon-lb.marathon.mesos:19002可以在外網上被解析為p1.dcos:19002。

網頁就需要使用這個外網可訪問的域名,因為網頁是運行在瀏覽器里面的,在數據中心外,無法使用內部DNS.

接下來,我們調用下面的命令部署計量服務。

dcos marathon app add meter.json
The Marathon jobs can be redeployed by using either Marathon API, either DC/OS CLI. Traditionally now we’ve been using the Marathon API, directly or with the Python driver. 

模擬器服務

模擬器服務的Marathon的json如下:

{"id": "simulator","container": { "type": "DOCKER", "docker": { "image": "cakesolutions/iot-demo-simulator" } }, "env": { "METER_HOST": "marathon-lb-internal.marathon.mesos", "METER_PORT": "19002" }, "labels":{ "HAPROXY_GROUP":"external" } } 

類似,我們通過下面的命令將模擬器服務作為Marathon的任務運行,從而實現長時間運行。

dcos marathon app add simulator.json

模擬器服務需要知道計量服務的API,所以我們將計量服務的DNS作為環境變量傳給了模擬器服務。

用于外部訪問的Marathon負載均衡器需要保證內部的DNS marathon-lb.marathon.mesos:19001可以在外網上被解析為p1.dcos:19001。從而可以被網頁訪問。

網頁客戶端

網頁也使用Marathon的json如下:

{"id": "web","container": { "type": "DOCKER", "docker": { "image": "cakesolutions/iot-demo-web", } }, "env": { "METER_HOST": "p1.dcos", "METER_PORT": "19002", "METER_HOST": "p1.dcos", "METER_PORT": "19001" }, "labels":{ "HAPROXY_GROUP":"external" } } 

將網頁運行為Marathon的任務。

dcos marathon app add web.json

網頁需要能夠在瀏覽器中訪問計量服務和模擬器服務,因而兩個服務的DNS都作為環境變量傳給了網頁的Docker.

P1.dcos是DC/OS公網節點的DNS域名,Marathon的負載均衡器會運行在這個公網節點上。


METER_HOST=p1.dcos
METER_PORT=19002 SIMULATOR_HOST=p1.dcos SIMULATOR_PORT=19001

總結

到此,我們看到了SMACK中的框架如何運行在DC/OS上,例如Kafka, Cassandra這些復雜的組件如何被方便的安裝和配置,如何基于這些框架構建自己的服務。

因而我們可以得出結論,DC/OS的確是:

  • 在生產環境部署容器應用的最方便的方式
  • 充分高效率利用我們的基礎架構的最方便的方式
  • 非常方便的將不同的框架安裝在同一個集群環境中。
  • 提供了一種非常方便的方式對服務進行彈性伸縮。

總而言之,DC/OS是能夠解決您數據中心問題的完整解決方案。誠如大家所知,DC/OS是基于Mesos的,是高可靠的,是被生產環境驗證過的。

http://www.cnblogs.com/popsuper1982/p/5585437.html

?

轉載于:https://www.cnblogs.com/softidea/p/7003126.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258421.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258421.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258421.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

連續系統的卷積積分與離散系統的卷積和

在LTI連續系統中&#xff0c;以沖激函數為基本信號&#xff0c;將任意信號分解&#xff0c;從而得到連續系統的零狀態響應等于激勵與系統沖激響應的卷積積分 &#x1d466;&#x1d467;&#x1d460;&#x1d461;&#x1d453;&#x1d461;?h&#x1d461; 在LTI離散…

自學python從零開始學_新手學習python-從零開始學習

1.學習pythonurllib2 常用方法urlopen(url, data, timeout)urllib2.Request()urllib.urlencode()params {}get : url "?" paramshttp:請求分析User-Agent : 有些服務器或 Proxy 會通過該值來判斷是否是瀏覽器發出的請求Content-Type : 在使用 REST 接口時&#x…

【數據結構】圖的深度優先搜索

圖的深度優先搜索類似于樹的深度優先搜索。不同的是&#xff0c;圖中可能包括循環&#xff0c;即我們有可能重復訪問節點。為了避免訪問已經訪問過的節點&#xff0c;我們要使用一個布爾變量的數組。 例如&#xff0c;在下圖中&#xff0c;我們從節點2開始訪問。當訪問到節點0&…

flex中dispatchEvent的用法(自定義事件) .

Evevt和EventDispatcher類在as3的事件機制中是很重要的角色&#xff0c;dispatchEvent()是EventDispatcher類的一個事件發送方法&#xff0c;它可以發送出Event類或其子類的實例&#xff0c;在as3中所有的顯示對象都可以發送事件&#xff0c;因為as3中所有的顯示對象都是EventD…

菜鳥超級進口大倉618首度亮相!跨境商品也能當日次日達

6月12日下午3點40分&#xff0c;來自南京的一名用戶收到了由寧波保稅倉發出、圓通速遞配送的雀巢咖啡&#xff0c;這距離他在天貓國際上下單僅過去4小時。 天貓618在昨日迎來進口日&#xff0c;進口銷量火爆上升。作為國內最為先進的跨境進口倉&#xff0c;菜鳥超級大倉在本次大…

頻域/s域/z域三大變換的發展史及其聯系

本文主要介紹三大變換&#xff08;傅里葉變換、拉普拉斯變換及Z變換&#xff09;的發展史及其之間的聯系。

Tomcat8.0.21登錄時忘記用戶名和密碼

大概是這學期開學沒多久吧&#xff0c;4月份的時候&#xff0c;為了學習javaEE&#xff0c;裝了Tomcat。過了這么久早就忘記用戶名和密碼了&#xff0c;所以無法進入Tomcat的管理界面。百度&#xff08;其實我也很想用google&#xff09;了一堆&#xff0c;幾乎都是修改用戶配置…

二元隱函數求二階偏導_在線計算專題(03):具體、抽象函數的導數、微分與方向導數的計算...

導數與微分是微積分內容的基礎&#xff0c;就計算來說一元函數與多元函數的導數的計算思想一致. 不管是一元函數還是多元函數&#xff0c;導數、偏導數的計算都是將函數視為求導變量的一元函數求導數。微分在描述形式略有區別&#xff0c;但是其計算方法還是一樣&#xff0c;只…

android更換工具鏈

歡迎轉載opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e73 android編譯系統是跟隨android源碼一起發布的&#xff0c;使用了gcc編譯器&#xff0c;也就是所謂的交叉編譯環境。android-4.2里用的編譯器是gcc4.6&#xff0c;本篇升級gcc4.6到gcc4.6&#xff0c;修…

頻域/s域/z域三大變換的性質對比

本文主要介紹三大變換&#xff08;傅里葉變換、拉普拉斯變換及Z變換&#xff09;的性質對比及其常用信號變換。

Java系列(1) JavaEE架構

JavaEE是開發分布式應用的工業標準&#xff0c;Weblogic,BES,Tomcat等是比較常見的JavaEE服務器&#xff0c;嚴格來說Tomcat沒有實現全部的JavaEE規范&#xff0c;只能算是Servlet容器。我們從一幅Spec文檔上的架構圖,粗略了解JavaEE的基本結構。該結構圖表達了JavaEE各元素的邏…

協整檢驗r語言代碼_R語言時間序列分析實例

#加載數據xread.table(file.choose())#生成時間序列對象xtimeseries#畫時間序列圖plot.ts(xtimeseries)#增加線性擬合曲線abline(lm(xtimeseries~time(xtimeseries)))1、分解時間序列分解一個時間序列意味著把它拆分成構成元件&#xff0c;一般序列包含一個趨勢部分、一個不規則…

pat1043. Is It a Binary Search Tree (25)

1043. Is It a Binary Search Tree (25) 時間限制400 ms內存限制65536 kB代碼長度限制16000 B判題程序Standard作者CHEN, YueA Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains o…

微軟待辦應用更新

微軟做了一些更改和優化來改進微軟待辦。 為了在所有設備上獲得最佳體驗&#xff0c;需確保移動和桌面微軟待辦2021 年 12 月 31日之前的版本為 2.49 或更高版本&#xff0c;否則微軟待辦不再支持跨設備同步&#xff0c;但仍然能脫機使用。 桌面版的微軟待辦應用下載地址為&…

出租WiFi到底靠不靠譜?

創業是一種心態&#xff0c;也是不斷的探索&#xff0c;他融入我們的生活&#xff0c;從日常中積累&#xff0c;從小微處啟航。 一、背景交代 最近在換工作&#xff0c;本周搬到新租的單身公寓&#xff0c;空間不大&#xff0c;倒是干凈整潔。委托租房中介幫忙開通寬帶&#xf…

AD20學習筆記1---元件庫的創建

前言&#xff1a; 本文學習視頻是B站點擊率第一的凡億教育《Altium Designer 20 19&#xff08;入門到精通全38集&#xff09;四層板智能車PCB設計視頻教程》&#xff0c;視頻地址&#xff1a;Altium Designer 20 19&#xff08;入門到精通全38集&#xff09;四層板智能車PCB設…

nodejs環境搭建與express安裝配置

一、NPM 1、下載nodeJS 下載地址&#xff1a;https://nodejs.org/en/download/ 因為我的系統是Linux 的&#xff0c;所以下載已經編譯好的Linux&#xff0c;nodejs tar包 3、下載完成過后放到/usr/local/下面 4、解壓&#xff1a;因為這個包不是gz的包所以解壓 正確&#xff1a…

在vue中實現picker樣式_基于Vue實現timepicker

主要用到的還是Vue的基本知識而已&#xff0c;不過要想到的細節很多。先放效果&#xff0c;點擊上框&#xff0c;顯示timepicker。而且可以根據點擊的是時還是分來改變圓盤的數字。這里我用了兩個組件&#xff0c;和&#xff0c;這里的時和分的數值我掛在了根實例中&#xff0c…

玩玩

金字塔一樣輸出字母&#xff0c;如 輸入 d a a b a a b c b a a b c d c b a 代碼實現 #include<stdio.h> int main(void) { char z; int j,t,k; scanf("%c",&z); t0; if(z>a&&z<z) { for(int i0;i<z-a;i) { for(kz-a-t;k…

總結界面框架_UI_Adapter

本人定期更新經典案例及解決方案如有疑問請聯系我QQ1822282728 -- 277627117 下面是常用到的ui Demo安卓三級篩選菜單listview&#xff08;非常經典&#xff09; http://download.csdn.net/detail/zillvip/9138975android地圖應用&#xff08;路徑規劃&#xff0c;地理編碼&…