1. 可靠的与不可靠的bolt

也可以使用IBasicBolt接口实现动确认:

即,如果bolt不是extends BaseRichBolt,而是extends BaseBasicBolt,上面的代码中不可靠的bolt自动变为可靠的了。

2.关于declareOutputFields方法需要重点说一下。

在此方法中定义fields,它和nextTuple中的emit中的参数需要对应。

如:定义一个字串字段,则emit时需发送一个字串:

public void declareOutputFields(OutputFieldsDeclarer declarer) {

declarer.declare(new Fields("word"));

}

public void nextTuple() {

Utils.sleep(100);

final Random rand = new Random();

String word = _words[rand.nextInt(_words.length)];

_collector.emit(new Values(word));

}

如果定义为多个字段,则emit时也需要发送相应字段:

public void declareOutputFields(OutputFieldsDeclarer declarer) {

declarer.declare(new Fields("word", "count", "key"));

}

public void execute(Tuple tuple) {

String streamId = tuple.getSourceStreamId();

if (streamId.equals("stop")){

Iterator iter = counts.keySet().iterator();

while (iter.hasNext()){

String keyword = (String) iter.next();

Integer nCount = (Integer) counts.get(keyword);

collector.emit(tuple, new Values(keyword, nCount, tuple.getStringByField("key")));

}

this._collector.ack(tuple);

counts.clear();

}

}

Bolt的下一个topo节点的execute方法可通过getString方法获取值,如,接受上面的三个参数:

public void execute(Tuple tuple) {

Integer count = tuple.getIntegerByField("count");

String key = tuple.getStringByField("key");

String word = tuple.getStringByField("word");

}

3. 关于按字段分组参数

在topology中使用字段分组时需要指定字段名,这个值即是上一个源(spout/bolt)中定义的fields。如:

builder.setSpout("wordSpout", new WordSpout(), 4);

builder.setBolt("CountBolt", new CountBolt(), 4)

.fieldsGrouping("wordSpout", "working", new Fields("word"))

.allGrouping("wordSpout", "stop");

builder.setBolt("SummaryBolt", new SummaryBolt(), 4).fieldsGrouping("CountBolt", new Fields("key"));

SummaryBolt使用的是按字段分组,它将使用CountBolt的key字段进行分组。

storm_bolt详解相关推荐

  1. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  2. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  3. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  4. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  5. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  6. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  7. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  8. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  9. pytorch nn.LSTM()参数详解

    输入数据格式: input(seq_len, batch, input_size) h0(num_layers * num_directions, batch, hidden_size) c0(num ...

最新文章

  1. Dropbox 的用户付费账户降级策略
  2. java如何做全局缓存_传智播客JNI第七讲 – JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式...
  3. 【编译打包】tengine 1.5.2
  4. Android Apk 打包
  5. UVA455 Periodic Strings
  6. 自定义数组名做参数(传指针教学)
  7. vue $emit子组件传出多个参数,如何在父组件中在接收所有参数的同时添加自定义参数...
  8. python 获取二维数组所有元素
  9. 基于直接最小二乘的椭圆拟合(Direct Least Squares Fitting of Ellipses)
  10. 学在LINUX下编程(转)
  11. 淘宝/天猫API:item_search_jupage-天天特价
  12. linux火狐怎么切换到ie内核,如何切换浏览器火狐 FIREFOX和IE之间切换
  13. zedgraph显示最小刻度_ZedGraph显示多条实时曲线
  14. Jenkins 身份验证及授权简介
  15. 安装mysql_python
  16. Python调用xbox手柄马达震动
  17. Python--break语句
  18. linux中的du命令和df命令和fdisk命令
  19. 小孩几岁学计算机合适,孩子几岁学电脑最合适?
  20. 神经网络学习笔记3——Transformer、VIT与BoTNet网络

热门文章

  1. dbmonster简介,下载安装
  2. FM5012D小风扇集成ic方案
  3. 【论文】——Once-for-All: Train One Network and Specialize it for Efficient Deployment阅读
  4. java安卓字体_Android开发之字体设置
  5. 优维科技荣登“2022中国未来独角兽TOP100”榜单
  6. 虚拟现实,带你走进一个不一样的科学探索世界
  7. 计算机三级网络技术第六章(第一轮)
  8. 操作系统安装和u盘认识
  9. Unity3D合并材质球
  10. 基于Java的宿舍管理系统