Storm on OpenShift

背景

OpenShift是目前比較主流的基于Kubernetes的容器云解決方案,OpenShift在kubernetes基礎(chǔ)上提供了快速部署k8s集群的Ansible腳本廊敌,DevOps能力以及一個(gè)易于使用的前端界面拇厢。本文主要討論如何在OpenShift上拉起Storm集群拯勉。

Storm架構(gòu)

Storm的架構(gòu)是Slave-Master模式的贼涩,一個(gè)完整的Storm集群需要以下四種服務(wù):
- 一個(gè)或多個(gè)Nimbus服務(wù)言缤,storm集群的管理節(jié)點(diǎn),可以實(shí)現(xiàn)基于Zookeeper的HA方案

- 一個(gè)UI服務(wù)导而,提供監(jiān)控集群和拓?fù)?topology)運(yùn)行前端界面

- 一個(gè)DRPC服務(wù)忱叭,提供了用戶(hù)和正在運(yùn)行的拓?fù)浣换サ姆植际絉PC接口

- 若干個(gè)Supervisor服務(wù),storm集群的計(jì)算節(jié)點(diǎn)

Zookeeper方案

Storm集群的正常運(yùn)行還需要依賴(lài)Zookeeper今艺,因?yàn)镾torm各組件的服務(wù)發(fā)現(xiàn)韵丑,nimbus節(jié)點(diǎn)的HA以及topology的信息都是存儲(chǔ)在Zookeeper里的。

可以通過(guò)兩種方式來(lái)為OpenShift上的Storm編排提供Zookeeper服務(wù):

- 獨(dú)占的Zookeeper集群: 在OpenShift集群上為每個(gè)Storm集群動(dòng)態(tài)的啟動(dòng)一個(gè)獨(dú)占的Zookeeper集群的編排虚缎,其至少包含三個(gè)Zookeeper鏡像并提供外部存儲(chǔ)方案(如GlusterFS)來(lái)持久化Zookeeper的數(shù)據(jù)

- 共享的Zookeeper集群:提前創(chuàng)建一個(gè)zookeeper集群撵彻,各storm集群實(shí)例共享使用;共享的zookeeper集群可以由OpenShift托管的zookeeper編排,也可以是在OpenShift集群外部的若干臺(tái)與OpenShift集群保持網(wǎng)絡(luò)連通的虛擬機(jī)或物理機(jī)器上手工搭建的Zookeeper集群陌僵;共享zk的方式需要考慮多個(gè)storm集群之間的數(shù)據(jù)沖突問(wèn)題轴合,因?yàn)閟torm集群會(huì)默認(rèn)將數(shù)據(jù)存儲(chǔ)到zookeeper的"/storm"目錄下,所以每個(gè)storm集群實(shí)例在zookeeper上都需要有自己獨(dú)立的數(shù)據(jù)存儲(chǔ)目錄碗短,可以通過(guò)storm的配置項(xiàng)“storm.zookeeper.root”來(lái)指定值桩。

Storm鏡像構(gòu)建

我們需要為storm的每個(gè)組件構(gòu)建單獨(dú)的docker鏡像,即storm編排需要一個(gè)nimbus鏡像豪椿,一個(gè)ui鏡像奔坟,一個(gè)supervisor鏡像以及一個(gè)drpc鏡像。由于storm的apache官方安裝包里包含了所有的組件搭盾,管理員可以根據(jù)不同的配置文件(conf/storm.yaml)和啟動(dòng)命令來(lái)決定當(dāng)前啟動(dòng)的是哪一個(gè)組件咳秉,所以用于構(gòu)建各個(gè)組件鏡像的Dockerfile也只有啟動(dòng)命令和配置文件的差異。

以nimbus鏡像的Dockerfile為例:

FROM docker.io/nathonfowlie/centos-jre

# 0.10.0

ENV STORM_VERSION 0.10.0

ENV APACHE_MIRROR http://apache.cs.utah.edu/storm

RUN curl -o /opt/apache-storm.tar.gz ${APACHE_MIRROR}/apache-storm-${STORM_VERSION}/apache-storm-${STORM_VERSION}.tar.gz && \

tar -C /opt -xzf /opt/apache-storm.tar.gz && \

