JAVA面试——Storm

简介: JAVA面试——Storm

27.1.1. 概念

Storm 是一个免费并开源的分布式实时计算系统。利用 Storm 可以很容易做到可靠地处理无限的

数据流,像 Hadoop 批量处理大数据一样,Storm 可以实时处理数据。

27.1.1. 集群架构

image.png

27.1.1.1. Nimbusmaster-代码分发给 Supervisor

Storm 集群的 Master 节点,负责分发用户代码,指派给具体的 Supervisor 节点上的 Worker 节

点,去运行 Topology 对应的组件(Spout/Bolt)的 Task。

27.1.1.2. Supervisorslave-管理 Worker 进程的启动和终止

Storm 集群的从节点,负责管理运行在 Supervisor 节点上的每一个 Worker 进程的启动和终止。

通过 Storm 的配置文件中的 supervisor.slots.ports 配置项,可以指定在一个 Supervisor 上最大

允许多少个 Slot,每个 Slot 通过端口号来唯一标识,一个端口号对应一个 Worker 进程(如果该

Worker 进程被启动)。

27.1.1.3. Worker具体处理组件逻辑的进程

运行具体处理组件逻辑的进程。Worker 运行的任务类型只有两种,一种是 Spout 任务,一种是

Bolt 任务。13/01/2022

Page 270 of 283

27.1.1.4. Task

worker中每一个spout/bolt的线程称为一个task. 在storm0.8 之后,task不再与物理线程对应,

不同 spout/bolt 的 task 可能会共享一个物理线程,该线程称为 executor。

27.1.1.5. ZooKeeper

用来协调 Nimbus 和 Supervisor,如果 Supervisor 因故障出现问题而无法运行 Topology,

Nimbus 会第一时间感知到,并重新分配 Topology 到其它可用的 Supervisor 上运行

27.1.2. 编程模型(spout->tuple->bolt

strom 在运行中可分为 spout 与 bolt 两个组件,其中,数据源从 spout 开始,数据以 tuple 的方

式发送到 bolt,多个 bolt 可以串连起来,一个 bolt 也可以接入多个 spot/bolt.运行时原理如下图:

image.png

27.1.2.1. Topology

Storm 中运行的一个实时应用程序的名称。将 Spout、 Bolt 整合起来的拓扑图。定义了 Spout 和

Bolt 的结合关系、并发数量、配置等等。

27.1.2.2. Spout

在一个 topology 中获取源数据流的组件。通常情况下 spout 会从外部数据源中读取数据,然后转

换为 topology 内部的源数据。

27.1.2.3. Bolt

接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。

27.1.2.4. Tuple

一次消息传递的基本单元,理解为一组消息就是一个 Tuple。13/01/2022

Page 271 of 283

27.1.2.5. Stream

Tuple 的集合。表示数据的流向。

27.1.3. Topology 运行

在 Storm 中,一个实时应用的计算任务被打包作为 Topology 发布,这同 Hadoop MapReduce

任务相似。但是有一点不同的是:在 Hadoop 中,MapReduce 任务最终会执行完成后结束;而在

Storm 中,Topology 任务一旦提交后永远不会结束,除非你显示去停止任务。计算任务

Topology 是由不同的 Spouts 和 Bolts,通过数据流(Stream)连接起来的图。一个 Storm 在集

群上运行一个 Topology 时,主要通过以下 3 个实体来完成 Topology 的执行工作:

(1). Worker(进程)

(2). Executor(线程)

(3). Task

image.png

27.1.3.1. Worker(1 个 worker 进程执行的是 1 个 topology 的子集)

1 个 worker 进程执行的是 1 个 topology 的子集(注:不会出现 1 个 worker 为多个 topology

服务)。1 个 worker 进程会启动 1 个或多个 executor 线程来执行 1 个 topology 的

component(spout 或 bolt)。因此,1 个运行中的 topology 就是由集群中多台物理机上的多个

worker 进程组成的。

27.1.3.2. Executor(executor 是 1 个被 worker 进程启动的单独线程)

executor 是 1 个被 worker 进程启动的单独线程。每个 executor 只会运行 1 个 topology 的 1 个

component(spout 或 bolt)的 task(注:task 可以是 1 个或多个,storm 默认是 1 个

component 只生成 1 个 task,executor 线程里会在每次循环里顺序调用所有 task 实例)。13/01/2022

Page 272 of 283

27.1.3.3. Task(最终运行 spout 或 bolt 中代码的单元)

是最终运行 spout 或 bolt 中代码的单元(注:1 个 task 即为 spout 或 bolt 的 1 个实例,

executor 线程在执行期间会调用该 task 的 nextTuple 或 execute 方法)。topology 启动后,1

个 component(spout 或 bolt)的 task 数目是固定不变的,但该 component 使用的 executor 线

程数可以动态调整(例如:1 个 executor 线程可以执行该 component 的 1 个或多个 task 实

例)。这意味着,对于 1 个 component 存在这样的条件:#threads<=#tasks(即:线程数小于

等于 task 数目)。默认情况下 task 的数目等于 executor 线程数目,即 1 个 executor 线程只运

