推荐答案
在 Apache Storm 中,并行度是通过配置拓扑中的组件(如 Spout 和 Bolt)的并发度来实现的。并行度的配置可以通过以下步骤完成:
设置 Spout 或 Bolt 的并发度: 在定义拓扑时,可以通过
setSpout
或setBolt
方法的最后一个参数来指定并发度。例如:TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("spout", new MySpout(), 2); // 设置 Spout 的并发度为 2 builder.setBolt("bolt", new MyBolt(), 4).shuffleGrouping("spout"); // 设置 Bolt 的并发度为 4
配置 Worker 数量: 在提交拓扑时,可以通过
Config
对象设置 Worker 的数量。例如:Config config = new Config(); config.setNumWorkers(3); // 设置 Worker 数量为 3 StormSubmitter.submitTopology("my-topology", config, builder.createTopology());
调整 Task 数量: 如果需要进一步调整 Task 的数量,可以通过
setNumTasks
方法来设置。例如:builder.setBolt("bolt", new MyBolt(), 4).setNumTasks(8).shuffleGrouping("spout");
本题详细解读
1. 并发度(Parallelism)
并发度是指在拓扑中每个组件(Spout 或 Bolt)的实例数量。并发度决定了该组件在集群中并行执行的任务数。例如,如果一个 Bolt 的并发度设置为 4,那么 Storm 会为该 Bolt 创建 4 个任务实例,这些实例会并行处理数据。
2. Worker 数量
Worker 是 Storm 集群中的工作进程,每个 Worker 可以运行多个任务。通过设置 Worker 的数量,可以控制拓扑在集群中使用的资源。例如,如果设置 Worker 数量为 3,那么 Storm 会为该拓扑分配 3 个 Worker 进程。
3. Task 数量
Task 是 Storm 中实际执行任务的单位。每个 Bolt 或 Spout 可以有多个 Task,这些 Task 会在 Worker 中并行执行。通常情况下,Task 的数量与并发度相同,但可以通过 setNumTasks
方法显式设置 Task 的数量。例如,如果一个 Bolt 的并发度为 4,但 Task 数量设置为 8,那么每个并发实例会运行 2 个 Task。
4. 配置示例
以下是一个完整的配置示例:
TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("spout", new MySpout(), 2); // Spout 并发度为 2 builder.setBolt("bolt", new MyBolt(), 4).setNumTasks(8).shuffleGrouping("spout"); // Bolt 并发度为 4,Task 数量为 8 Config config = new Config(); config.setNumWorkers(3); // 设置 Worker 数量为 3 StormSubmitter.submitTopology("my-topology", config, builder.createTopology());
在这个示例中,Spout 的并发度为 2,Bolt 的并发度为 4,但 Bolt 的 Task 数量为 8,这意味着每个 Bolt 实例会运行 2 个 Task。整个拓扑会使用 3 个 Worker 进程来执行。