并发度及高并发计算总数和去重

典型的问题是word总数和word个数(去重)并且在高并发情况下完成

一个topology可以包含一个或多个worker(并行的跑在不同的机器上),所以worker process就是执行一个topology的子集,并且worker只能对应于一个topology

一个worker可用包含一个或多个executor(线程), 每个component(组件)(spout或bolt)至少对应一个executor,所以可以说executor执行一个compenent的子集,同时一个executor只能对应一个component。

task就是具体的处理逻辑对象,一个executor线程可以执行一个或多个tasks,但一般默认每个executor只执行一个task,所以我们往往认为task就是执行线程,其实并不是

task代表最大并发度,一个component的task数量是不会改变的,但是一个component的executor数目是会发生改变的(storm rebalance命令就可以调整executor的数目以达到平衡)

task数>=executor数,executor数代表实际并发数

设置task数可以用:builder.setBolt("bolt",new MyBolt(), 1).setNumTasks(2).shuffleGrouping("spout");


典型的问题是word总数和word个数(去重)并且在高并发情况下完成:


package wordcount;

import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.FailedException;
import backtype.storm.topology.IBasicBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Tuple;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by Administrator on 2016/10/6.
 */
public class SumBolt implements IBasicBolt{



    private static final long serialVersionUID = 1L;
    Map<String, Integer> counts = new HashMap<String, Integer>();
    @Override
    public void prepare(Map map, TopologyContext topologyContext) {

    }

    @Override
    public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {

        try{

            long word_sum = 0;//总数
            long word_count = 0;//个数,去重后
            String wordString = tuple.getString(0);
            Integer countInteger = tuple.getInteger(1);
            counts.put(wordString, countInteger);
            //获取总数,遍历counts的walues,进行sum
            Iterator<Integer> i = counts.values().iterator();
            while(i.hasNext()){
                    word_sum += i.next();
            }

            //获取word去重的个数,其实就是遍历map的keyset,取个数count

            Iterator<String> i2 = counts.keySet().iterator();
            while(i2.hasNext()){
                String oneWordString = i2.next();
                if(oneWordString != null){
                    word_count ++;
                }
            }

            System.out.println("word_sum="+word_sum+";  word_count:"+word_count);

        }catch (Exception e){
            throw new FailedException("SumBolt fail!");
        }




    }

    @Override
    public void cleanup() {

    }

    @Override
    public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {

    }

    @Override
    public Map<String, Object> getComponentConfiguration() {
        return null;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值