【云原生 | 31】Docker运行实时流计算框架Apache Storm_这是因为docker compose目前只能保证容器的启动顺序,但是无法确保所依赖容器中的-程序员宅基地

技术标签: 云原生  容器  阶段六:零基础入门云原生(Docker+k8s)  大数据专栏  docker  

作者简介:云计算领域优质创作者新星计划第三季python赛道第一名 阿里云ACE认证高级工程师
️个人主页:小鹏linux
个人社区:小鹏linux(个人社区)欢迎您的加入!

目录

1. 关于Apache Storm

1.1  Apache Storm核心概念

1.2 Apache Storm的组件 

1.3 Apache Storm工作流程 

2. 在Docker上运行Apache Storm 

2.1 使用Compose搭建Storm集群 

 结束语


1. 关于Apache Storm

Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理大量数据。它是一个流数据框架,具有最高的摄取率。虽然Storm是无状态的,它通过Apache ZooKeeper管理分布式环境和集群状态。通过Storm可以并行地对实时数据执行各种操作。Storm易于部署和操作,并且它可以保证每个消息将通过拓扑至少处理一次。

1.1  Apache Storm核心概念

Apache Storm从一端读取​​实时数据的原始流,并将其传递通过一系列小处理单元,并在另一端输出处理/有用的信息。

下图描述了Apache Storm的核心概念。

1.2 Apache Storm的组件 

Tuple

Tuple是Storm中的主要数据结构。它是有序元素的列表。默认情况下,Tuple支持所有数据类型。通常,它被建模为一组逗号分隔的值,并传递到Storm集群。

Stream

流是元组的无序序列。

Spouts

流的源。通常,Storm从原始数据源(如Twitter Streaming API,Apache Kafka队列,Kestrel队列等)接受输入数据。否则,您可以编写spouts以从数据源读取数据。“ISpout”是实现spouts的核心接口,一些特定的接口是IRichSpout,BaseRichSpout,KafkaSpout等。

Bolts

Bolts是逻辑处理单元。Spouts将数据传递到Bolts和Bolts过程,并产生新的输出流。Bolts可以执行过滤,聚合,加入,与数据源和数据库交互的操作。Bolts接收数据并发射到一个或多个Bolts。 “IBolt”是实现Bolts的核心接口。一些常见的接口是IRichBolt,IBasicBolt等。

拓扑

Spouts和Bolts连接在一起,形成拓扑结构。实时应用程序逻辑在Storm拓扑中指定。简单地说,拓扑是有向图,其中顶点是计算,边缘是数据流。

简单拓扑从spouts开始。Spouts将数据发射到一个或多个Bolts。Bolt表示拓扑中具有最小处理逻辑的节点,并且Bolts的输出可以发射到另一个Bolts作为输入。

Storm保持拓扑始终运行,直到您终止拓扑。Apache Storm的主要工作是运行拓扑,并在给定时间运行任意数量的拓扑。

任务

现在你有一个关于Spouts和Bolts的基本想法。它们是拓扑的最小逻辑单元,并且使用单个Spout和Bolt阵列构建拓扑。应以特定顺序正确执行它们,以使拓扑成功运行。Storm执行的每个Spout和Bolt称为“任务”。简单来说,任务是Spouts或Bolts的执行。

进程

拓扑在多个工作节点上以分布式方式运行。Storm将所有工作节点上的任务均匀分布。工作节点的角色是监听作业,并在新作业到达时启动或停止进程。

流分组

数据流从Spouts流到Bolts,或从一个Bolts流到另一个Bolts。流分组控制元组在拓扑中的路由方式,并帮助我们了解拓扑中的元组流。有如下分组:

