• storm和kafka的wordCount


    这个是在window环境下面安装的kafka

    • 下载pom依赖

        <dependency>
            <groupId>org.apache.storm</groupId>
            <artifactId>storm-kafka-client</artifactId>
            <version>1.1.1</version>
          </dependency>
          <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>0.10.0.0</version>
          </dependency>
          <dependency>
            <groupId>org.apache.storm</groupId>
            <artifactId>storm-core</artifactId>
            <version>1.1.1</version>
            <!--  本地测试注释集群运行打开 -->
            <!--  <scope>provided</scope>-->
          </dependency>
      

    编写代码

    • 编写SplitSentenceBolt
      public class SplitSentenceBolt extends BaseRichBolt {
      private OutputCollector collector;

      	@Override
      	public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
      		this.collector=outputCollector;
      	}
      
      	@Override
      	public void execute(Tuple tuple) {
      		//String sentece = tuple.getStringByField("sentence");
      		String sentece=tuple.getString(4);
      		String[] words = sentece.split(" ");
      		for (String word:words){
      			collector.emit(new Values(word));
      		}
      	}
      
      	@Override
      	public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
      		outputFieldsDeclarer.declare(new Fields("words"));
      	}
      }
      
    • 编写WordCountBolt
      public class WordCountBolt extends BaseRichBolt {

      	private  OutputCollector collector;
      	private HashMap<String,Long> counts =null;
      
      	@Override
      	public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
      		this.collector = outputCollector;
      		this.counts = new HashMap<>();
      	}
      
      	@Override
      	public void execute(Tuple tuple) {
      		 String word = tuple.getStringByField("words");
      		// String word =tuple.getString(0);
      		Long count=this.counts.get(word);
      		if(count==null){
      			count=0L;
      		}
      		count++;
      		//出现就添加到map中,word相同的,会覆盖掉 所以最后的word就是准确的数据
      		this.counts.put(word,count);
      		this.collector.emit(new Values(word,count));
      	}
      
      	@Override
      	public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
      			outputFieldsDeclarer.declare(new Fields("word","count"));
      	}
      }
      
    • 编写ReportBolt
      public class ReportBolt extends BaseRichBolt {
      private HashMap<String,Long> counts=null;
      @Override
      public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
      this.counts=new HashMap<String,Long>();
      }

      	@Override
      	public void execute(Tuple input) {
      		String word=input.getStringByField("word");
      		Long count=input.getLongByField("count");
      		this.counts.put(word, count);
      
      
      		System.out.println("--------FINAL COUNTS--------");
      		List<String> keys=new ArrayList<String>();
      		keys.addAll(this.counts.keySet());
      		Collections.sort(keys);
      		for(String key:keys){
      			System.out.println(key+":"+this.counts.get(key));
      		}
      		System.out.println("----------------------------");
      	}
      
      	@Override
      	public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
      
      	}
      }
      
    • 编写Topology
      public class MainTopology {
      public static void main(String[] args)throws Exception {
      TopologyBuilder builder = new TopologyBuilder();
      KafkaSpoutConfig.Builder<String, String> kafkabuilder = KafkaSpoutConfig.builder("localhost:9092", "test");

      		//设置kafka属于哪个组
      		kafkabuilder.setGroupId("testgroup");
      		//创建kafkaspoutConfig
      		KafkaSpoutConfig<String, String> build = kafkabuilder.build();
      		//通过kafkaspoutconfig获取kafkaspout
      		KafkaSpout<String, String> kafkaSpout = new KafkaSpout<>(build);
      		//设置四个线程接收数据
      		builder.setSpout("kafkaspout",kafkaSpout,4);
      //		builder.setBolt("printBolt", new PrintBolt(),2).localOrShuffleGrouping("kafkaspout");
      
      		builder.setBolt("split-bolt",new SplitSentenceBolt(),2).setNumTasks(4).shuffleGrouping("kafkaspout");
      		// 有时候我们需要将特定数据的tuple路由到特殊的bolt实例中,在此我们使用fieldsGrouping
      		// 来保证所有"word"字段值相同的tuple会被路由到同一个WordCountBolt实例中
      		builder.setBolt("count-bolt",new WordCountBolt(),2).fieldsGrouping("split-bolt",new Fields("words"));
      		builder.setBolt("report-bolt",new ReportBolt()).globalGrouping("count-bolt");
      
      		Config config=new Config();
      		config.setDebug(false);
      		config.setNumWorkers(2);
      		LocalCluster cluster =new LocalCluster();
      		cluster.submitTopology("kafkaspout",config,builder.createTopology());
      
      	}
  • 相关阅读:
    1120. Maximum Average Subtree 子树平均值的最大值
    490. The Maze 迷宫踢足球
    323. Number of Connected Components in an Undirected Graph 连通图的数量
    done infosys_不告你答案的面试
    MyBatis(三)全局配置文件 之 typeHandlers 类型处理器
    MyBatis(三)全局配置文件 之 typeAliases 类型命名
    MyBatis(三)全局配置文件 之 properties 属性
    MyBatis(三)全局配置文件 之 settings 设置
    MyBatis(三)全局配置文件
    MyBatis(二)HelloWorld 案例
  • 原文地址:https://www.cnblogs.com/zhuguangzhe/p/9229808.html
Copyright © 2020-2023  润新知