跨入流式计算时代,用不着洪荒之力——在阿里云容器服务上一键部署JStorm

JStorm是阿里巴巴出品的强大的企业级流式计算引擎,跟Apache Strom相比,具有使用方便、性能高、生态丰富等优点,是搭建流式计算平台的优秀选择。更多关于JStorm的介绍,请参考官方网站http://www.jstorm.io/

但是,部署JStorm依赖于zookeeper、python、JDK等若干个组件,同时还要配置nimbus、supervisor等角色,部署过程比较长。为了简化这一过程,阿里巴巴JStorm团队和容器服务团队合作推出了Docker版的JStorm,可以实现一键部署

创建集群

首先我们需要创建一个集群用来部署JStorm。阿里云容器服务提供集成界面,可以很方便地创建出一个集群来,流程请参考这个帮助文档。需要注意的是,我们需要至少3台机器。

部署zookeeper

为了达到高可用,我们需要部署3个zookeeper节点。传统的方式部署zookeeper时,需要把所有节点的IP作为配置文件;一旦迁移,需要修改配置并重启所有节点。阿里云容器服务提供类似DNS的容器名解析服务,可以把容器名作为配置项,这样迁移时就不需要修改配置了。其编排模板如下:

zk1:
    image: 'mesoscloud/zookeeper:3.4.8-ubuntu'
    environment:
        - MYID=1
        - SERVERS=jstorm_zk1_1,jstorm_zk2_1,jstorm_zk3_1
        - constraint:aliyun.node_index==1
    restart: 'always'
zk2:
    image: 'mesoscloud/zookeeper:3.4.8-ubuntu'
    environment:
        - MYID=2
        - SERVERS=jstorm_zk1_1,jstorm_zk2_1,jstorm_zk3_1
        - constraint:aliyun.node_index==2
    restart: 'always'
zk3:
    image: 'mesoscloud/zookeeper:3.4.8-ubuntu'
    environment:
        - MYID=3
        - SERVERS=jstorm_zk1_1,jstorm_zk2_1,jstorm_zk3_1
        - constraint:aliyun.node_index==3
    restart: 'always'

其中jstorm_zk1_1、jstorm_zk2_1、jstorm_zk3_1就是容器名,其规则是<应用名><服务名><容器编号>,所以只要确定了应用名和服务名,容器名就是固定的,可以用来做配置项;而且容器名在容器网络内是可以跨主机解析的。

另外,为了使zookeeper节点分布在不同机器上,我们使用了节点约束constraint:aliyun.node_index==n,n是指集群中节点的序号,这样该容器只会部署在n号节点上。

部署JStorm

阿里巴巴JStorm团队提供了JStorm的Docker镜像https://dev.aliyun.com/detail.html?srepoId=9448,并且会定期更新最新版本。

JStorm有两个角色,Nimbus和Supervisor。从高可用角度考虑,Nimbus需要部署两个,Supervisor可以根据需要配置数量。

同样的,为了让Nimbus分布在不同的机器上,可以指定应用约束affinity:service!=nimbus,这样nimbus服务的容器只会部署在没有其他nimbus容器的机器上。

另外,supervisor依赖的nimbus地址,也是用容器名来代替的。

JStorm还提供WebUI,默认在8080端口提供服务。阿里云容器服务提供一个简单的方式将Web服务暴露到外网,只需要配置标签aliyun.routing.port_8080: 'http://nimbus'。该标签的含义是,将nimbus子域名映射到容器的8080端口。更详细的介绍请参考这篇帮助文档。

其编排模板如下:

nimbus:
    image: 'registry.cn-hangzhou.aliyuncs.com/jstorm-docker/jstorm'
    environment:
        - CHARACTER=nimbus
        - ZK_ROOT=/jstorm.docker.root2
        - ZK_HOSTS=jstorm_zk1_1,jstorm_zk2_1,jstorm_zk3_1
        - CLUSTER_NAME=jstorm.docker.cluster
    labels:
        aliyun.routing.port_8080: 'http://nimbus'
        aliyun.scale: '2'
    restart: 'always'
supervisor:
    image: 'registry.cn-hangzhou.aliyuncs.com/jstorm-docker/jstorm'
    environment:
        - CHARACTER=supervisor
        - NIMBUS_HOSTS=jstorm_nimbus_1
        - ZK_ROOT=/jstorm.docker.root2
        - ZK_HOSTS=jstorm_zk1_1,jstorm_zk2_1,jstorm_zk3_1
        - CLUSTER_NAME=jstorm.docker.cluster
    labels:
        aliyun.routing.port_8080: 'http://supervisor'
        aliyun.scale: '3'
    restart: 'always'
    links:
        - nimbus

一键部署

