Bolt是Topology中的数据处理的单元,也是Storm针对处理过程的编程单元。Topology中所有的处理都是在这些Bolt中完成的,编程人员可以实现自定义的处理过程,例如,过滤、函数、聚集、连接等计算。如果是复杂的计算过程,往往需要多个步骤和使用多个Bolt。

  Bolt可以将数据项发送至多个数据流(Stream)。编程人员首先可以使用OutputFieldsDeclarer类的declareStream()方法来声明多个流,指定数据将要发送到的流,然后使用SpoutOutputCollector的emit方法将数据发送。

  当声明了一个Bolt的输入流后,可以从其他的组件中接收这些指定的流。当接收某个组件的所有流时,需要在程序中逐个声明接收的过程。InputDeclarer对象默认接收来自某组件默认的流。

//从名称为"1"的组件中接收默认的流。
declarer.shuffleGrouping("1")

IBolt 和 IComponent接口

IBolt接口:

//在组件的任务初被初始化时,由集群中的工作进程(worker)调用,prepare()用于实例化Bolt的已给运行时任务,被集群中的某一个进程调用,提供Bolt运行的环境。
//sormConf对象维护Storm中针对该Bolt的配置信息。(来自Topology);context对象是一个上下文对象,用于获取该组件运行时任务的信息。(例如Topology中该Bolt所有任务的位置,包括任务的id、组件id和输入输出信息等)
//collector对象用于从该Bolt发送数据项。数据项可以在任意时刻发送,包括调用open()和close()方法。
void prepare(java.util.Map stormConf,TopologyContext context,OutputCollector collector) //接收一个数据项并处理
//该方法用来接收一个数据项(Tuple),并可以将处理的结果作为新的数据项发送(emit),是Bolt需要实现的最重要的方法。
//参数imput是一个数据项对象,包含了众多的元数据(metadata),包括它来自的组件、流、任务等。数据项中的值,可以通过Tuple类的getValue()方法获得。
void execute(Tuple input) //在IBolt将关闭时调用
void cleanup()

Tuple类的方法,这个类的对象作为execute()方法的输入。(方法举例: int size() ; int fieldIndex(java.lang.String field) ; ......)

方法众多,可以整理分为以下五类:

1、获取属性的方法。 (size()、fieldIndex()和contains()三个方法)

2、获取元数据的方法。(getMessageId()、getSourceComponent()、getSourceTask()、getSourceStreamId()和getSourceGlobalStreamid()方法)

其中MessageId是在数据项被创建时,通过一定的规则赋值的。

3、根据域获取值的方法。(getValue()和多个get具体数据类型的方法)

4、根据域的名称获取值的方法。(这一类包括getFields()、getValues()和select()方法)

5、获取Tuple的值或域列表的方法。(getFields()、getValues()和select()方法)

分别获取该数据项的所有域列表、值列表和值列表子集。

简单的案例:

class SplitSentence implements IRichBolt {
private OutputCollector collector; public void prepare(Map conf,TopologyContext context,OutputCollector collector){
this.collector = collector;
} public void execute(Tuple tuple){
String sentence = tuple.getString(0);
for(String word : sentence.split(" "){
collector.emit(new Values(word));
}
} public void cleanup(){
} public void declareOutputFields(OutpuFieldsDeclarer declarer){
declarer.declare(new Fields("word"));
}
}

这里说下declareOutputFields()函数参数,声明了输出流的数据项的结构,也即Tuple的域。

结合上节给的Spout的示例,可以在Topology类的main函数中加入相关代码,增加Bolt。

Topology builder builder = new TopologyBuilder();
Builder.SetSpout ("SentenceGenSpout ",new TestWord Spout(),1);
builder.setBolt("splitBoult",new SplitSentence(),2).shuffleGrouping("sentenceGenSpout");

Storm的数据处理编程单元:Bolt 学习整理的更多相关文章

  1. storm的数据源编程单元Spout学习整理

