推荐答案
在 Apache Storm 中,拓扑的配置主要通过 Config
对象来完成。以下是一些常见的配置项:
- TOPOLOGY_WORKERS:设置拓扑中使用的 worker 进程数量。
- TOPOLOGY_DEBUG:启用或禁用调试模式。
- TOPOLOGY_MAX_SPOUT_PENDING:设置每个 spout 可以同时处理的最大 tuple 数量。
- TOPOLOGY_MESSAGE_TIMEOUT_SECS:设置 tuple 的超时时间。
- TOPOLOGY_SERIALIZATIONS:注册自定义的序列化器。
- TOPOLOGY_MAX_TASK_PARALLELISM:设置拓扑中每个组件的最大并行度。
- TOPOLOGY_STATS_SAMPLE_RATE:设置统计信息的采样率。
- TOPOLOGY_FALL_BACK_ON_JAVA_SERIALIZATION:是否回退到 Java 序列化。
- TOPOLOGY_SKIP_MISSING_KRYO_REGISTRATIONS:是否跳过缺失的 Kryo 注册。
- TOPOLOGY_TICK_TUPLE_FREQ_SECS:设置 tick tuple 的频率。
本题详细解读
1. TOPOLOGY_WORKERS
TOPOLOGY_WORKERS
用于设置拓扑中使用的 worker 进程数量。每个 worker 进程可以运行多个 executor 线程。增加 worker 数量可以提高拓扑的并行度和吞吐量。
Config config = new Config(); config.setNumWorkers(3);
2. TOPOLOGY_DEBUG
TOPOLOGY_DEBUG
用于启用或禁用调试模式。在调试模式下,Storm 会记录更多的日志信息,便于排查问题。
config.setDebug(true);
3. TOPOLOGY_MAX_SPOUT_PENDING
TOPOLOGY_MAX_SPOUT_PENDING
用于设置每个 spout 可以同时处理的最大 tuple 数量。超过这个数量后,spout 将停止发送新的 tuple,直到部分 tuple 被 ack 或 fail。
config.setMaxSpoutPending(1000);
4. TOPOLOGY_MESSAGE_TIMEOUT_SECS
TOPOLOGY_MESSAGE_TIMEOUT_SECS
用于设置 tuple 的超时时间。如果 tuple 在超时时间内未被 ack 或 fail,Storm 会认为该 tuple 处理失败。
config.setMessageTimeoutSecs(30);
5. TOPOLOGY_SERIALIZATIONS
TOPOLOGY_SERIALIZATIONS
用于注册自定义的序列化器。Storm 默认使用 Kryo 进行序列化,但可以通过此配置项注册自定义的序列化器。
config.registerSerialization(MyCustomClass.class, MyCustomSerializer.class);
6. TOPOLOGY_MAX_TASK_PARALLELISM
TOPOLOGY_MAX_TASK_PARALLELISM
用于设置拓扑中每个组件的最大并行度。这个配置项可以限制组件的并行度,防止资源过度消耗。
config.setMaxTaskParallelism(10);
7. TOPOLOGY_STATS_SAMPLE_RATE
TOPOLOGY_STATS_SAMPLE_RATE
用于设置统计信息的采样率。采样率越高,统计信息越精确,但也会增加系统开销。
config.setStatsSampleRate(0.05);
8. TOPOLOGY_FALL_BACK_ON_JAVA_SERIALIZATION
TOPOLOGY_FALL_BACK_ON_JAVA_SERIALIZATION
用于设置是否回退到 Java 序列化。当 Kryo 序列化失败时,可以尝试使用 Java 序列化。
config.setFallBackOnJavaSerialization(true);
9. TOPOLOGY_SKIP_MISSING_KRYO_REGISTRATIONS
TOPOLOGY_SKIP_MISSING_KRYO_REGISTRATIONS
用于设置是否跳过缺失的 Kryo 注册。如果设置为 true,Storm 会跳过未注册的类,而不是抛出异常。
config.setSkipMissingKryoRegistrations(true);
10. TOPOLOGY_TICK_TUPLE_FREQ_SECS
TOPOLOGY_TICK_TUPLE_FREQ_SECS
用于设置 tick tuple 的频率。tick tuple 是一种特殊的 tuple,用于触发定时任务。
config.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 10);