rm /opt/apache-storm.tar.gz && \

mv /opt/apache-storm-${STORM_VERSION} /opt/apache-storm && \

mkdir -p /opt/apache-storm/storm-local && \

mkdir -p /opt/apache-storm/logs && \

mkdir -p /opt/apache-storm/logback-dist && \

mkdir -p /opt/apache-storm/conf-dist && \

cp /opt/apache-storm/conf/* /opt/apache-storm/conf-dist/

COPY logback-cluster.xml /opt/apache-storm/logback/cluster.xml

COPY logback-cluster.xml /opt/apache-storm/logback-dist/cluster-console.xml

COPY storm.yaml /opt/apache-storm/conf/

WORKDIR /opt/apache-storm

RUN chmod 777 -R /opt/apache-storm

EXPOSE 6700 6701 6702 6703 8080 6627 3772

VOLUME ["/opt/apache-storm/conf", "/opt/apache-storm/logback", "/opt/apache-storm/logs", "/opt/apache-storm/storm-local"]

CMD ["bin/storm nimbus"]

各鏡像的Dockerfile差異主要在storm.yaml和CMD里的啟動(dòng)命令:

- nimbus的啟動(dòng)命令是"bin/storm nimbus"鸯隅,storm.yaml如下:

storm.zookeeper.servers:

- 10.128.0.46

storm.zookeeper.root: "/storm_001"

nimbus.thrift.port: 6627

storm.yaml三個(gè)參數(shù)分別指出了zookeeper集群的地址澜建,storm數(shù)據(jù)在zookeeper里的存儲(chǔ)位置,nimbus的thrift監(jiān)聽(tīng)端口

- ui的啟動(dòng)命令是"bin/storm ui"蝌以,storm.yaml如下:

storm.zookeeper.servers:

- 10.128.0.46

storm.zookeeper.root: "/storm_001"

nimbus.thrift.port: 6627

nimbus.host: "sb-instanceid-sn"

ui.port: 8080

storm.ymal里的四個(gè)參數(shù)分別代表zookeeper集群地址炕舵,storm數(shù)據(jù)在zookeeper里的存儲(chǔ)目錄,nimbus的thrift監(jiān)聽(tīng)端口跟畅,nimbus服務(wù)的列表(nimbus HA場(chǎng)景下需要配多個(gè))咽筋,ui服務(wù)的監(jiān)聽(tīng)端口

- supervisor的啟動(dòng)命令是"bin/storm supervisor",storm.yaml如下:

storm.zookeeper.servers:

- 10.128.0.46

storm.zookeeper.root: "/storm_001"

nimbus.thrift.port: 6627

nimbus.host: "sb-instanceid-sn"

storm.yaml里的四個(gè)參數(shù)分別代表zookeeper集群地址徊件,storm數(shù)據(jù)在zookeeper里的存儲(chǔ)目錄奸攻,nimbus的thrift監(jiān)聽(tīng)端口,nimbus服務(wù)的列表(nimbus HA場(chǎng)景下需要配多個(gè))

- drpc的啟動(dòng)命令是"bin/storm drpc"虱痕,storm.yaml如下:

storm.zookeeper.servers:

- 10.128.0.46

storm.zookeeper.root: "/storm_001"

nimbus.thrift.port: 6627

nimbus.host: "sb-instanceid-sn"

drpc.port: 3772

storm.yaml里的五個(gè)參數(shù)分別代表zookeeper集群地址睹耐,storm數(shù)據(jù)在zookeeper里的存儲(chǔ)目錄,nimbus的thrift監(jiān)聽(tīng)端口部翘,nimbus服務(wù)的列表(nimbus HA場(chǎng)景下需要配多個(gè))硝训,drpc服務(wù)監(jiān)聽(tīng)端口

storm編排

storm的編排將啟動(dòng)包含1個(gè)nimbus服務(wù),1個(gè)ui服務(wù)新思,1個(gè)drpc服務(wù)以及2個(gè)supervisor服務(wù)在內(nèi)的storm集群環(huán)境窖梁。要實(shí)現(xiàn)這樣的配置的storm集群,需要為nimbus/ui/drpc/supervisor分別創(chuàng)建rc(replication controller)表牢,由kubernetes保證各個(gè)組件的服務(wù)可用性以及備份數(shù)目窄绒,具體配置如下:

- nimbus的rc贝次,啟動(dòng)一個(gè)運(yùn)行storm nimbus服務(wù)的pod并開(kāi)放6627端口崔兴,nimbus rc的yaml如下:

apiVersion: v1

kind: ReplicationController

metadata:

? ? name: storm-nimbus

spec:

? ? replicas: 1

? ? selector:

? ? ? ? storm: nimbus

? ? template:

? ? ? ? metadata:

? ? ? ? ? ? labels:

? ? ? ? ? ? ? ? storm: nimbus

? ? ? ? spec:

? ? ? ? ? ? containers:

? ? ? ? ? ? ? ? - name: nimbus

? ? ? ? ? ? ? ? ? ?image: storm_nimbus:0.10.0

? ? ? ? ? ? ? ? ? ?ports:

? ? ? ? ? ? ? ? ? ? ? ? - containerPort: 6627

? ? ? ? ? ? volumeMounts:

? ? ? ? ? ? - name: storm-data

? ? ? ? ? ? ? mountPath: /opt/apache-storm/storm-local

? ? ? ? volumes:

? ? ? ?- name: storm-data

? ? ? ? ?emptyDir: {}

- ui的rc,將啟動(dòng)一個(gè)運(yùn)行storm ui服務(wù)的pod并開(kāi)放8080端口,ui rc的yaml如下:

apiVersion: v1

kind: ReplicationController

metadata:

? ? name: storm-ui

spec:

? ? replicas: 1

? ? selector:

? ? ? ? storm: ui

? ? template:

? ? ? ? metadata:

? ? ? ? ? ? labels:

? ? ? ? ? ? ? ? storm: ui

? ? ? ? spec:

? ? ? ? ? ?containers:

? ? ? ? ? ?- name: ui

? ? ? ? ? ? ?image: storm_ui:0.10.0

? ? ? ? ? ? ?ports:

? ? ? ? ? ? ? ? ?- containerPort: 8080

? ? ? ? ? ? ?volumeMounts:

? ? ? ? ? ? ?- name: storm-data

? ? ? ? ? ? ? ?mountPath: /opt/apache-storm/storm-local

? ? ? ? ? ?volumes:

? ? ? ? ? ?- name: storm-data

? ? ? ? ? ? ?emptyDir: {}

- supervisor的rc將啟動(dòng)2個(gè)運(yùn)行storm supervisor服務(wù)的pod敲茄,supervisor rc的yaml文件如下:

apiVersion: v1

kind: ReplicationController

metadata:

? ? name: storm-supervisor

spec:

? ? replicas: 2

? ? selector:

? ? ? ? storm: supervisor

? ? template:

? ? ? ? metadata:

? ? ? ? ? ? labels:

? ? ? ? ? ? ? ? storm: supervisor

? ? ? ? spec:

? ? ? ? ? ?containers:

? ? ? ? ? ?- name: supervisor

? ? ? ? ? ? ?image: storm_supervisor:0.10.0

? ? ? ? ? ? ?volumeMounts:

? ? ? ? ? ? ?- name: storm-data

? ? ? ? ? ? ? ?mountPath: /opt/apache-storm/storm-local

? ? ? ? ? ?volumes:

? ? ? ? ? ?- name: storm-data

? ? ? ? ? ? ?emptyDir: {}

- drpc的rc將啟動(dòng)一個(gè)運(yùn)行storm drpc服務(wù)的pod并開(kāi)放3772端口位谋,drpc rc的yaml文件如下:

apiVersion: v1

kind: ReplicationController

metadata:

? ? name: storm-drpc

spec:

? ? replicas: 1

? ? selector:

? ? ? ? storm: drpc

? ? template:

? ? ? ? metadata:

? ? ? ? ? ? labels:

? ? ? ? ? ? ? ? storm: drpc

? ? ? ? spec:

? ? ? ? ? ? containers:

? ? ? ? ? ? - name: drpc

? ? ? ? ? ? ? image: storm_drpc:0.10.0

? ? ? ? ? ? ? ports:

? ? ? ? ? ? ? ? ? - containerPort: 3772

? ? ? ? ? ? ?volumeMounts:

? ? ? ? ? ? ?- name: storm-data

? ? ? ? ? ? ? ?mountPath: /opt/apache-storm/storm-local

? ? ? ? ? ?volumes:

? ? ? ? ? ?- name: storm-data

? ? ? ? ? ? ?emptyDir: {}

各個(gè)組件的rc創(chuàng)建后,我們還需要考慮服務(wù)暴露的問(wèn)題堰燎,即將storm集群中需要被用戶(hù)和應(yīng)用訪問(wèn)的服務(wù)暴露為kubernetes的service掏父;在storm集群環(huán)境中用戶(hù)或應(yīng)用程序需要連接nimbus服務(wù)去提交topology的jar包,需要訪問(wèn)storm ui查看storm的集群狀態(tài)和topology執(zhí)行情況秆剪,需要通過(guò)drpc服務(wù)提供的drpc接口與topology交互赊淑。所以,我們需要為nimbus仅讽,ui陶缺,drpc各自創(chuàng)建一個(gè)service。

在OpenShift/Kubernetes中洁灵,可以通過(guò)兩種方式將service暴露到集群之外:

- nodeport饱岸,在OpenShift/Kubernetes集群的所有node節(jié)點(diǎn)上開(kāi)放一個(gè)指定端口,在集群外部可以用集群內(nèi)任何一個(gè)node的ip/hostname加上該指定端口訪問(wèn)service

- external IP徽千,將service綁定到OpenShift/Kubernetes集群內(nèi)的某個(gè)指定節(jié)點(diǎn)的指定端口上苫费,在集群外部可以通過(guò)該節(jié)點(diǎn)的ip/hostname加端口訪問(wèn)service

以下以external IP方式為例,nimbus/ui/drpc的service的yaml文件示例如下:

- nimbus的service

apiVersion: v1

kind: Service

metadata:

? ? name: storm-nimbus

spec:

? ? selector:

? ? ? ? storm: nimbus

? ? ports:

? ? - protocol: TCP

? ? ? port: 6627

? ? externalIPs:

? ? - 10.1.236.92

- ui的service

apiVersion: v1

kind: Service

metadata:

? ? name: sb-instanceid-su

spec:

? ? selector:

? ? ? ? sb-instanceid-storm: ui

? ? ports:

? ? - protocol: TCP

? ? ? port: 8080

? ? externalIPs:

? ? - 10.1.236.92

- drpc的service

apiVersion: v1

kind: Service

metadata:

? ? name: sb-instanceid-sd

spec:

? ? selector:

? ? ? ? sb-instanceid-storm: drpc

? ? ports:

? ? - protocol: TCP

? ? ? port: 3772

? ? externalIPs:

? ? - 10.1.130.155

測(cè)試

1 登陸OpenShift集群

2 通過(guò)oc命令創(chuàng)建nimbus/ui/supervisor/drpc的rc

3 通過(guò)oc命令創(chuàng)建nimbus/ui/supervisor/drpc的service

4 通過(guò)oc命令查看storm集群的pods以及services的運(yùn)行狀況

5 打開(kāi)瀏覽器双抽,通過(guò)storm-ui service提供的external IP和8080端口訪問(wèn)storm ui: http://10.1.236.92:8080

6 在客戶(hù)端機(jī)器(比如自己的laptop)上下載與集群上運(yùn)行的storm版本一致apache storm的安裝包百框,如:http://apache.cs.utah.edu/storm/apache-storm-0.10.0/apache-storm-0.10.0.tar.gz

7 解壓并進(jìn)入目錄apache-storm-0.10.0/conf,修改storm.yaml配置文件牍汹,指向storm集群的nimbus service暴露出來(lái)的external ip和端口(詳見(jiàn)步驟4的截圖):

storm.zookeeper.servers:

- 10.128.0.46

nimbus.thrift.port: 6627

nimbus.host: 10.1.236.92

8 通過(guò)storm命令行遠(yuǎn)程連接到storm的nimbus服務(wù)琅翻,查看storm集群中在執(zhí)行的topology列表(當(dāng)前列表為空)

9 如果需要提交topology的jar包到storm集群,則可以在客戶(hù)端直接執(zhí)行./bin/storm jar ?<topology-jar-path> <topology-jar-class>

改進(jìn)

未來(lái)可以改進(jìn)的地方包括:

1 通過(guò)docker的啟動(dòng)腳本動(dòng)態(tài)注入storm.yaml需要的配置項(xiàng)柑贞,包括:

- storm.zookeeper.servers

- storm.zookeeper.root

- nimbus.thrift.port

- nimbus.host

- drpc.port

- ui.port

2 支持nimbus HA方椎,目前僅支持單nimbus (nimbus HA特性只支持storm 1.0.0以上的storm版本,并且nimbus的配置項(xiàng)名稱(chēng)從nimbus.host修改為了nimbus.seeds)

3 支持supervisor數(shù)目的動(dòng)態(tài)配置钧嘶,目前是固定的一個(gè)編排啟動(dòng)2個(gè)supervisor

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棠众,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子有决,更是在濱河造成了極大的恐慌闸拿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件书幕,死亡現(xiàn)場(chǎng)離奇詭異新荤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)台汇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)苛骨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)篱瞎,“玉大人,你說(shuō)我怎么就攤上這事痒芝±睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵严衬,是天一觀的道長(zhǎng)澄者。 經(jīng)常有香客問(wèn)我,道長(zhǎng)请琳,這世上最難降的妖魔是什么粱挡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮俄精,結(jié)果婚禮上抱怔,老公的妹妹穿的比我還像新娘。我一直安慰自己嘀倒,他們只是感情好屈留,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著测蘑,像睡著了一般灌危。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碳胳,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天勇蝙,我揣著相機(jī)與錄音,去河邊找鬼挨约。 笑死味混,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诫惭。 我是一名探鬼主播翁锡,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夕土!你這毒婦竟也來(lái)了馆衔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怨绣,失蹤者是張志新(化名)和其女友劉穎角溃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體篮撑,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡减细,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赢笨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片未蝌。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驮吱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出树埠,到底是詐尸還是另有隱情糠馆,我是刑警寧澤嘶伟,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布怎憋,位于F島的核電站,受9級(jí)特大地震影響九昧,放射性物質(zhì)發(fā)生泄漏绊袋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一铸鹰、第九天 我趴在偏房一處隱蔽的房頂上張望癌别。 院中可真熱鬧,春花似錦蹋笼、人聲如沸展姐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)圾笨。三九已至,卻和暖如春逊谋,著一層夾襖步出監(jiān)牢的瞬間擂达,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工胶滋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留板鬓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓究恤,卻偏偏與公主長(zhǎng)得像俭令,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子部宿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Strom集群結(jié)構(gòu)是有一個(gè)主節(jié)點(diǎn)(nimbus)和多個(gè)工作節(jié)點(diǎn)(supervisor)組成的主從結(jié)構(gòu)唤蔗,主節(jié)點(diǎn)通過(guò)配...
    看山遠(yuǎn)兮閱讀 2,860評(píng)論 0 7
  • 目錄 場(chǎng)景假設(shè) 調(diào)優(yōu)步驟和方法 Storm 的部分特性 Storm 并行度 Storm 消息機(jī)制 Storm UI...
    mtide閱讀 17,114評(píng)論 30 60
  • 1. Storm介紹: Storm是實(shí)時(shí)流計(jì)算框架。企業(yè)中典型實(shí)時(shí)分析框架搭建模式: Flume + Kafka ...
    奉先閱讀 1,658評(píng)論 0 3
  • 昨天晚上看了族長(zhǎng)發(fā)的有關(guān)冥想的基本常識(shí)窟赏,今天早上醒來(lái)后體驗(yàn)了一下冥想妓柜。 深呼吸三次后開(kāi)始關(guān)注自己的呼吸。小腹有起伏...
    Tina說(shuō)閱讀 168評(píng)論 0 0
  • 兩人就算再相愛(ài)涯穷,如果沒(méi)有相處之道棍掐,一樣會(huì)把兩個(gè)人弄得疲憊不堪,甚至最終走不到最后拷况,以下相處之道作煌。歡迎繼續(xù)添加掘殴。 彼...
    陽(yáng)光燦爛的女子閱讀 783評(píng)論 0 2