STORM之ITridentSpout、FirstN(取Top N)实现、流合并和join

2 篇文章 0 订阅
1 篇文章 0 订阅

基于事务

static interface ITridentSpout.BatchCoordinator<X>

           

static interface ITridentSpout.Emitter<X>

接口类的实现和之前事务ITransactionalSpout 非常类似。

Topo 例子
topology.newDRPCStream("top", drpc)
.each(new Fields("args"), new Split(“ ”), new Fields("time"))
.parallelismHint(5)
.stateQuery( myStates,newFields("time"),new QueryPacketDB(),new Fields("srcip", "byt", "pkt"))
.groupBy(new Fields("srcip"))
. chainedAgg ()
.aggregate(new Fields("byt"), new Sum(), new Fields("yt"))
.aggregate(new Fields("pkt"), new Sum(), new Fields("kt"))
. chainEnd ()
. applyAssembly (new FirstN (10, " yt ", true));

调用链 用于执行多个聚合

如果想同事执行多个聚合,可以使用如下的调用链

mystream.chainedAgg()

        .partitionAggregate(new Count(), new Fields("count"))

        .partitionAggregate(new Fields("b"), new Sum(), new Fields("sum"))

        .chainEnd()

这个代码将会在每个分区上执行count和sum聚合。输出将包含【“count”,“sum”】字段。
投影( projection

投影操作是对数据上进行列裁剪。

如果你有一个流有【“a”,“b”,“c”,“d”】四个字段,执行下面的代码:

mystream.project(new Fields("b","d"));

输出流将只有【“b”,“d”】两个字段。
重分区( repartition )操作

重分区操作是通过一个函数改变元组(tuple)在task之间的分布,   重分区(repatition)需要网络传输,目的是方便聚合或查询。如下是重分区函数:

1.      Shuffle:

2.      Broadcast:每个元组重复的发送到所有的目标分区。这个在DRPC中很有用。  如果你想做在每个分区上做一个statequery。

3.      paritionBy:根据一系列分发字段(fields)做一个语义的分区。通过对这些字  段取hash值并对目标分区数取模获取目标分区。paritionBy保证相同的分发  字段(fields)分发到相同的目标分区。

4.      global:所有的tuple分发到相同的分区。

5.      batchGobal:本批次的所有tuple发送到相同的分区,不通批次可以在不通的分  区。

6.      patition:这个函数接受用户自定义的分区函数。用户自定义函数事项 backtype.storm.grouping.CustomStreamGrouping接口。
合并和关联

合并(merge)多个流成为一个流,可以如下:

topology.merge(stream1, stream2, stream3);

Trident合并的流字段会以第一个流的字段命名

另一个合并流的方法是join。类似SQL的join都是对固定输入的。而流的输入是不固定的,所以不能按照sql的方法做join。

Trident中的join只会在spout发出的每个批次间进行

如一个流包含字段【“key”,“val1”,“val2”】,

另一个流包含字段【“x”,“val1”】:

topology.join(stream1, new Fields("key"), stream2, new Fields("x"), new Fields("key","a","b","c"));

Stream1的“key”和stream2的“x”关联,Trident要求所有的字段要改名字

1.      首先是join字段。例子中stream1中的“key”对应stream2中的“x”。

2.      接下来,会把非join字段依次列出来,排列顺序按照传给join的顺序。例子中“a”,“b”对应stream1中的“val1”和“wal2”,“c”对应stream2中的“val1”。

FirstN

取Top N

用法:

stream. applyAssembly (new FirstN(TOP_N, "sortField", true));

小结

Trident适合做汇总型,不大适合做去重型






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值