作为一名专注于大数据与实时计算技术的博主,我深知Apache Storm作为一款强大的实时流处理框架,在现代数据栈中所扮演的重要角色。...本篇博客将结合我个人的面试经历,深入剖析Storm的核心原理与典型应用场景,分享面试必备知识点,并通过代码示例进一步加深理解,助您在求职过程中得心应手地应对与Storm相关的技术考察。...一、面试经验分享在与Storm相关的面试中,我发现以下几个主题是面试官最常关注的:Storm架构与核心概念:能否清晰描述Storm的架构,包括Spout、Bolt、Topology等核心概念?...Storm部署与运维在本地通过LocalCluster启动Topology进行调试。在集群环境中,需部署Nimbus、Supervisor节点,通过storm jar命令提交Topology。...使用高效的序列化方式:如Protocol Buffers、Avro替代Java默认序列化,降低网络传输与存储成本。
Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理,而且处理速度很快(在一个小集群中,每个结点每秒可以处理数以百万计的消息)。 ...prepare方法中进行 原因: * Storm在工作时会将所有的bolt和spout组件先进行序列化,然后发送到集群中, * 如果在序列化之前创建过任何无法序列化的对象都会造成序列化时抛出.../本地模式是开发和测试的简单方式,省去了在分布式集群中反复部署的开销 //另外可以执行断点调试非常的便捷 LocalCluster cluster = new LocalCluster();...(); } } 四、并发机制 1、并发级别 Storm集群中的topology在如下的四个级别中存在并发: 1.Nodes 服务器:配置在Storm集群中的一个服务器,会执行Topology...除此之外Storm集群还需要一个ZooKeeper的来进行集群协调。 2、nimbus nimbus守护进程主要的责任是管理、协调和监控在集群上运行的topology。
(10) Task:每一个Spout和Bolt都会被当做很多task在整个集群里面运行,每一个task就是一个Spout或Bolt的实例,且对应到一个Executor线程。.../bolt实例) task(对应spout/bolt实例) 结构 ---- 组件结构 (1) 集群组件分布结构 (2) 节点内部组件关系 Nimbus(发布序列化任务实例) - Supervisor...关于spout/bolt的生命周期,一般来说spout/bolt的生命周期如下: (1) 在提交了一个topology之后(在nimbus所在的机器),创建spout/bolt实例并进行序列化; (2)...将序列化的component发送给所有的任务所在的机器; (3) 在每一个任务上反序列化component; (4) 在开始执行任务之前,先执行component的初始化方法(spout是open,bolt...箭头3表示Supervisor在ZooKeeper中创建的路径是/storm/supervisors/。新节点加人时,会在该路径下创建一个节点。
Storm集群执行。...Topology里面的每个处理组件(Spout或Bolt)都包含处理逻辑, 而组件之间的连接则表示数据流动的方向。 27.Storm集群中的Master节点和Work节点各自运行什么后台进程?...Storm集群采用“Master—Worker”的节点方式: Master节点运行名为“Nimbus”的后台程序(类似Hadoop中的“JobTracker”),负责在集群范围内分发代码、为Worker...进程进行Task的处理 说明:在提交了一个Topology之后,Storm就会创建Spout/Bolt实例并进行序列化。...之后,将序列化的组件发送给所有的任务所在的机器(即Supervisor节点),在每一个任务上反序列化组件
(1)Topologies 拓扑 解释: 拓扑类似一个集装箱,所有的货物都会存储在集装箱里面最后被托运走,storm里面所有的代码和文件最终会被打包在一个拓扑中,然后提交在storm集群中运行,类似于...Serialization:动态tuple类型和声明自定义序列化 (3)Spouts (喷嘴比喻数据源) 一个spout是由流组成的数据源在storm的拓扑里,通常情况下会读取外部的数据源 然后emit...grouping 在grouping中stream通过字段进行分区分发,比如按照userid分组,那么storm能保证在同一个task中收到的userid是一样的,但是在不同的task中,他们的userid...task都会收到此分组下的消息 (5.5)Global grouping 所有的stream都会发射到多个bolt task中的其中一个 (5.6)None grouping 等同于Shuffle...spout和bolt会执行多个task横跨整个集群,每个task会在一个线程中执行 stream grouping定义了每个task送到到那个下游的task中,在使用TopologyBuilder时,可通过
Storm 中的 tuple可以包含任何类型的对象。由于Storm 是一个分布式系统,所以在不同的任务之间传递消息时Storm必须知道怎样序列化、反序列化消息对象。 ...它需要一个注册的列表,每个注册项可以采取两种形式: 1:类名注册,在这种情况下,Storm将使用Kryo的FieldsSerializer来序列化该类。...,如果这个对象无法被Java序列化器序列化,Storm 就会抛出异常。 ...补充:上面的所有一切,在本地运行以及部署到集群时,work数量设置为1时,都不会生效的。因为同一个对象公有一个内存,不会涉及网络传输的,也就不需要序列化和反序列化。...恰巧的时,初级工程师本地模式和准生产测试时,topology的work的数量都为1,导致对象在bolt和bolt节点传输时并没有走序列化方式,结果测试一切正常,但是上生产后,因为work数量是10个,立马在后一个
接下来,我就以 Storm 这个开源的流计算框架为例,通过介绍 Storm 的工作原理,以加深你对流计算模式的进一步理解,进而帮助你将其运用到实际业务中。...下面我们一起看一下。 如果所有数据和信息均存储在 Master Node 上,Master Node 故障后,会导致整个集群信息丢失,因此引入了 ZooKeeper 集群来加强可靠性。...Worker 提供了两个组件 Spout 和 Bolt,分别进行数据读取和任务执行。 在详细介绍 Worker 组件之前,我首先介绍一下 Storm 的核心抽象:数据流。...在实际运用中,可以根据计算要求,选择不同的计算模式。我将这两种计算模式的特点,总结为了一张表格,以帮助你理解、记忆,以及选择适合自己业务场景的计算模式。 ?...然后,我以流计算开源框架中的 Storm 为例,与你讲述了 Storm 的核心组件以及通过 Spout 和 Bolt 构建有向无环图代表流计算逻辑,以实现流计算,以加深你对流计算原理的理解。
S4和Storm之间的关键差别是Storm在故障的情况下可以保证消息的处理,而S4可能会丢消息。 Hadoop无疑是大数据分析的王者,本质上是一个批量处理系统,它专注于大数据的批量处理。...资源 TopologyBuilder: 使用这个类来在Java中创建拓扑 在生产集群中运行拓扑 本地模式: 通过阅读这篇可以学习到如何在本地模式下进行拓扑的开发和测试 元组(Tuple) 元组是Storm...保证消息处理: 任务(Tasks) 每个Spout和Bolt会以多个任务(Task)的形式在集群上运行。...topology提交过程 一个topology的提交过程: 非本地模式下,客户端通过thrift调用nimbus接口,来上传代码到nimbus并触发提交操作. nimbus进行任务分配,并将信息同步到zookeeper...2014年9月,在Andy Feng的帮助下,Nathan向Apache提交了Storm孵化申请。
Storm完整地解决了这些问题。它是为分布式场景而生的,抽象了消息传递,会自动地在集群机器上并发地处理流式计算,让你专注于实时处理的业务逻辑。...S4和Storm之间的关键差别是Storm在故障的情况下可以保证消息的处理,而S4可能会丢消息。 Hadoop无疑是大数据分析的王者,本质上是一个批量处理系统,它专注于大数据的批量处理。...数据存储在Hadoop 文件系统里(HDFS)并在处理的时候分发到集群中的各个节点。当处理完成,产出的数据放回到HDFS上。在Storm上构建的拓扑处理的是持续不断的流式数据。...资源 TopologyBuilder: 使用这个类来在Java中创建拓扑 在生产集群中运行拓扑 本地模式: 通过阅读这篇可以学习到如何在本地模式下进行拓扑的开发和测试 元组(Tuple) 元组是Storm...资源 这是Bolt的通用接口 很方便的Bolt接口,用于定义做过滤或者简单处理的Bolt Bolt通过这个类的实例来吐元组给输出流 任物 每个Spout和Bolt会以多个任务(Task)的形式在集群上运行
Storm集群的输入流由一个被称作spout的组件管理,spout把数据传递给bolt, bolt要么把数据保存到某种存储器,要么把数据传递给其它的bolt。...你可以想象一下,一个Storm集群就是在一连串的bolt之间转换spout传过来的数据。 这里用一个简单的例子来说明这个概念。昨晚我在新闻节目里看到主持人在谈论政治人物和他们对于各种政治话题的立场。...现在想象一下,很容易在整个Storm集群定义每个bolt 和spout的并行性级别,因此你可以无限的扩展你的拓扑结构。很神奇,是吗?尽管这是个简单例子,你也可以看到Storm的强大。...运行Topology storm的运行有两种模式: 本地模式和分布式模式. 1) 本地模式: storm用一个进程里面的线程来模拟所有的spout和bolt....(虽然这只是一个例子,但是通常情况下,当拓扑关闭时,你应当使用cleanup()方法关闭活动的连接和其它资源。) 主类 你可以在主类中创建拓扑和一个本地集群对象,以便于在本地测试和调试。
在 Nimbus 上提交 Topology 后,创建出来的 IBolt 在序列化后被发送到具体执行的 Worker 上。...如果要参数化 IBolt 对象,需要通过构造函数来设置参数,并将参数保存在实例变量中(然后将其序列化并传送到跨集群执行的每个任务上)。...stormConf 为 Bolt 提供配置,并与集群提供的配置进行合并。context 用来获取有关此任务在拓扑中的位置信息,包括此任务的任务ID和组件ID,输入和输出信息等。...否则,Storm 无法确定从 Spout 发送的元组什么时候完成: void execute(Tuple input); 当停掉 Bolt 实例时会调用如下方法,但是不保证一定会调用该方法: void...实现(不)可靠性消息传递 下面我们看一下如何使用上面的 Bolt 来实现(不)可靠性消息传递。
下面我们就来介绍一下不同的实时流处理系统采用的反压机制: 1.Strom 反压机制 1.1 Storm 1.0 以前的反压机制 对于开启了acker机制的storm程序,可以通过设置conf.setMaxSpoutPending...Automatic Backpressure 新的storm自动反压机制(Automatic Back Pressure)通过监控bolt中的接收队列的情况,当超过高水位值时专门的线程会将反压信息写到...此外,在Netty层也做了一级反压,由于每个Worker Task都有自己的发送和接收的缓冲区,可以对缓冲区设定限额、控制大小,如果spout数据量特别大,缓冲区填满会导致下游bolt的接收缓冲区填满,...当一个内存块被消费完成之后(在输入端是指内存块中的字节被反序列化成对象了,在输出端是指内存块中的字节写入到 Netty Channel 了),会调用 Buffer.recycle() 方法,会将内存块还给...5.4 Flink 反压监控 在 Storm/JStorm 中,只要监控到队列满了,就可以记录下拓扑进入反压了。但是 Flink 的反压太过于天然了,导致我们无法简单地通过监控队列来监控反压状态。
、支持本地模式、高效。...典型的 Storm 拓扑结构会实现多个转换,因此需要多个具有独立元组流的Bolt。Bolt和Spout都实现为Linux系统中的一个或多个任务。...特别是在修改storm.yaml文件时,我深刻体会到了配置文件对于系统运行的重要性,任何一个小的错误都可能导致系统无法正常运行。 ...在实验过程中,我与同学们相互讨论、互相帮助,共同解决了许多难题。这种团队协作的精神不仅提高了我们的实验效率,也让我们在相互学习中不断成长。 总的来说,这次实验让我受益匪浅。...我不仅掌握了Storm集群的部署方法,还加深了对Storm架构和原理的理解。我相信这些知识和技能将对我未来的学习和工作产生积极的影响。
我推荐你们下载这个项目的代码并且跟着教程一起做。先读一下:配置storm开发环境和新建一个strom项目这两篇文章把你的机器设置好。...2、一个Storm集群的基本组件 storm的集群表面上看和hadoop的集群非常像。但是在Hadoop上面你运行的是MapReduce的Job, 而在Storm上面你运行的是Topology。...每个tuple是一堆值,每个值有一个名字,并且每个值可以是任何类型, 在我的理解里面一个tuple可以看作一个没有方法的java对象。...storm的运行有两种模式: 本地模式和分布式模式. 在本地模式中, storm用一个进程里面的线程来模拟所有的spout和bolt. 本地模式对开发和测试来说比较有用。...你运行storm-starter里面的topology的时候它们就是以本地模式运行的, 你可以看到topology里面的每一个组件在发射什么消息。 在分布式模式下, storm由一堆机器组成。
核心概念介绍 Nimbus:负责在集群里面发送代码,分配工作给机器,并且监控状态。全局只有一个。相当于master的角色。...Storm如何存储数据 严格来讲,Storm中设计的组建,没有专门存储数据的,一般情况下,会借助第三方的存储,例如mysql、Nosql等,Bolt的节点,可以用于存储计算的中间结果或者最终结果。...Spout和Bolt为啥需要实现序列化 这两个核心的接口,都实现了序列化,在开发web类系统的时候,一般接口或者操作类,是没有必要实现序列化接口的,这里为啥需要呢。...深入理解一些Storm的机制,一个topology程序提交到集群,是先提交到Nimbus的,然后由其进行分发,分发是跨进程的,到了另外一个进程中,是需要反序列化出来这个处理类的。...,测试难度比较大 1、验证数据,截取特定时间点的分析结果数据快照,然后利用这些时间在离线的分析集群里面对照写分析逻辑,看结果是否一致; 2、验证数据分析处理逻辑,中间的Bolt阶段,涉及到数据的加工分析以及过滤
在这种情况下,Storm会在Spout发射一个Tuple之后马上调用Spout的ack方法,也就是说这个Tuple树不会被跟踪。 ACK机制的几个缺点 1....答:这个时候storm的原生api是无法支持这种事务性操作,我们可以使用storm提供的高级api-trident来做到。...(4) 序列化 所有spout,bolt,configuration,发送的消息(Tuple)都必须实现Serializable,否则就会出现序列化错误。...IBolt被序列化到拓扑中,并提交给集群的主节点(Nimbus),然后Nimbus启动worker进程,worker进程反序列化Bolt对象,然后调用其prepare方法。...并且可序列化,在进程间传递。
在storm0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。...(一个Bolt类会在集群里面很多机器上并发执行) (Spouts ,Bolts 可以理解为storm中的两个组件) tuple:消息元组(是在Spouts ,Bolts中传递数据的一种封装的格式) Streams...Storm中的Tasks 每一个spout和bolt会被当作很多task在整个集群里执行;每一个executor对应到一个线程,在这个线程上运行多个task;stream grouping则是定义怎么从一堆...在默认的情况下,tuple的字段类型可以是:integer,long,short, byte,string,double,float,boolean和byte array;可以自定义类型(只要实现相应的序列化器...数据从一个节点传到另一个节点,数据是要被序列化的,但在storm中,数据序列化之前,消息必须按照一定的格式传递,这个格式就是一个一个的消息元组。
HDFS 在非 HA 模式的集群下,NameNode 和 DataNode 是一个主从的架构。在这样的主从架构之下只有一台 NameNode。...为了解决单台 NameNode 挂掉不可用的问题,HDFS 在 2.x 版本的时候引入了 HDFS 集群的 HA 模式,也就是有了 NameNode 的主备架构。...一、HDFS 两个 NN 同步哪些数据 在 HDFS 非 HA 模式的集群下,只有一个 NameNode,而在 HDFS 的 HA 模式集群下,存在两个 NameNode,一个是活动的...那么问题来了,在 HA 模式下引入 Standby 节点的 NameNode 本身是要提高集群的可用性,但是由于它的延迟、故障等又影响了正常节点的可用性。...四、HDFS HA 模式架构图 HDFS HA 模式集群的架构图如下所示。 在上图中,蓝色部分是用于故障自动切换的,除蓝色部分外,则是 HDFS HA 模式的集群。
在这种情况下这个stream会分配个值为‘default’默认的id 。 Storm提供的最基本的处理stream的原语是spout和bolt。...Spout的实现 Spout以日志文件和XML描述文件作为接收对象。XML文件包含了与日志一致的设计模式。不妨设想一下一个示例日志文件,包含了车辆的车牌号、行驶速度、以及数据的捕获位置。...下面就来看一下执行步骤。 在本地集群上运行和测试topology 通过TopologyBuilder建立topology。 使用Storm Submitter,将topology递交给集群。...五、Storm的动态增删节点 我在storm和s4里比较里谈到的动态增删节点,是指storm可以动态地添加和减少supervisor节点。...因此我在storm的邮件列表里提了这个问题,storm的开发者nathanmarz创建了一个issue 54并在0.6.1提供了rebalance命令来让正在运行的topology重新负载均衡,具体见:
领取专属 10元无门槛券
手把手带您无忧上云