kafkaspout以及kafkabolt的最简实例

import java.util.HashMap;import java.util.Map;import backtype.storm.Config;import backtype.storm.LocalCluster;//import backtype.storm.LocalCluster;import backtype.storm.StormSubmitter;import backtype.storm.spout.SchemeAsMultiScheme;import backtype.storm.topology.TopologyBuilder;import storm.kafka.BrokerHosts;import storm.kafka.KafkaSpout;import storm.kafka.SpoutConfig;import storm.kafka.ZkHosts;import storm.kafka.bolt.KafkaBolt;public class topology { public static void main(String [] args) throws Exception{ //配置zookeeper 主机:端口号 BrokerHosts brokerHosts =new ZkHosts("110.64.76.130:2181,110.64.76.131:2181,110.64.76.132:2181"); //接收消息队列的主题 String topic="recommend"; //zookeeper设置文件中的配置,如果zookeeper配置文件中设置为主机名:端口号 ,该项为空 String zkRoot=""; //任意 String spoutId="zhou"; SpoutConfig spoutConfig=new SpoutConfig(brokerHosts, topic, zkRoot, spoutId); //设置如何处理kafka消息队列输入流 spoutConfig.scheme=new SchemeAsMultiScheme(new MessageScheme()); Config conf=new Config(); //不输出调试信息 conf.setDebug(false); //设置一个spout task中处于pending状态的最大的tuples数量 conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, 1); Map<String, String> map=new HashMap<String,String>(); // 配置Kafka broker地址 map.put("metadata.broker.list", "master:9092,slave1:9092,slave2:9092"); // serializer.class为消息的序列化类 map.put("serializer.class", "kafka.serializer.StringEncoder"); conf.put("kafka.broker.properties", map); // 配置KafkaBolt生成的topic conf.put("topic", "receiver"); TopologyBuilder builder =new TopologyBuilder(); builder.setSpout("spout", new KafkaSpout(spoutConfig),1); builder.setBolt("bolt1", new QueryBolt(),1).setNumTasks(1).shuffleGrouping("spout"); builder.setBolt("bolt2", new KafkaBolt<String, String>(),1).setNumTasks(1).shuffleGrouping("bolt1"); if(args.length==0){ LocalCluster cluster = new LocalCluster(); //提交本地集群 cluster.submitTopology("test", conf, builder.createTopology()); //等待6s之后关闭集群 Thread.sleep(6000); //关闭集群 cluster.shutdown(); } StormSubmitter.submitTopology("test", conf, builder.createTopology()); }}然后是MessageScheme.java
import java.io.UnsupportedEncodingException;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import backtype.storm.spout.Scheme;import backtype.storm.tuple.Fields;import backtype.storm.tuple.Values;public class MessageScheme implements Scheme { private static final Logger LOGGER = LoggerFactory.getLogger(MessageScheme.class); public List<Object> deserialize(byte[] ser) { try { //从kafka中读取的值直接序列化为UTF-8的str String mString=new String(ser, "UTF-8"); return new Values(mString); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block LOGGER.error("Cannot parse the provided message"); } return null; } public Fields getOutputFields() { // TODO Auto-generated method stub return new Fields("msg"); }}最后是QueryBolt.java
import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintStream;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Vector;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;import backtype.storm.tuple.Values;public class QueryBolt implements IRichBolt { List<String> list; OutputCollector collector; public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) { list=new ArrayList<String>(); this.collector=collector; } public void execute(Tuple input) { // TODO Auto-generated method stub String str=(String) input.getValue(0); //将str加入到list list.add(str); //发送ack collector.ack(input); //发送该str collector.emit(new Values(str)); } public void cleanup() {//topology被killed时调用 //将list的值写入到文件 try { PrintStream p=new PrintStream(outputStream); p.println("begin!"); p.println(list.size()); for(String tmp:list){ p.println(tmp); } p.println("end!"); try { p.close(); outputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("message")); } public Map<String, Object> getComponentConfiguration() { // TODO Auto-generated method stub return null; }}问题1:zkRoot如何设置?非常重要,设置错误无法正确从kafka消息队列中取出数据。
SpoutConfig继承自KafkaConfig。由于SpoutConfig和KafkaConfig所有的instance field全是public, 因此在使用构造方法后,可以直接设置各个域的值。public class SpoutConfig extends KafkaConfig implements Serializable { public List<String> zkServers = null; //记录Spout读取进度所用的zookeeper的host public Integer zkPort = null;//记录进度用的zookeeper的端口 public String zkRoot = null;//进度信息记录于zookeeper的哪个路径下 public String id = null;//进度记录的id,想要一个新的Spout读取之前的记录,应把它的id设为跟之前的一样。 public long stateUpdateIntervalMs = 2000;//用于metrics,多久更新一次状态。 public SpoutConfig(BrokerHosts hosts, String topic, String zkRoot, String id) { super(hosts, topic); this.zkRoot = zkRoot; this.id = id; }}public class KafkaConfig implements Serializable { public final BrokerHosts hosts; //用以获取Kafka broker和partition的信息 public final String topic;//从哪个topic读取消息 public final String clientId; // SimpleConsumer所用的client id public int fetchSizeBytes = 1024 * 1024; //发给Kafka的每个FetchRequest中,用此指定想要的response中总的消息的大小 public int socketTimeoutMs = 10000;//与Kafka broker的连接的socket超时时间 public int fetchMaxWait = 10000; //当服务器没有新消息时,消费者会等待这些时间 public int bufferSizeBytes = 1024 * 1024;//SimpleConsumer所使用的SocketChannel的读缓冲区大小 public MultiScheme scheme = new RawMultiScheme();//从Kafka中取出的byte[],该如何反序列化 public boolean forceFromStart = false;//是否强制从Kafka中offset最小的开始读起 public long startOffsetTime = kafka.api.OffsetRequest.EarliestTime();//从何时的offset时间开始读,默认为最旧的offset public long maxOffsetBehind = 100000;//KafkaSpout读取的进度与目标进度相差多少,相差太多,Spout会丢弃中间的消息 public boolean useStartOffsetTimeIfOffsetOutOfRange = true;//如果所请求的offset对应的消息在Kafka中不存在,是否使用startOffsetTime public int metricsTimeBucketSizeInSecs = 60;//多长时间统计一次metrics public KafkaConfig(BrokerHosts hosts, String topic) { this(hosts, topic, kafka.api.OffsetRequest.DefaultClientId()); } public KafkaConfig(BrokerHosts hosts, String topic, String clientId) { this.hosts = hosts; this.topic = topic; this.clientId = clientId; }}kafkaspout以及kafkabolt的最简实例的更多相关文章
- 最简实例演示asp.net5中用户认证和授权(4)
上篇: 最简实例演示asp.net5中用户认证和授权(3) 上面我们把自定义认证和授权的相关的最小基础类和要实现的接口都实现了,下面就是如何来进行认证和授权的配置. 首先我们要告诉系统,我们的用户和角 ...
- 最简实例演示asp.net5中用户认证和授权(3)
上接: 最简实例演示asp.net5中用户认证和授权(2) 在实现了角色的各种管理接口后,下一步就是实现对用户的管理,对用户管理的接口相对多一些,必须要实现的有如下三个: 1 public inter ...
- 最简实例演示asp.net5中用户认证和授权(2)
上接最简实例演示asp.net5中用户认证和授权(1) 基础类建立好后,下一步就要创建对基础类进行操作的类了,也就是实现基础类的增删改查(听起来不太高大上),当然,为了使用asp.net5的认证机制, ...
- 最简实例演示asp.net5中用户认证和授权(1)
asp.net5中,关于用户的认证和授权提供了非常丰富的功能,如果结合ef7的话,可以自动生成相关的数据库表,调用也很方便. 但是,要理解这么一大堆关于认证授权的类,或者想按照自己项目的特定要求对认证 ...
- 最简实例说明wait、notify、notifyAll的使用方法
wait().notify().notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态. 这三个方法最终调用的都是jvm级的native方法.随着jvm运行平台的不同可能有些 ...
- inheritprototype原型继承封装及综合继承最简实例
1.inheritprototype.js ;(function(){ var s = { inheritObject:function(o){//对象继承封装 ...
- Express极简实例
假设已创建一个Express工程,否则请参考express工程环境准备 修改app.js var express = require('express'); var app = express(); ...
- Servlet(1):基础概念/最简实例
Servlet 生命周期(1) init()方法初始化Servlet对象 它在第一次创建Servlet时被调用,在后续每次不同用户请求时不再调用.(2) service()方法来处理客户端的请求 ...
- kafka主题offset各种需求修改方法
简要:开发中,常常因为需要我们要认为修改消费者实例对kafka某个主题消费的偏移量.具体如何修改?为什么可行?其实很容易,有时候只要我们换一种方式思考,如果我自己实现kafka消费者,我该如何让我们的 ...
随机推荐
- Cisco 绑定mac地址
在Cisco中有以下三种方案可供选择,方案1和方案2实现的功能是一样的,即在具体的交换机端口上绑定特定的主机的MAC地址(网卡硬件地址),方案3是在具体的交换机端口上同时绑定特定的主机的MAC地址(网 ...
- android 权限管理和签名 实现静默卸载
为了实现静默卸载, 学了下android的安全体系,记录如下 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份. 安装在设备中的每一个apk文件,Android ...
- Installation error: INSTALL_FAILED_UID_CHANGED 的解决办法
出现此问题的原因大多是apk冲突造成,解决的办法如下: 1. Settings -> Applications, 卸载出现问题的apk,重新安装即可. 2. 如果apk无法卸载,则将apk相关 ...
- elisp
cons cell? 构建内存对象! 通过寄存器的基地址car和偏移地址cdr来--寻址内存对象,我是这样理解的. http://wiki.dourok.info/doku.php/%E5%B7%A5 ...
- zf-关于统计分析表单导出(写这个的 太麻烦了)
一个类里面写了2个一样的方法 如果是我 会重复利用 而不是这样写 今天改bug的时候我把一个类修改了2次 差点以为进错了类
- Spring Quartz定时器 配置文件详解
在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...
- 解决BT5不能使用putty连接问题
root@bt:~# cd /etc/sshroot@bt:/etc/ssh# sshd-generate Generating public/private rsa1 key pair.Your i ...
- conflicting types for xxxx错误 (转)
pretty_print.c:31: error: conflicting types for ‘vmi_print_hex’ libvmi.h:749: note: previous declara ...
- html5语义化标签总结二
HTML 5的革新之一:语义化标签二文本元素标签.分组元素标签. HTML 5的革新——语义化标签(一)中介绍了一些HTML5新加的一些节元素,一张页面中结构元素构成网页大体,但是也需要其他内容来填充 ...
- mysql时间函数,总是记不住,总是查。
http://www.cnblogs.com/zeroone/archive/2010/05/05/1727659.html UNIX_TIMESTAMP() UNIX_TIMESTAMP(date) ...