1.流连接(stream join)
流连接基于一些常见的字段,把两个或者更多的数据流结合在一起,形成一个新的数据流。一个流连接可以有无限的输入,并且对于应该连接什么在语义上是不明确的。
每个应用的连接类型是不同的,一些应用使用两个流来连接所有元组——不管经过多长时间,另一些应用希望对于每个连接字段每次连接恰好一个元组。在所有的这些连接类型中,常见的模型是以相同的方式划分多个输入流。在Storm里对输入流在相同的字段使用字段分组,例如:
builder.setBolt("join",new MyJoiner(),parallelism).fieldsGrouping("1",new Fileds("joinfield1","joinfield2")).fieldsGrouping("2",new Fileds("joinfield1","joinfield2")).fieldsGrouping("3",new Fileds("joinfield1","joinfield2")).
2.批处理(Batching)
通常因为效率或者其他原因,希望对一组元组进行批处理而不是单独的处理。例如,可能想要批量更新到数据库或者做一些排序的流连接。
如果想要在数据处理时具有可靠性,正确的方法是当Bolt等待做批处理时,在一个实例变量中保存元组的引用。一旦你做批处理操作,可以ack到你已经保存引用的所有的元组。
如果Bolt发射元组,那么你可能想要使用多锚来保证可靠性。
3.BasicBolt
许多Bolt遵循读取一个输入元组类似的模式,根据输入元组发射零个或多个元组,然后在execute方法的最后立即ack输入元组。此模式相匹配的Bolt是一些函数和过滤器之类的东西。这是一个常见的模式,Storm提供了接口,名称为IBasicBolt,自动为你实现这种模式。
4.内存中缓存与字段的组合
builder.setBolt("expand",new ExpandUrl(),parallelism).shuffleGrouping(1);
builder.setBolt("expand",new ExpandUrl(),parallelism).fieldsGrouping("urls",new Fields("url"));
第二种方法比第一种方法更有效,因为相同的URL总是到相同的任务。这种可以避免重复跨任务中的缓存,使短URL更有可能命中缓存。
5.流的top N
Storm的另一种常见模式是对流式数据进行所谓“streaming top N”的计算,它的特点是持续的在内存中按照某个统计指标(如出现次数)计算TOP N,然后每隔一定时间间隔输出实时计算后的TOP N结果。流式数据的TOP N计算的应用场景很多,例如计算twitter上最近一段时间内的热门话题、热门点击图片等等。