我们可以把zookeeper和JStorm放在一个编排文件里,实现一键部署。

在这个编排文件中,我们使用了COMPOSE_PROJECT_NAME这个环境变量。COMPOSE_PROJECT_NAME是默认设置的环境变量,其值为当前应用的名称。

zk1:
    image: 'mesoscloud/zookeeper:3.4.8-ubuntu'
    environment:
        - MYID=1
        - SERVERS=${COMPOSE_PROJECT_NAME}_zk1_1,${COMPOSE_PROJECT_NAME}_zk2_1,${COMPOSE_PROJECT_NAME}_zk3_1
        - constraint:aliyun.node_index==1
    restart: 'always'
zk2:
    image: 'mesoscloud/zookeeper:3.4.8-ubuntu'
    environment:
        - MYID=2
        - SERVERS=${COMPOSE_PROJECT_NAME}_zk1_1,${COMPOSE_PROJECT_NAME}_zk2_1,${COMPOSE_PROJECT_NAME}_zk3_1
        - constraint:aliyun.node_index==2
    restart: 'always'
zk3:
    image: 'mesoscloud/zookeeper:3.4.8-ubuntu'
    environment:
        - MYID=3
        - SERVERS=${COMPOSE_PROJECT_NAME}_zk1_1,${COMPOSE_PROJECT_NAME}_zk2_1,${COMPOSE_PROJECT_NAME}_zk3_1
        - constraint:aliyun.node_index==3
    restart: 'always'
nimbus:
    image: 'registry.cn-hangzhou.aliyuncs.com/jstorm-docker/jstorm'
    environment:
        - CHARACTER=nimbus
        - ZK_ROOT=/jstorm.docker.root2
        - ZK_HOSTS=${COMPOSE_PROJECT_NAME}_zk1_1,${COMPOSE_PROJECT_NAME}_zk2_1,${COMPOSE_PROJECT_NAME}_zk3_1
        - CLUSTER_NAME=jstorm.docker.cluster
    labels:
        aliyun.routing.port_8080: 'http://nimbus'
        aliyun.scale: '2'
    restart: 'always'
    links:
        - zk1
        - zk2
        - zk3
supervisor:
    image: 'registry.cn-hangzhou.aliyuncs.com/jstorm-docker/jstorm'
    environment:
        - CHARACTER=supervisor
        - NIMBUS_HOSTS=jstorm_nimbus_1
        - ZK_ROOT=/jstorm.docker.root2
        - ZK_HOSTS=${COMPOSE_PROJECT_NAME}_zk1_1,${COMPOSE_PROJECT_NAME}_zk2_1,${COMPOSE_PROJECT_NAME}_zk3_1
        - CLUSTER_NAME=jstorm.docker.cluster
    labels:
        aliyun.routing.port_8080: 'http://supervisor'
        aliyun.scale: '3'
    restart: 'always'
    links:
        - nimbus

为了保证zookeeper在JStorm之前部署,我们使用了link功能。link除了让容器之间网络互通,还告诉调度器服务之间的依赖关系,调度器会保证被依赖的服务先启动。

生产部署

通过上面的编排文件,我们从容地实现了一键部署JStorm,但在生产上应用,还需要注意一些细节。

  • zookeeper默认把持久化数据保存在/tmp/zookeeper中,生产部署时需要把该数据卷映射到指定的主机目录上
  • JStorm的WebUI开放到了公网,生产部署时需要使用内网域名或使用内网SLB
  • 我们把zookeeper和JStorm部署在了相同的机器上;生产部署时最好隔离开

资料

  • 阿里云容器服务控制台
  • 阿里云容器服务帮助文档
  • JStorm官网
时间: 2024-11-02 13:53:55

跨入流式计算时代,用不着洪荒之力——在阿里云容器服务上一键部署JStorm的相关文章

2016美国QCon看法:在Beam上,我为什么说Google有统一流式计算的野心

编者按:流式计算(Stream Processing)在经历了若干年的发展之后,已经有了比较完整的生态,如开源的Storm, Flink, Spark等,未开源的如Google的DataFlow,几乎每个巨头都有自己的流式计算系统.生态虽繁荣但分散,各个平台之间也是互不兼容的,一个平台上写的程序很难移植到另外一个平台,这些领域难题再加上Google大一统流式计算的野心催生了Apache孵化器的新项目Beam.            Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部

用PostgreSQL支持含有更新,删除,插入的实时流式计算

大多数的流式计算产品只支持APPEND ONLY的应用场景,也就是只有插入,没有更新和删除操作.如果要实现更新和删除的实时流式计算,在PostgreSQL中可以这样来实现.在此前你可以阅读我以前写的文章来了解PG是如何处理一天一万亿的实时流式计算的:https://yq.aliyun.com/articles/166 要支持更新和删除,思路是这样的,加一张前置表,这个前置表的某个字段用来记录字段的最终状态,即到达这个状态后,记录不会被更新或删除.通过触发器来控制什么记录插入到流中同时从前置表删除

