博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Storm的数据处理编程单元:Bolt 学习整理
阅读量:6115 次
发布时间:2019-06-21

本文共 2339 字,大约阅读时间需要 7 分钟。

  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");

 

转载地址:http://uavka.baihongyu.com/

你可能感兴趣的文章
mysql常用语句
查看>>
程序员随想-关于优雅
查看>>
爱加密联合应用之星(APPSTAR)为开发者提供免费云加密服务
查看>>
部署基于Centos7的Zimbra邮件系统-之一系统规划及DNS服务配置
查看>>
如何理解比特币的底层协议
查看>>
cocos集成科大讯飞语音识别
查看>>
The Reactive Manifesto(响应式宣言)
查看>>
R语言笔记 attach()、detach()和with()
查看>>
ftp操作
查看>>
服务器双网卡双网关
查看>>
mysql入门之三:索引添加删除
查看>>
adb shell 命令详解
查看>>
dom4j解析带命名空间的xml文件
查看>>
mybaties的批量增删改查及普通增删改查
查看>>
Freenas8图文教程3--查看日志和固件升级
查看>>
添加CA根证书到操作系统获得信任
查看>>
我的友情链接
查看>>
Oracle 将秒转换成日期或者将日期转换成为秒函数
查看>>
mac之ssh记住密码。
查看>>
Redhat OpenShift架构剖析
查看>>