strom批量发送(实现IBatchSpout接口、non-tranctional spout)

原创 2018年04月16日 01:03:13

在该例子中,使用IBatchSpout接口实例化一个spout,重写emitBatch方法,方法中将根据batchId将数据batchesMap中(batchesMap其实就是一个批的概念,这批数据可以自己指定,我这里就是指定了4批的数据,也就是DATA_MAP里面的数据,由于在emitBatch会指定一个batchId,所以这个batchId就和这一批数据进行挂钩。如果以后有事务,那么这批数据其中一个数据处理失败了,那么这批数据将会进行一次重发。),再将发射出去。最终处理完毕之后回调ack方法,再根据batchId将batchesMap中的数据删除。该方法并未实现事务属于non-tranctional spout.

其中WordCountTopology类:

public class WordCountTopology {
	
    public static StormTopology buildTopology() {
    	TridentTopology topology = new TridentTopology();
        

		
    	//使用IBatchSpout接口实例化一个spout
        SubjectsSpout spout = new SubjectsSpout(4);
		//指定输入源spout
        Stream inputStream = topology.newStream("spout", spout);
        /**
         * 要实现流sqout - bolt的模式 在trident里是使用each来做的
         * each方法参数:
         * 1.输入数据源参数名称:subjects
         * 2.需要流转执行的function对象(也就是bolt对象):new Split()
         * 3.指定function对象里的输出参数名称:subject
         */
        //设置随机分组
        inputStream.shuffle()
        		.each(new Fields("subjects"), new SplitFunction(), new Fields("sub"))
        		//进行分组操作:参数为分组字段subject,比较类似于我们之前所接触的FieldsGroup
                .groupBy(new Fields("sub"))
                //对分组之后的结果进行聚合操作:参数1为聚合方法为count函数,输出字段名称为count
                .aggregate(new Count(), new Fields("count"))
                //继续使用each调用下一个function(bolt)输入参数为subject和count,第二个参数为new Result() 也就是执行函数,第三个参数为没有输出
                .each(new Fields("sub", "count"), new ResultFunction(), new Fields())
                .parallelismHint(1);
        return topology.build();	//利用这种方式,我们返回一个StormTopology对象,进行提交
    }	
	
	public static void main(String[] args) throws Exception {
		
	  	Config conf = new Config();
	  	//设置batch最大处理
	  	conf.setNumWorkers(2);
	  	conf.setMaxSpoutPending(20);
	  	if(args.length == 0) {
	        LocalCluster cluster = new LocalCluster();
	        cluster.submitTopology("trident-wordcount", conf, buildTopology());
	        Thread.sleep(10000);
	        cluster.shutdown();
	  	} else {
	  		StormSubmitter.submitTopology(args[0], conf, buildTopology());
	  	}
	}
}


SubjectsSpout类实现了IBatchSpout接口实现批量发送。

 
public class SubjectsSpout implements IBatchSpout {

	/** serialVersionUID */
	private static final long serialVersionUID = 1L;
	//批处理大小
	private int batchSize;
	//容器
	private HashMap<Long, List<List<Object>>> batchesMap = new HashMap<Long, List<List<Object>>>();
	
	public SubjectsSpout(int batchSize){
		this.batchSize = batchSize;
	}
	
	private static final Map<Integer, String> DATA_MAP = new HashMap<Integer, String>();

	static {
		DATA_MAP.put(0, "java java php ruby c++");
		DATA_MAP.put(1, "java python python python c++");
		DATA_MAP.put(2, "java java java java ruby");
		DATA_MAP.put(3, "c++ java ruby php java");
	}
	
	@Override
	public void open(Map conf, TopologyContext context) {
		// TODO Auto-generated method stub
	}

	@Override
	public void emitBatch(long batchId, TridentCollector collector) {
		List<List<Object>> batches = new ArrayList<List<Object>>();
		for (int i= 0; i < this.batchSize; i++) {
			batches.add(new Values(DATA_MAP.get(i)));
		}		
		System.out.println("batchId: " + batchId);
		this.batchesMap.put(batchId, batches);
		for(List<Object> list : batches){
            collector.emit(list);
        }
	}
	
	@Override
	public Fields getOutputFields() {
		return new Fields("subjects");
	}

	@Override
	public void ack(long batchId) {
		System.out.println("remove batchId:" + batchId);
		this.batchesMap.remove(batchId);		
	}
	
	@Override
	public Map getComponentConfiguration() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
	}

}


最终结果如下:







版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010634288/article/details/79955475

storm-[4] -java.lang.NoClassDefFoundError: storm/trident/spout/ITridentSpout

解决方案源网址 Exception in thread "main" java.lang.NoClassDefFoundError: storm/trident/spout/ITridentSp...
  • hjw199089
  • hjw199089
  • 2017-05-10 21:18:07
  • 480

storm trident 自定义spout

package cn.crxy.trident; import java.util.ArrayList; import java.util.HashMap; import java.ut...
  • u010220089
  • u010220089
  • 2015-08-23 13:24:37
  • 1097

Storm应用系列之——Spout、Bolt API

Storm中常用的Bolt和Spout API介绍
  • xeseo
  • xeseo
  • 2014-01-02 13:19:21
  • 13631

流处理旅程——storm之spout介绍

核心 Spout中方法的说明1、Spout数据源 消息源Spout是storm的Topology中的消息生产者。2、spout介绍 2、1spout的结构 Spout是storm的核心组件之一...
  • paicMis
  • paicMis
  • 2017-02-16 23:53:47
  • 2266

storm spout,bolt超时处理和fail处理

如果toplogy在debug模式下,如果发现__tick打印,则是ack超时导致的,如果打印__ack_fail打印则是消息fail导致的 分别对应的变量backtype.storm.SYSTEM...
  • linux_ja
  • linux_ja
  • 2015-02-08 10:50:17
  • 1460

Storm的Spout和Bolt中的方法

一、Spout中的方法 1.open 当一个Task被初始化的时候会调用此open方法。一般都会在此方法中对发送Tuple的对象SpoutOutputCollector和配置对象TopologyC...
  • u013063153
  • u013063153
  • 2017-06-25 19:24:00
  • 1538

Strom基础

转载自:http://blog.csdn.net/hguisu/article/details/8454368http://san-yun.iteye.com/blog/2095475Storm简介 ...
  • zero__007
  • zero__007
  • 2015-08-11 18:16:30
  • 441

storm中supervisor, task, worker, spout, bolt之间的关系

一个storm topology运行起来之后, 会在supervisor 机器上启动一些进程来运行spout和bolt实例.  如果一个topology里面一共有一个spout, 一个bolt。...
  • radar1985
  • radar1985
  • 2012-08-31 15:05:52
  • 1424

Storm:多并行度下Spout和Blot实体间Tuple的定向传输(tuple在多流时的路由)

多并行度下Spout和Blot实体间Tuple的定向传输   图1 Spout与Blot多对1关系图         图2 Spout与Blot1对1关系图           图3 Spout与Bl...
  • chenhuijie666
  • chenhuijie666
  • 2014-01-07 19:06:26
  • 3070

Storm下运行C++(二)

本文为简单翻译,原文地址:http://demeter.inf.ed.ac.uk/cross/stormcpp.html 欢迎转载,转载时请注明出处: 可参考:storm下运行C++程序(一) ...
  • jmppok
  • jmppok
  • 2013-11-19 19:05:58
  • 4181
收藏助手
不良信息举报
您举报文章:strom批量发送(实现IBatchSpout接口、non-tranctional spout)
举报原因:
原因补充:

(最多只允许输入30个字)