Storm集成Siddhi
《Siddhi初探》中我们介绍了Siddhi的基本使用方法,并表示我们将把Siddhi集成到Storm中作为流任务处理引擎。本文将用《Storm初探》中的例子讲解如何集成Siddhi。
《Storm初探》中的例子把名字字符串进行分割与输出,我们将增加一个SIddhiBolt进行名字过滤,过滤规则是筛选出小于50岁的人的名字。
对于输出:刘备 49 关羽 50 张飞 51,曹操 49 郭嘉 50 荀彧 51。我们将过滤出刘备,曹操两个名字。代码如下:
package com.coshaho.learn.storm; import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.wso2.siddhi.core.SiddhiAppRuntime;
import org.wso2.siddhi.core.SiddhiManager;
import org.wso2.siddhi.core.event.Event;
import org.wso2.siddhi.core.query.output.callback.QueryCallback;
import org.wso2.siddhi.core.stream.input.InputHandler; import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.IRichBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple; /**
*
* NamesFilterSiddhiBolt.java Create on 2017年6月26日 下午11:08:45
*
* 类功能说明: 根据年龄过滤名称
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class NamesFilterSiddhiBolt implements IRichBolt
{
private static final long serialVersionUID = 1L; private OutputCollector collector; private InputHandler inputHandler; @SuppressWarnings("rawtypes")
public void prepare(Map stormConf, TopologyContext context,
OutputCollector collector)
{
this.collector = collector;
init();
} private void init()
{
SiddhiManager siddhiManager = new SiddhiManager(); String siddhiApp = "" +
"define stream namesStream (name string, age int, streamid String); " +
"" +
"@info(name = 'namefilter') " +
"from namesStream[age < 50] " +
"select name,streamid,age " +
"insert into outputStream ;"; SiddhiAppRuntime siddhiAppRuntime = siddhiManager.createSiddhiAppRuntime(siddhiApp); siddhiAppRuntime.addCallback("namefilter", new QueryCallback()
{
@Override
public void receive(long timeStamp, Event[] inEvents, Event[] removeEvents)
{
for(Event event : inEvents)
{
String name = event.getData(0) + "";
String streamId = event.getData(1) + "";
String age = event.getData(2) + "";
List<Object> splitList = new ArrayList<Object>();
splitList.add(name);
System.out.println(name + " 年龄为 " + age);
collector.emit(streamId, splitList);
}
}
}); inputHandler = siddhiAppRuntime.getInputHandler("namesStream");
siddhiAppRuntime.start();
} public void execute(Tuple input)
{
String name = input.getString(0);
int age = input.getInteger(1);
String inputStream = input.getSourceStreamId();
try
{
inputHandler.send(new Object[]{name, age, inputStream});
}
catch (InterruptedException e)
{
e.printStackTrace();
} collector.ack(input);
} public void cleanup()
{
} public void declareOutputFields(OutputFieldsDeclarer declarer)
{
declarer.declare(new Fields("name"));
} public Map<String, Object> getComponentConfiguration()
{
return null;
}
}
需要简单的修改一下名称切割Bolt,增加age字段输出
public void execute(Tuple input)
{
// 打印线程号用于追踪Storm的分配策略
Thread current = Thread.currentThread();
String names = input.getString(0);
System.out.println("准备拆分" + names + "。当前线程号是" + current.getId() + "。");
List<Tuple> inputList = new ArrayList<Tuple>();
inputList.add(input);
String[] nameArray = names.split(" ");
int age = 49;
for(String name : nameArray)
{
List<Object> splitList = new ArrayList<Object>();
splitList.add(name);
splitList.add(age);
collector.emit(inputList, splitList);
age++;
}
collector.ack(input);
}
Topo发布时增加Siddhi过滤节点
public static void main(String[] args) throws InterruptedException
{
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("names-reader", new NamesReaderSpout());
// 启动两个名字分割Task,名字列表随机分配给一个Task
builder.setBolt("names-spliter", new NamesSpliterBolt(), 2)
.shuffleGrouping("names-reader");
builder.setBolt("names-filter", new NamesFilterSiddhiBolt(), 1)
.shuffleGrouping("names-spliter");
// 启动两个Hello World Task,相同名字发送到同一个Task
builder.setBolt("hello-world", new HelloWorldBolt(), 2)
.fieldsGrouping("names-filter", new Fields("name")); Config conf = new Config();
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("storm-test", conf, builder.createTopology());
}
输出如下

Storm集成Siddhi的更多相关文章
- Storm集成Kafka应用的开发
我们知道storm的作用主要是进行流式计算,对于源源不断的均匀数据流流入处理是非常有效的,而现实生活中大部分场景并不是均匀的数据流,而是时而多时而少的数据流入,这种情况下显然用批量处理是不合适的,如果 ...
- storm集成kafka的应用,从kafka读取,写入kafka
storm集成kafka的应用,从kafka读取,写入kafka by 小闪电 0前言 storm的主要作用是进行流式的实时计算,对于一直产生的数据流处理是非常迅速的,然而大部分数据并不是均匀的数据流 ...
- Storm 学习之路(八)—— Storm集成HDFS和HBase
一.Storm集成HDFS 1.1 项目结构 本用例源码下载地址:storm-hdfs-integration 1.2 项目主要依赖 项目主要依赖如下,有两个地方需要注意: 这里由于我服务器上安装的是 ...
- Storm 系列(八)—— Storm 集成 HDFS 和 HBase
一.Storm集成HDFS 1.1 项目结构 本用例源码下载地址:storm-hdfs-integration 1.2 项目主要依赖 项目主要依赖如下,有两个地方需要注意: 这里由于我服务器上安装的是 ...
- storm集成kafka
kafkautil: import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.produce ...
- Storm集成Kafka的Trident实现
原本打算将storm直接与flume直连,发现相应组件支持比较弱,topology任务对应的supervisor也不一定在哪个节点上,只能采用统一的分布式消息服务Kafka. 原本打算将结构设 ...
- Storm集成Kafka编程模型
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3974417.html 本文主要介绍如何在Storm编程实现与Kafka的集成 一.实现模型 数据流程: ...
- Storm 学习之路(七)—— Storm集成 Redis 详解
一.简介 Storm-Redis提供了Storm与Redis的集成支持,你只需要引入对应的依赖即可使用: <dependency> <groupId>org.apache.st ...
- Storm 系列(七)—— Storm 集成 Redis 详解
一.简介 Storm-Redis 提供了 Storm 与 Redis 的集成支持,你只需要引入对应的依赖即可使用: <dependency> <groupId>org.apac ...
随机推荐
- [C#/Java] C#中调用Servlet示例
需求 通用消息接口使用servlet作为服务器端服务接口,第三方应用程序通过http post的方式调用servlet,实现与通用消息接口的调用连接. 参数说明如下: msgTitle:消息标题,描述 ...
- Adobe edge animate制作HTML5动画可视化工具(一)
Edge Animate for mac是Adobe最新出品的制作HTML5动画的可视化工具,简单的可以理解为HTML5版本的Flash Pro.在之后的文章中,我会逐一的介绍这款新的HTML5动画神 ...
- iOS - 使用WKWebView时OC调JS的user-select属性控制用户操作
// 页面加载完成之后调用 - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigatio ...
- CBV之详解
一,CBV,基于反射实现根据请求方式不同,执行不同的方法. 1. 开发模式 - 普通开发方式(前后端放在一起写) - 前后端分离 2. 后端开发 为前端提供URL(API/接口的开发) 注:永远返回H ...
- 搭建本地DNS解析
一.安装Dnsmasq yum install -y dnsmasq 二.安装dig yum install dnsmasq -y 三.编辑配置文件 vim /etc/dnsmasq.conf res ...
- 注意:darknet安装
参考:https://github.com/AlexeyAB/darknet # 一.安装 ## linux下安装 - 在darknet目录下执行make ## windows下安装 1. 安装vs2 ...
- HDU - 5961 传递 想法,bfs
题意:给你一个有向图,满足去掉方向是完全图,将其拆成PQ两个图(没有公共边),问你两图是否分别满足对于任意3个点a,b,c 若有一条边从a到b且有一条边从b到c ,则同样有一条边从a到c. 题解:观察 ...
- CF1044B Intersecting Subtrees 构造+树论
正解:构造 解题报告: 传送门 又是一道交互题!爱了爱了! 这题真的,极妙!非常神仙!就非常非常思维题! 直接说解法了吼 说起来实在是简单鸭 就是先问一个对方的联通块中的一个点在我这儿的编号,记为x ...
- Python命令行解析库argparse(转)
原文:http://www.cnblogs.com/linxiyue/p/3908623.html 2.7之后python不再对optparse模块进行扩展,python标准库推荐使用argparse ...
- python课件-淘宝-目录.txt
卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python课件-淘宝-目录.txt│ ├─01python核心编程阶段-linux基础(│ linux_h ...