Storm实践2-【storm实时排序TopN】 - TOP10

本文介绍了一种基于Storm的实时流式TopN计算方法,包括如何使用Spouts和Bolts来处理实时数据流,实现热门商品浏览等场景的实时排名计算。


阅读背景:1 您需要了解TOP 使用的场景

                2 您需要了解当前的TOPN 处理,和定时区间处理的区别

 看代码说话

    

package com.cc.storm;

import com.cc.storm.bolt.MergeBolt;
import com.cc.storm.bolt.RankBolt;
import com.cc.storm.bolt.RollingAllCountBolt;
import com.cc.storm.bolt.RollingCountBolt;
import com.cc.storm.spout.RandomEmitSpout;
import com.cc.storm.spout.RedisPubSubSpout;

import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;

/**
 * ToPN是一种常见模式,是对流式数据进行“Streaming topN”的计算:
 * 比如要计算的是最近一段时间内的热门话题,热门点击图片,热门商品浏览,热门商品购买
 * 
 * 既然敢要实时的处理,【】【】【】【】【】[] 【】 【】【】【】【】 [] 【】【】【】【】 【】 []
 * 
 * @author Yin Shuai
 */
public class TOP10 {

	public static void main(String[] args) throws AlreadyAliveException,
			InvalidTopologyException, InterruptedException {

		final int TOP_N = 10;
		final int time = 1;

		TopologyBuilder builder = new TopologyBuilder();
		builder.setSpout("$datasource$", new RandomEmitSpout(), 1);

		builder.setBolt("$count$", new RollingCountBolt(3, time), 1)
				.fieldsGrouping("$datasource$", new Fields("merchandiseIDS"));

		builder.setBolt("$rank$", new RankBolt(TOP_N), 2).fieldsGrouping(
				"$count$", new Fields("merchandiseID"));

		builder.setBolt("$merge$", new MergeBolt(TOP_N)).globalGrouping(
				"$rank$");

		Config conf = new Config();
		conf.setDebug(false);
		conf.setNumWorkers(2);
		conf.setMaxSpoutPending(5000);

		LocalCluster cluster = new LocalCluster();
		cluster.submitTopology("Getting-Started-Toplogie", conf,
				builder.createTopology());

		Thread.sleep(5000);
	}
}



  整个处理的流程如图:

154505_t1Bu_1791874.png

   

转载于:https://my.oschina.net/infiniteSpace/blog/309715

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值