📜  Apache Storm-工作流程(1)

📅  最后修改于: 2023-12-03 15:13:26.500000             🧑  作者: Mango

Apache Storm-工作流程

Apache Storm是一个分布式实时计算系统,它可以将大规模的数据分割成小的任务进行处理,该系统具有高性能、可伸缩性、容错性强等特点。下面介绍其工作流程。

1. 数据模型

Storm的数据模型基于流(Stream)的概念,一个流是由元组(Tuple)组成的数据集合。每个元组包含一个或多个字段,可以是字符串、数字、对象等。元组是不可变的,每个元组都有一个ID,用于在拓扑中跟踪它的处理情况。

2. Topology

在Storm中,数据处理通过Topology进行,它是一个有向图,由spout和bolt组成。Spout用于从数据源获取元组,Bolt用于对元组进行处理。

下面是一个简单的Topology示例:

TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new MySpout(), 2);
builder.setBolt("split", new MySplitBolt(), 4).shuffleGrouping("spout");
builder.setBolt("count", new MyCountBolt(), 4).fieldsGrouping("split", new Fields("word"));

在这个例子中,Spout会生成一个有序的数据流,四个Split Bolt并行地从Spout中读取数据,将元组分割成单词,然后进入四个Count Bolt进行计数。

3. Spout

Spout是Topology的数据源,它从外部数据源获取数据并将其转化为元组,然后发送到Bolt进行处理。

public class MySpout extends BaseRichSpout {

  private SpoutOutputCollector collector;

  @Override
  public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
    this.collector = collector;
  }

  @Override
  public void nextTuple() {
    // 从外部数据源获取数据
    String data = getData();
    if (data != null) {
      // 转化为元组并发送到Bolt
      collector.emit(new Values(data));
    } else {
      // 暂停1秒钟等待新数据
      Utils.sleep(1000);
    }
  }

  ...
}
4. Bolt

Bolt是Topology中的数据处理单元,它接收Spout发送的元组并执行数据处理,处理结果可以发送到其他Bolt或者输出到外部存储中。

public class MySplitBolt extends BaseRichBolt {

  private OutputCollector collector;

  @Override
  public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
    this.collector = collector;
  }

  @Override
  public void execute(Tuple input) {
    // 从元组中获取数据
    String data = input.getString(0);
    // 分割成单词并发送到下一个Bolt
    for (String word : data.split(" ")) {
      collector.emit(new Values(word));
    }
    // 确认处理完成
    collector.ack(input);
  }

  ...
}
5. 总结

Storm的工作流程由Topology、Spout和Bolt组成,Spout从外部数据源获取数据并将其转化为元组发送给Bolt进行处理,处理结果可以发送到其他Bolt或者输出到外部存储中。Storm具有高性能、可伸缩性、容错性强等特点,适合处理实时数据分析、日志处理等场景。