    Spout呢,是Topology中数据流的源头,也是Storm针对数据源的编程单元.一般数据的来源,是通过外部数据源来读取数据项(Tuple),并读取的数据项传输至作业的其他组件.编程人员一般可通过O ...

  2. C#泛型(C#_编程指南)CSDN学习整理笔记

    1.1. 泛型概述 2.0版C#语言和公共语言运行时(CLR)中增加了泛型.泛型将类型参数的概念引入.NETFramework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定 ...

  3. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  4. HttpClient学习整理

    HttpClient简介HttpClient 功能介绍    1. 读取网页(HTTP/HTTPS)内容    2.使用POST方式提交数据(httpClient3)    3. 处理页面重定向    ...

  5. Java设计模式(学习整理)---命令模式

    设计模式之Command(学习整理) 1.Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装 ...

  6. Wix学习整理(6)——安装快捷方式

    原文:Wix学习整理(6)--安装快捷方式 一 为HelloWorld案例添加安装快捷方式 通常我们安装一个应用软件的时候,都喜欢在桌面或开始菜单中添加快捷方式以便我们快速访问.现在我们就在上篇添加注 ...

  7. Wix学习整理(4)——关于WiX文件格式和案例HelloWorld的分析

    原文:Wix学习整理(4)--关于WiX文件格式和案例HelloWorld的分析 关于WiX文件格式 .wxs是WiX的源文件扩展名..wxs文件以类XML文件的格式来指定了要构造Windows In ...

  8. Wix学习整理(3)——关于Windows Installer和MSI

    原文:Wix学习整理(3)--关于Windows Installer和MSI 关于Windows Installer Windows Installer是微软Windows操作系统自带的一个软件安装和 ...

  9. 《AngularJS学习整理》系列分享专栏

    <AngularJS学习整理>系列分享专栏   <AngularJS学习整理>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/re ...

随机推荐

  1. openni和骨架追踪 rviz查看---34

    原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.安装深度相机的NITE. 首先下载NITE-Bin-Dev-Linux-x64-v1.5.2.23, ...

  2. JavaWeb学习记录(四)——日期和数字的格式转换

    一.Date转为String (1) public class DateUtil {    private static SimpleDateFormat sdf = new SimpleDateFo ...

  3. I’m stuck!(BFS)

    I’m stuck! 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能 ...

  4. 服务器启用 FTP

    通常使用 vsftpd 作为FTP服务器. 安装 vsftpd: 1.以管理员(root)身份执行以下命令 yum install vsftpd 2.设置开机启动 vsftpd ftp 服务 chkc ...

  5. HTML中特殊字符和与之对应的ASCII代码

    ASCII代码是说明了在html中每个特殊字符的属性以及字符的简要说明.在使用html时,如何把ASCII代码添加到网页中.例如版权符号'©'在html中可以通过 "©"来显示. ...

  6. AS3 Embed用法笔记

    1. 用[Embed]元数据标签可以嵌入GIF,PNG,JPEG,或者MP3文件.ActionScript代码的顺序非常重要.你必须在声明变量前添加[Embed]元数据标签,而且这个变量的类型会是Cl ...

  7. PostgreSQL and bloat

    The bucardo project has released its nagios plugins for PostgreSQL and we can extract from them this ...

  8. datagrid中load,reload,loadData方法的区别

    它有其中有load,reload,loadData这三个方法,它们都有相同的功能,都是加载数据的,但又有区别. load方法,比如我已经定义一个datagrid的id为grid,那这个方法的使用方式为 ...

  9. C语言计算开方

    C语言里面有sqrt可以计算开平方根,但似乎想要计算开任意次方根的话却没有一个固定的函数,自己写算法也蛮啰嗦的…… 其实啊,巧妙使用pow函数就可以实现需求. C语言库函数pow的原型声明如下: #i ...

  10. PIP安装Python的scipy,scrapy等包出现“failed building wheel for xxx”问题解决办法

    1.在这里下载对应的.whl文件,注意别改文件名! http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml Ctrl + F,输入lxml,找到下面这段 Lxm ...