Storm on OpenShift

背景

OpenShift是目前比较主流的基于Kubernetes的容器云解决方案,OpenShift在kubernetes基础上提供了快速部署k8s集群的Ansible脚本,DevOps能力以及一个易于使用的前端界面。本文主要讨论如何在OpenShift上拉起Storm集群。

Storm架构

Storm的架构是Slave-Master模式的,一个完整的Storm集群需要以下四种服务:
- 一个或多个Nimbus服务,storm集群的管理节点,可以实现基于Zookeeper的HA方案

- 一个UI服务,提供监控集群和拓扑(topology)运行前端界面

- 一个DRPC服务,提供了用户和正在运行的拓扑交互的分布式RPC接口

- 若干个Supervisor服务,storm集群的计算节点

Zookeeper方案

Storm集群的正常运行还需要依赖Zookeeper,因为Storm各组件的服务发现,nimbus节点的HA以及topology的信息都是存储在Zookeeper里的。

可以通过两种方式来为OpenShift上的Storm编排提供Zookeeper服务:

- 独占的Zookeeper集群: 在OpenShift集群上为每个Storm集群动态的启动一个独占的Zookeeper集群的编排,其至少包含三个Zookeeper镜像并提供外部存储方案(如GlusterFS)来持久化Zookeeper的数据

- 共享的Zookeeper集群:提前创建一个zookeeper集群,各storm集群实例共享使用;共享的zookeeper集群可以由OpenShift托管的zookeeper编排,也可以是在OpenShift集群外部的若干台与OpenShift集群保持网络连通的虚拟机或物理机器上手工搭建的Zookeeper集群;共享zk的方式需要考虑多个storm集群之间的数据冲突问题,因为storm集群会默认将数据存储到zookeeper的"/storm"目录下,所以每个storm集群实例在zookeeper上都需要有自己独立的数据存储目录,可以通过storm的配置项“storm.zookeeper.root”来指定。

Storm镜像构建

我们需要为storm的每个组件构建单独的docker镜像,即storm编排需要一个nimbus镜像,一个ui镜像,一个supervisor镜像以及一个drpc镜像。由于storm的apache官方安装包里包含了所有的组件,管理员可以根据不同的配置文件(conf/storm.yaml)和启动命令来决定当前启动的是哪一个组件,所以用于构建各个组件镜像的Dockerfile也只有启动命令和配置文件的差异。

以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里的启动命令:

- nimbus的启动命令是"bin/storm nimbus",storm.yaml如下:

storm.zookeeper.servers:

- 10.128.0.46

storm.zookeeper.root: "/storm_001"

nimbus.thrift.port: 6627

storm.yaml三个参数分别指出了zookeeper集群的地址,storm数据在zookeeper里的存储位置,nimbus的thrift监听端口

- ui的启动命令是"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里的四个参数分别代表zookeeper集群地址,storm数据在zookeeper里的存储目录,nimbus的thrift监听端口,nimbus服务的列表(nimbus HA场景下需要配多个),ui服务的监听端口

- supervisor的启动命令是"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里的四个参数分别代表zookeeper集群地址,storm数据在zookeeper里的存储目录,nimbus的thrift监听端口,nimbus服务的列表(nimbus HA场景下需要配多个)

- drpc的启动命令是"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里的五个参数分别代表zookeeper集群地址,storm数据在zookeeper里的存储目录,nimbus的thrift监听端口,nimbus服务的列表(nimbus HA场景下需要配多个),drpc服务监听端口

storm编排

storm的编排将启动包含1个nimbus服务,1个ui服务,1个drpc服务以及2个supervisor服务在内的storm集群环境。要实现这样的配置的storm集群,需要为nimbus/ui/drpc/supervisor分别创建rc(replication controller),由kubernetes保证各个组件的服务可用性以及备份数目,具体配置如下:

- nimbus的rc,启动一个运行storm nimbus服务的pod并开放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,将启动一个运行storm ui服务的pod并开放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将启动2个运行storm supervisor服务的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将启动一个运行storm drpc服务的pod并开放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: {}

各个组件的rc创建后,我们还需要考虑服务暴露的问题,即将storm集群中需要被用户和应用访问的服务暴露为kubernetes的service;在storm集群环境中用户或应用程序需要连接nimbus服务去提交topology的jar包,需要访问storm ui查看storm的集群状态和topology执行情况,需要通过drpc服务提供的drpc接口与topology交互。所以,我们需要为nimbus,ui,drpc各自创建一个service。

在OpenShift/Kubernetes中,可以通过两种方式将service暴露到集群之外:

- nodeport,在OpenShift/Kubernetes集群的所有node节点上开放一个指定端口,在集群外部可以用集群内任何一个node的ip/hostname加上该指定端口访问service

- external IP,将service绑定到OpenShift/Kubernetes集群内的某个指定节点的指定端口上,在集群外部可以通过该节点的ip/hostname加端口访问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

测试

1 登陆OpenShift集群

2 通过oc命令创建nimbus/ui/supervisor/drpc的rc

3 通过oc命令创建nimbus/ui/supervisor/drpc的service

4 通过oc命令查看storm集群的pods以及services的运行状况

5 打开浏览器,通过storm-ui service提供的external IP和8080端口访问storm ui: http://10.1.236.92:8080

6 在客户端机器(比如自己的laptop)上下载与集群上运行的storm版本一致apache storm的安装包,如:http://apache.cs.utah.edu/storm/apache-storm-0.10.0/apache-storm-0.10.0.tar.gz

7 解压并进入目录apache-storm-0.10.0/conf,修改storm.yaml配置文件,指向storm集群的nimbus service暴露出来的external ip和端口(详见步骤4的截图):

storm.zookeeper.servers:

- 10.128.0.46

nimbus.thrift.port: 6627

nimbus.host: 10.1.236.92

8 通过storm命令行远程连接到storm的nimbus服务,查看storm集群中在执行的topology列表(当前列表为空)

9 如果需要提交topology的jar包到storm集群,则可以在客户端直接执行./bin/storm jar  <topology-jar-path> <topology-jar-class>

改进

未来可以改进的地方包括:

1 通过docker的启动脚本动态注入storm.yaml需要的配置项,包括:

- 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的配置项名称从nimbus.host修改为了nimbus.seeds)

3 支持supervisor数目的动态配置,目前是固定的一个编排启动2个supervisor

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Strom集群结构是有一个主节点(nimbus)和多个工作节点(supervisor)组成的主从结构,主节点通过配...
    看山远兮阅读 2,788评论 0 7
  • 目录 场景假设 调优步骤和方法 Storm 的部分特性 Storm 并行度 Storm 消息机制 Storm UI...
    mtide阅读 16,976评论 30 60
  • 1. Storm介绍: Storm是实时流计算框架。企业中典型实时分析框架搭建模式: Flume + Kafka ...
    奉先阅读 1,633评论 0 3
  • 昨天晚上看了族长发的有关冥想的基本常识,今天早上醒来后体验了一下冥想。 深呼吸三次后开始关注自己的呼吸。小腹有起伏...
    Tina说阅读 162评论 0 0
  • 两人就算再相爱,如果没有相处之道,一样会把两个人弄得疲惫不堪,甚至最终走不到最后,以下相处之道。欢迎继续添加。 彼...
    阳光灿烂的女子阅读 767评论 0 2