storm-并行度

本文介绍了Apache Storm中拓扑的运行机制,包括worker进程、执行器和任务的基本概念及配置方式。阐述了如何通过调整这些组件的数量来优化并行处理性能。

什么让 topology(拓扑)可以运行

worker 进程, executors(执行器)和 tasks(任务)。

一个 worker 进程 执行一个 topology(拓扑)的子集. 一个 worker 进程属于一个指定 topology(拓扑)。
并且针对该 topology 的一个或多个组件(spouts 或 bolts)来说会运行一个或更多的 executors(执行器)。
一个正在运行的 topology 由许多这样的进程组成, 它们运行在 Storm 集群的多个机器上.
一个 executor(执行器) 是一个线程, 它是由 worker 进程产生的. 它可能针对相同的组件(spout 或 blot)运行一个或多个 tasks(任务)。默认为一个线程运行一个任务。
一个 task 执行实际的数据处理 - 在您代码中实现的每个 spout 或 bolt 在整个集群上都执行了许多的 taskk(任务)。
 组件的 task(任务)数量在 topology(拓扑)的整个生命周期中总是相同的, 但组件的 executors(线程)数量可能会随时间而变化.
 这意味着以下条件成立: #threads ≤ #tasks. 默认情况下, 默认情况下,tasks(任务)数量与 executors(执行器)设置成一样, 例如. Storm 在每个线程上运行一个 task(任务).
 

配置 topology 的 parallelism(并行度)

worker 进程的数量

描述: 在集群的机器中有多少个 worker 进程来 针对 topology 以创建它.
配置选项: TOPOLOGY_WORKERS
如何在代码中设置(示例):Config#setNumWorkers


executors (线程)的数量


描述: 每个 component(组件) 产生多少个 executors(执行器).
配置选项: None (传递 parallelism_hint 参数到 setSpout 或 setBolt)
如何在代码中设置(示例):
        TopologyBuilder#setSpout("id",spout,parallelism_hint)
        TopologyBuilder#setBolt("id",bolt,parallelism_hint)
参数现在指定了 bolt 的 executors(执行器)的初始化数量(不是 tasks).

tasks(任务)的数量

描述: per component 有多少个 tasks(任务)来创建他们.
 配置选项: TOPOLOGY_TASKS
如何在代码中设置(示例):
        ComponentConfigurationDeclarer#setNumTasks()

以下是在练习中显示这些设置的示例代码片段:

topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
               .setNumTasks(4)
               .shuffleGrouping("blue-spout");

在上面的代码中,我们配置 了Storm 来运行 Bolt "GreenBolt", 其初始数量为两个 executor(执行器)和四个相关联的 tasks(任务). Storm 的每个 executor(线程)将会运行两个 tasks(任务). 如果您不显示的配置 tasks 的数量, Storm 将使用每个 executor 一个 task 的默认配置来运行它们.
<think>好的,用户的问题是关于如何使用storm-net-adapter 2.2.1创建Bolt的示例代码和配置教程。首先,我需要回忆一下Apache Storm的基础知识,因为Bolt是Storm中的基本组件之一,负责处理数据流。Storm-net-adapter可能是一个特定的库或工具,用于简化Storm组件的开发或提供额外的功能。 用户提到的版本是2.2.1,我需要确认这个版本是否与特定的Storm版本兼容。Storm在2.x版本之后有一些变化,可能需要调整配置或依赖。不过,用户的问题主要集中在创建Bolt的方法上,所以可能不需要深入讨论版本兼容性,但最好在回答中提到版本兼容性的注意事项。 接下来,我需要查找storm-net-adapter的相关文档或示例代码。假设这个库是一个帮助开发者更容易创建Storm组件的适配器,可能提供了一些基类或工具方法。例如,可能有一个BaseBolt类需要继承,并实现特定的方法,如execute方法。 在创建Bolt时,通常需要定义其处理逻辑,声明输出的字段,并配置拓扑结构。示例代码可能包括如何定义Bolt类、如何声明输出流、如何处理传入的元组,以及如何在拓扑中组装Bolt和Spout。 配置方面,用户可能需要添加Maven依赖或Gradle依赖,配置Storm的集群设置,或者调整并行度参数。需要详细说明这些配置步骤,确保用户能够正确设置项目环境。 另外,用户可能希望了解如何测试Bolt,比如使用本地模式运行拓扑,或者如何部署到生产集群。这些也是配置教程的一部分,应该包含在回答中。 可能还需要考虑异常处理、日志记录以及性能优化等方面的内容,但根据用户的问题,主要关注点可能在基础创建和配置步骤。不过,生成的相关问题可以引导用户进一步探索这些高级主题。 需要确保提供的代码示例正确,语法无误,并且符合Storm-net-adapter 2.2.1的API。如果storm-net-adapter有特定的注解或方法,必须准确反映在示例中。例如,可能使用@Bolt注解来标记Bolt类,或者使用特定的上下文方法注册Bolt。 最后,要检查是否有常见的错误或陷阱需要避免,比如依赖版本冲突,配置参数错误等,并在教程中给出提示或解决方案。</think># 使用 storm-net-adapter 2.2.1 创建 Bolt 的完整教程 ## 环境准备 1. 添加 Maven 依赖: ```xml <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-core</artifactId> <version>2.2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.storm.net.adapter</groupId> <artifactId>storm-net-adapter</artifactId> <version>2.2.1</version> </dependency> ``` ## Bolt 实现步骤 ### 1. 基础Bolt类定义 ```java import org.apache.storm.topology.BasicOutputCollector; import org.apache.storm.topology.OutputFieldsDeclarer; import org.apache.storm.topology.base.BaseBasicBolt; import org.apache.storm.tuple.Tuple; public class DataProcessorBolt extends BaseBasicBolt { @Override public void execute(Tuple tuple, BasicOutputCollector collector) { String input = tuple.getString(0); String processed = input.toUpperCase(); collector.emit(new Values(processed)); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("processed_data")); } } ``` ### 2. 使用适配器配置 ```java import com.storm.net.adapter.config.BoltConfigurer; public class BoltConfiguration { public static void configure() { BoltConfigurer.configure() .withParallelism(3) .withStreamTimeout(5000) .withRetryPolicy(2, 1000); } } ``` ## 拓扑集成 ```java TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("data-spout", new DataSpout(), 1); builder.setBolt("processor-bolt", new DataProcessorBolt(), BoltConfiguration.configure() ).shuffleGrouping("data-spout"); ``` ## 配置文件示例 ```yaml storm.net.adapter: bolt: max.pending: 100 buffer.size: 512 metrics.enabled: true network: max.retries: 3 connect.timeout: 5000 ``` ## 运行验证 使用本地模式测试: ```java LocalCluster cluster = new LocalCluster(); cluster.submitTopology("data-processing", new Config(), builder.createTopology() ); Thread.sleep(30000); cluster.shutdown(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值