Spark Streaming 流式计算实战

这篇文章由一次平安夜的微信分享整理而来.在Stuq 做的分享,原文内容.  业务场景 这次分享会比较实战些.具体业务场景描述: 我们每分钟会有几百万条的日志进入系统,我们希望根据日志提取出时间以及用户名称,然后根据这两个信息形成 userName/year/month/day/hh/normal  userName/year/month/day/hh/delay 路径,存储到HDFS中.如果我们发现日志产生的时间和到达的时间相差超过的一定的阈值,那么会放到 delay 目录,否则放在正常的 no

流式计算的系统设计和实现

阿里云数据事业部强琦为大家带来题为"流式计算的系统设计与实现"的演讲,本文主要从增量计算和流式计算开始谈起,然后讲解了与批量计算的区别,重点对典型系统技术概要进行了分析,包括Storm.Kinesis.MillWheel,接着介绍了核心技术.消息机制以及StreamSQL等,一起来了解下吧.   增量计算和流式计算 流式计算 流计算对于时效性要求比较严格,实时计算就是对计算的时效性要求比较强.流计算是利用分布式的思想和方法,对海量"流"式数据进行实时处理的系统,它源

大数据workshop:《在线用户行为分析:基于流式计算的数据处理及应用》之《数据可视化:构建实时动态运营数据分析大屏》篇

大数据workshop:<在线用户行为分析:基于流式计算的数据处理及应用>之<数据可视化:构建实时动态运营数据分析大屏>篇 实验背景介绍 了解更多2017云栖大会·成都峰会 TechInsight & Workshop. 本手册为云栖大会Workshop之<在线用户行为分析:基于流式计算的数据处理及应用>场的<数据可视化:构建实时动态运营数据分析大屏>篇所需.主要帮助现场学员熟悉并掌握DataV数据可视化的操作和使用. 实验涉及大数据产品 DataV

专访阿里云高级技术专家吴威:Kafka、Spark和Flink类支持流式计算的软件会越来越流行

杭州·云栖大会将于2016年10月13-16日在云栖小镇举办,在这场标签为互联网.创新.创业的云计算盛宴上,众多行业精英都将在这几天里分享超过450个演讲主题. 为了帮助大家进一步了解这场全球前言技术共振盛会的内容,采访了各个论坛的大咖,以飨读者. 以下为正文: 吴威,阿里云高级技术专家.E-MapReduce产品是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,为用户提供集群.作业.数据等管理的一站式大数据处理分析服务,他在其中参与产品设计讨论.平台性能调优等工作,并为用户提供技

StreamingPro 简化流式计算配置

前言 前些天可以让批处理的配置变得更优雅StreamingPro 支持多输入,多输出配置,现在流式计算也支持相同的配置方式了. 另外未来等另外一个项目稳定,会释放出来配合StreamingPro使用,它可以让你很方便的读写HBase,比如可以为HBase 表 添加mapping,类似ES的做法,也可以不用mapping,系统会自动为你创建列(familly:column作为列名),或者将所有列合并成一个字段让你做处理. 配置 首先需要配置源: { "name": "strea

StreamingPro支持Flink的流式计算了

前言 有的时候我们只要按条处理,追求实时性而非吞吐量的时候,类似Storm的模式就比较好了.Spark 在流式处理一直缺乏改进,而Flink在流式方面做得很棒,两者高层的API也是互相借鉴,容易形成统一的感官,所以决定让StreamingPro适配Flink,让其作为StreamingPro底层的流式引擎. StreamingPro自身设计之初就是为了支持多引擎的,所以改造成本很低,昨天花了一下午,晚上加了会班就重构完了.这次增强可以让我司的流式引擎有了新的选择. 准备工作 下载安装包 为了跑起

《在线用户行为分析:基于流式计算的数据处理及应用》Workshop-入口

云栖大会成都峰会大数据Workshop入口 <在线用户行为分析:基于流式计算的数据处理及应用> 钉钉扫码进入阿里云数加流计算和DataV可视化交流群. 流数据采集:日志数据解析及上传 实时数据分析:海量日志数据多维透视 流数据处理:通过StreamSQL分析用户行为 数据可视化:构建实时动态运营数据分析大屏 该课程是针对一个网站实时产生的Nginx日志进行分析,深度挖掘用户的实时行为,为运营提供策略.包含阿里云DataHub.流式计算引擎StreamCompute和酷炫的DataV可视化大屏.