Shuffle grouping: Tuples are randomly distributed across the bolt's tasks in a way such that each bolt is guaranteed to get an equal number of tuples.
Fields grouping: The stream is partitioned by the fields specified in the grouping. For example, if the stream is grouped by the "user-id" field, tuples with the same "user-id" will always go to the same task, but tuples with different "user-id"'s may go to different tasks.
Partial Key grouping: The stream is partitioned by the fields specified in the grouping, like the Fields grouping, but are load balanced between two downstream bolts, which provides better utilization of resources when the incoming data is skewed. This paper provides a good explanation of how it works and the advantages it provides.
All grouping: The stream is replicated across all the bolt's tasks. Use this grouping with care.
Global grouping: The entire stream goes to a single one of the bolt's tasks. Specifically, it goes to the task with the lowest id.
None grouping: This grouping specifies that you don't care how the stream is grouped. Currently, none groupings are equivalent to shuffle groupings. Eventually though, Storm will push down bolts with none groupings to execute in the same thread as the bolt or spout they subscribe from (when possible).
Direct grouping: This is a special kind of grouping. A stream grouped this way means that the producer of the tuple decides which task of the consumer will receive this tuple. Direct groupings can only be declared on streams that have been declared as direct streams. Tuples emitted to a direct stream must be emitted using one of the [emitDirect](javadocs/org/apache/storm/task/OutputCollector.html#emitDirect(int, int, java.util.List) methods. A bolt can get the task ids of its consumers by either using the provided TopologyContext or by keeping track of the output of the emit method in OutputCollector (which returns the task ids that the tuple was sent to).
Local or shuffle grouping: If the target bolt has one or more tasks in the same worker process, tuples will be shuffled to just those in-process tasks. Otherwise, this acts like a normal shuffle grouping.

1.3 Apache Storm工作流程 

一个工作的Storm集群应该有一个Nimbus和一个或多个supervisors。另一个重要的节点是Apache ZooKeeper,它将用于nimbus和supervisors之间的协调。

现在让我们仔细看看Apache Storm的工作流程 −

  • 最初,nimbus将等待“Storm拓扑”提交给它。
  • 一旦提交拓扑,它将处理拓扑并收集要执行的所有任务和任务将被执行的顺序。
  • 然后,nimbus将任务均匀分配给所有可用的supervisors。
  • 在特定的时间间隔,所有supervisor将向nimbus发送心跳以通知它们仍然运行着。
  • 当supervisor终止并且不向心跳发送心跳时,则nimbus将任务分配给另一个supervisor。
  • 当nimbus本身终止时,supervisor将在没有任何问题的情况下对已经分配的任务进行工作。
  • 一旦所有的任务都完成后,supervisor将等待新的任务进去。
  • 同时,终止nimbus将由服务监控工具自动重新启动。
  • 重新启动的网络将从停止的地方继续。同样,终止supervisor也可以自动重新启动。由于网络管理程序和supervisor都可以自动重新启动,并且两者将像以前一样继续,因此Storm保证至少处理所有任务一次。
  • 一旦处理了所有拓扑,则网络管理器等待新的拓扑到达,并且类似地,管理器等待新的任务。

默认情况下,Storm集群中有两种模式:

  • 本地模式 -此模式用于开发,测试和调试,因为它是查看所有拓扑组件协同工作的最简单方法。在这种模式下,我们可以调整参数,使我们能够看到我们的拓扑如何在不同的Storm配置环境中运行。在本地模式下,storm拓扑在本地机器上在单个JVM中运行。
  • 生产模式 -在这种模式下,我们将拓扑提交到工作Storm集群,该集群由许多进程组成,通常运行在不同的机器上。如在storm的工作流中所讨论的,工作集群将无限地运行,直到它被关闭。

2. 在Docker上运行Apache Storm 

Apache Storm是一个实时流计算框架,由Twitter在2014年正式开源,遵循Eclipse Public License 1.0。Storm基于Clojure等语言实现。
Storm集群与Hadoop集群在工作方式上十分相似,唯一区别在于 Hadoop上运行的是MapReduce任务,在Storm上运行的则是topology。MapReduce任务完成处理即会结束,而topology则永远在等待消息并处理(直到被停止)。

2.1 使用Compose搭建Storm集群 

利用Docker Compose模板,用户可以在本地单机Docker环境快速地搭建一个Apache Storm集群,进行应用开发测试。

Storm示例架构 

 其中包含如下容器:

·Zookeeper:Apache Zookeeper三节点部署。
·Nimbus:Storm Nimbus。
·Ui:Storm UI
·Supervisor:Storm Supervisor(一个或多个)。
·Topology:Topology部署工具,其中示例应用基于官方示例storm-starter代码构建。

本地开发测试 

首先从Github下载需要的代码:
$ 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
当UI容器启动后,用户可以访问容器的8080端口来打开操作界面,如图所示。

利用如下命令,可以伸缩supervisor的数量,比如伸缩到3个实例

$ docker-compose scale supervisor=3
用户也许会发现Web界面中并没有运行中的topology。这是因为Docker Compose目前只能保证容器的启动顺序,但是无法确保所依赖容器中的应用已经完全启动并可以被正常访问了。
为了解决这个问题,需要运行下面的命令来再次启动topolgoy服务应用来提交更新的拓扑:
$ docker-compose start topology
稍后刷新Storm UI,可以发现Storm应用已经部署成功了。

 结束语

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_62294245/article/details/127005341

智能推荐

深度可分离卷积(Depthwise Separable Convolution)_深度可分离卷积的优点-程序员宅基地

文章浏览阅读1.3k次。深度可分离卷积(Depthwise Separable Convolution)是一种卷积神经网络中常用的卷积操作,它在减少计算量的同时保持了较好的特征提取能力,因此被广泛用于轻量化的模型设计中。标准卷积使用一个卷积核对输入数据进行卷积,而深度可分离卷积将卷积操作分解为深度卷积和逐点卷积,从而显著减少了参数量。深度卷积只使用一个卷积核对输入通道逐通道进行卷积,逐点卷积使用1x1的卷积核进行通道之间的混合。深度卷积是在输入的每个通道上分别应用卷积核,生成相同数量的通道,然后将这些通道按通道维度进行堆叠。_深度可分离卷积的优点

〖产品思维训练白宝书 - 产品思维认知篇⑩〗- 产品经理 的思维方式对我们有着什么样的启发_管理思维对具体工作的作用-程序员宅基地

文章浏览阅读3.1w次,点赞11次,收藏6次。今天这一章节就来和各位小伙伴聊一聊,"产品经理" 从工作中总结出来的思考问题的角度,尤其是一些思维方式对于我们普通人来说都具有哪些启发。_管理思维对具体工作的作用

【论文Word排版】使用多级列表设置论文序号_序号1.1 1.2怎么排的-程序员宅基地

文章浏览阅读1.4k次。使用多级列表设置论文序号_序号1.1 1.2怎么排的

“自动获取IP地址”和“使用固定IP地址”的区别是什么?_无线网固定ip和自动分配有啥区别-程序员宅基地

文章浏览阅读8.5k次。自动获取IP地址是动态IP,是通过DHCP来获取IP地址,每次上网这个IP都不一样,在IP地址租期满后就有可能会换IP地址了。 使用固定IP地址是静态IP,是自己指定一个IP地址,ISP随时可以到你家查看。手动设置IP地址有个好处,就是一旦设定好后在不更改的情况下IP地址是固定的。 DHCP介绍:DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应..._无线网固定ip和自动分配有啥区别

CSRF跨站点伪造请求攻击——脱库及密码修改_csrf备份拖库-程序员宅基地

文章浏览阅读987次。脱库及密码修改CSRF 快速拖库案例拖库’本来是数据库领域的术语,指从数据库中导出数据。到了黑客攻击泛滥的今天,它被用来指网站遭到入侵后,黑客窃取其数据库。网站数据库被拖,直接导致用户信息泄露,造成的危害很大,比如:CSDN 明文密码泄露事件、小米 800W 用户信息泄露事件等等首先,我们先登录一下 discuz 的后台,模拟管理员进行周期性的数据库备份。(admin) Uce..._csrf备份拖库

java经典50道_50道经典的JAVA编程题(41-45)-程序员宅基地

文章浏览阅读300次。50道经典的JAVA编程题(41-45),苦逼的程序猿,晚上睡不着了编程吧~今天坚持做10道题!发现编程能是我快乐。。。O(∩_∩)O哈哈~能平静我烦乱的心,剩下5道题留到考试完了再做吧!该睡觉了、、、【程序41】 MonkeyPeach.java题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分..._java编程题目小新同学爱睡觉

随便推点

从零开始:C++如何实现Kafka生产者客户端_c++ kafka-程序员宅基地

文章浏览阅读3.6k次,点赞7次,收藏31次。一、Kafka 生产者的逻辑。二、Kafka 的C++ API。三、Kafka 生产者客户端开发。_c++ kafka

导入Unity 3D场景后所有物体变成白色(材质丢失)_unity道具拖进去发白-程序员宅基地

文章浏览阅读1.5w次。Unity 3D在导入场景或者导入某个3D模型时会出现材质丢失的情况。如下图中右侧白色部分:找到材质丢失的物体,在Inspector面板重新添加材质。 That's all ...._unity道具拖进去发白

034CSS3盒子模型大小计算方法_css一个属性盒子模型自动计算-程序员宅基地

文章浏览阅读1.3k次。一、分类CSS3 中可以通过 box-sizing属性 来指定盒子模型大小的计算方法,有2个值:即可指定为 content-box、border-box,这样我们计算盒子大小的方式就发生了改变。可以分成两种情况:1. box-sizing: content-box 盒子大小为 width + padding + border (以前默认的)2. box-sizing: border-box 盒子大小为 width如果盒子模型我们改为了box-sizing: border-box , 那paddi_css一个属性盒子模型自动计算

使用EasyExcel单元格内换行_easyexcel 换行-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏6次。在需要换行的地方String.valueOf((char)10)如有String name= “AAA,BBB,CCC”;不进行换行时,单元格显示的则是:AAABBBCCC。_easyexcel 换行

深度学习(deep learning)发展史_深度学习发展历程-程序员宅基地

文章浏览阅读6.2k次,点赞6次,收藏15次。源 | 小象本文节选自人民邮电出版社最新出版的 AI 圣经《深度学习DEEP LEARNING[1]》。《深度学习DEEP LEARNING[2]》英文版由美国麻省理工学院 MIT 出版社于 2016 年 12 月推出,一经出版就风靡全球。《深度学习DEEP LEARNING[3]》的一大特点是介绍深度学习算法的本质,脱离具体代码实现给出算法背后的逻辑,不写代码的人也完全可以看。由深度学习领域三位_深度学习发展历程

京东搜索项目(elasticsearch)_searchrequest依赖-程序员宅基地

文章浏览阅读937次。环境搭建新建模块es-jd1.添加依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency&g..._searchrequest依赖

推荐文章

热门文章

相关标签