分享

问个比较基础的Storm代码问题

Joker 发表于 2014-11-27 16:17:40 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 10 16151


有些时候看到发送消息的时候

  1. collector.emit(new Values(str), str);
复制代码

这句或者
  1. collector.emit(new Values(word));
复制代码

使用上传递方法bolt或者spout会接收两个参数,还是接收到后面的参数?

已有(10)人评论

跳转到指定楼层
Joker 发表于 2014-11-27 16:20:07
以及在
  1. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  2.                 declarer.declare(new Fields("id","result"));
  3.         }
复制代码


这里定义了两个字段,表示任意使用一个都可以达到字段分组,或者其他分组策略的效果吗?
回复

使用道具 举报

desehawk 发表于 2014-11-27 17:04:45
本帖最后由 desehawk 于 2014-11-27 17:06 编辑

可以参考下面:
在IRichBolt实现类中,
如果collector.emit(oldTuple, newTuple)这样调用来发射tuple(在storm中称之为anchoring), 那么后面的bolt的ack/fail会影响spout的ack/fail,
如果collector.emit(newTuple)这样来发射tuple(在storm称之为unanchoring), 则相当于断开了后面bolt的ack/fail对spout的影响.spout将立即根据当前bolt前面的ack/fail的情况来决定调用spout的ack/fail. 所以某个bolt后面的bolt的成功失败对你来说不关心, 你可以直接通过这种方式来忽略


回复

使用道具 举报

bioger_hit 发表于 2014-11-27 18:40:19
可以这么总结:
collector.emit(oldTuple, newTuple),后面的bolt的ack/fail会影响spout的ack/fail,

collector.emit(newTuple)后面的bolt的成功失败对你来说不关心, 你可以直接通过这种方式来忽略

回复

使用道具 举报

bioger_hit 发表于 2014-11-27 18:52:00
楼主应该说的是DRPC 模式吧,

拓扑中的bolt的输入是两个字段:第一个是请求的id号;第二个是请求的参数。

要实现的DRPC函数(DRPC function)的名字。一个DRPC服务器可以协调很多函数,函数与函数之间靠函数名字来区分。你声明的第一个bolt会接收一个两维tuple,tuple的第一个字段是request-id,第二个字段是这个请求的参数。LinearDRPCTopologyBuilder同时要求我们topology的最后一个bolt发送一个形如[id, result]的二维tuple:第一个field是request-id,第二个field是这个函数的结果。最后所有中间tuple的第一个field必须是request-id。

详细参考


Storm高级原语(二) — DRPC


回复

使用道具 举报

Joker 发表于 2014-11-27 19:57:36
bioger_hit 发表于 2014-11-27 18:40
可以这么总结:
collector.emit(oldTuple, newTuple),后面的bolt的ack/fail会影响spout的ack/fail,

也就是说2个参数的emit如果后面的bolt逻辑处理块有异常,那将会导致spout的ack/fail方法有问题,对吧

是的,我正在了解DRPC远程调用,没找到一个本地模式运行的完整例子,你手边有吗?
回复

使用道具 举报

desehawk 发表于 2014-11-27 20:54:16
Joker 发表于 2014-11-27 19:57
也就是说2个参数的emit如果后面的bolt逻辑处理块有异常,那将会导致spout的ack/fail方法有问题,对吧

...



参考这个试试
Twitter Storm: DRPC学习

回复

使用道具 举报

Joker 发表于 2014-11-27 21:02:27
本帖最后由 Joker 于 2014-11-27 21:30 编辑
desehawk 发表于 2014-11-27 20:54
参考这个试试
Twitter Storm: DRPC学习

版主你好,刚才我看到上面那位兄弟的连接内容,其中一段代码,你看下我理解的对不
  1. public static class ExclaimBolt extends BaseBasicBolt {
  2.     public void execute(Tuple tuple, BasicOutputCollector collector) {
  3.         String input = tuple.getString(1);
  4.         collector.emit(new Values(tuple.getValue(0), input + "!"));
  5.     }
  6.     public void declareOutputFields(OutputFieldsDeclarer declarer) {
  7.         declarer.declare(new Fields("id", "result"));
  8.     }
  9. }
  10. public static void main(String[] args) throws Exception {
  11.     LinearDRPCTopologyBuilder builder = new LinearDRPCTopologyBuilder("exclamation");
  12.     builder.addBolt(new ExclaimBolt(), 3);
  13.     // ...
  14. }
复制代码



1.我么不用去实现exclamation这个函数,这个只是作为DRPC函数名称用来区分

2.声明的第一个bolt会接收一个两维tuple指的是
  1. drpc.execute("exclamation", "hello")
复制代码
这段代码?

还是
  1. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  2.                 declarer.declare(new Fields("id", "result"));
  3.         }
复制代码

这段代码?

3.返回最后的结构通过这段代码?
  1. collector.emit(new Values(tuple.getValue(0), input + "!"));
复制代码




回复

使用道具 举报

desehawk 发表于 2014-11-27 22:21:41
Joker 发表于 2014-11-27 21:02
版主你好,刚才我看到上面那位兄弟的连接内容,其中一段代码,你看下我理解的对不



这里
declareOutputFields 方法,告诉Storm 集群Spout 发送了哪些字段

public void declareOutputFields(OutputFieldsDeclarer declarer) {
                declarer.declare(new Fields("id", "result"));
        }



回复

使用道具 举报

jixianqiuxue 发表于 2014-11-27 22:29:37
exclamation 这只是个参数,并非函数

第三个确实是返回,后面多了叹号(!)

回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条