行 1 个 task


image.png

27.1.4. Storm Streaming Grouping

Storm 中最重要的抽象,应该就是 Stream grouping 了,它能够控制 Spot/Bolt 对应的 Task 以

什么样的方式来分发 Tuple,将 Tuple 发射到目的 Spot/Bolt 对应的 Task.

image.png

目前,Storm Streaming Grouping 支持如下几种类型:

27.1.4.1. huffle Grouping

随机分组,尽量均匀分布到下游 Bolt 中将流分组定义为混排。这种混排分组意味着来自 Spout 的

输入将混排,或随机分发给此 Bolt 中的任务。shuffle grouping 对各个 task 的 tuple 分配的比

较均匀。

27.1.4.2. Fields Grouping

按字段分组,按数据中 field 值进行分组;相同 field 值的 Tuple 被发送到相同的 Task 这种

grouping 机制保证相同 field 值的 tuple 会去同一个 task。

27.1.4.3. All grouping :广播

广播发送, 对于每一个 tuple 将会复制到每一个 bolt 中处理。13/01/2022

Page 274 of 283

27.1.4.4. Global grouping

全局分组,Tuple 被分配到一个 Bolt 中的一个 Task,实现事务性的 Topology。Stream 中的所

有的 tuple 都会发送给同一个 bolt 任务处理,所有的 tuple 将会发送给拥有最小 task_id 的 bolt

任务处理。

27.1.4.5. None grouping :不分组

不关注并行处理负载均衡策略时使用该方式,目前等同于 shuffle grouping,另外 storm 将会把

bolt 任务和他的上游提供数据的任务安排在同一个线程下。

27.1.4.6. Direct grouping :直接分组 指定分组

由 tuple 的发射单元直接决定 tuple 将发射给那个 bolt,一般情况下是由接收 tuple 的 bolt 决定

接收哪个 bolt 发射的 Tuple。这是一种比较特别的分组方法,用这种分组意味着消息的发送者指

定由消息接收者的哪个 task 处理这个消息。 只有被声明为 Direct Stream 的消息流可以声明这种

分组方法。而且这种消息 tuple 必须使用 emitDirect 方法来发射。消息处理者可以通过

TopologyContext 来获取处理它的消息的 taskid (OutputCollector.emit 方法也会返回

taskid)。

目录
相关文章
|
4月前
|
Java 测试技术 微服务
最新技术栈下 Java 面试高频技术点实操指南详解
本指南结合最新Java技术趋势,涵盖微服务(Spring Cloud Alibaba)、响应式编程(Spring WebFlux)、容器化部署(Docker+Kubernetes)、函数式编程、性能优化及测试等核心领域。通过具体实现步骤与示例代码,深入讲解服务注册发现、配置中心、熔断限流、响应式数据库访问、JVM调优等内容。适合备战Java面试,提升实操能力,助力技术进阶。资源链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
173 25
|
4月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
210 1
|
4月前
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
233 3
|
3月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
341 0
|
4月前
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
1592 48
|
4月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
120 5
|
4月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
166 5
|
4月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
214 6
|
4月前
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
242 9
|
4月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
207 1

热门文章

最新文章