kafka+storm java代码

一、flume和kafka整合请参照 http://blog.csdn.net/huguoping830623/article/details/48138319


二、示例

[html]  view plain copy
  1. package com.hgp.kafka.kafka;  
  2.   
  3. import java.util.Arrays;  
  4. import java.util.HashMap;  
  5. import java.util.Iterator;  
  6. import java.util.Map;  
  7. import java.util.Map.Entry;  
  8. import java.util.concurrent.atomic.AtomicInteger;  
  9.   
  10. import org.apache.commons.logging.Log;  
  11. import org.apache.commons.logging.LogFactory;  
  12.   
  13. import storm.kafka.BrokerHosts;  
  14. import storm.kafka.KafkaSpout;  
  15. import storm.kafka.SpoutConfig;  
  16. import storm.kafka.StringScheme;  
  17. import storm.kafka.ZkHosts;  
  18. import backtype.storm.Config;  
  19. import backtype.storm.LocalCluster;  
  20. import backtype.storm.StormSubmitter;  
  21. import backtype.storm.generated.AlreadyAliveException;  
  22. import backtype.storm.generated.InvalidTopologyException;  
  23. import backtype.storm.spout.SchemeAsMultiScheme;  
  24. import backtype.storm.task.OutputCollector;  
  25. import backtype.storm.task.TopologyContext;  
  26. import backtype.storm.topology.OutputFieldsDeclarer;  
  27. import backtype.storm.topology.TopologyBuilder;  
  28. import backtype.storm.topology.base.BaseRichBolt;  
  29. import backtype.storm.tuple.Fields;  
  30. import backtype.storm.tuple.Tuple;  
  31. import backtype.storm.tuple.Values;  
  32.   
  33. public class MyKafkaTopology {  
  34.   
  35.   public static class KafkaWordSplitter extends BaseRichBolt {  
  36.   
  37.     private static final Log LOG = LogFactory.getLog(KafkaWordSplitter.class);  
  38.     private static final long serialVersionUID = 886149197481637894L;  
  39.     private OutputCollector collector;  
  40.         
  41.     
  42.     public void prepare(Map stormConf, TopologyContext context,  
  43.         OutputCollector collector) {  
  44.       this.collector = collector;             
  45.     }  
  46.   
  47.     
  48.     public void execute(Tuple input) {  
  49.       String line = input.getString(0);  
  50.       LOG.info("RECV[kafka -> splitter] " + line);  
  51.       String[] words = line.split("\\s+");  
  52.       for(String word : words) {  
  53.         LOG.info("EMIT[splitter -> counter] " + word);  
  54.         collector.emit(input, new Values(word, 1));  
  55.       }  
  56.       collector.ack(input);  
  57.     }  
  58.   
  59.     
  60.     public void declareOutputFields(OutputFieldsDeclarer declarer) {  
  61.       declarer.declare(new Fields("word", "count"));          
  62.     }  
  63.         
  64.   }  
  65.       
  66.   public static class WordCounter extends BaseRichBolt {  
  67.   
  68.     private static final Log LOG = LogFactory.getLog(WordCounter.class);  
  69.     private static final long serialVersionUID = 886149197481637894L;  
  70.     private OutputCollector collector;  
  71.     private Map<String, AtomicInteger> counterMap;  
  72.         
  73.     
  74.     public void prepare(Map stormConf, TopologyContext context,  
  75.         OutputCollector collector) {  
  76.       this.collector = collector;      
  77.       this.counterMap = new HashMap<String, AtomicInteger>();  
  78.     }  
  79.   
  80.     
  81.     public void execute(Tuple input) {  
  82.       String word = input.getString(0);  
  83.       int count = input.getInteger(1);  
  84.       LOG.info("RECV[splitter -> counter] " + word + " : " + count);  
  85.       AtomicInteger ai = this.counterMap.get(word);  
  86.       if(ai == null) {  
  87.         ai = new AtomicInteger();  
  88.         this.counterMap.put(word, ai);  
  89.       }  
  90.       ai.addAndGet(count);  
  91.       collector.ack(input);  
  92.       LOG.info("CHECK statistics map: " + this.counterMap);  
  93.     }  
  94.   
  95.     
  96.     public void cleanup() {  
  97.       LOG.info("The final result:");  
  98.       Iterator<Entry<String, AtomicInteger>> iter = this.counterMap.entrySet().iterator();  
  99.       while(iter.hasNext()) {  
  100.         Entry<String, AtomicInteger> entry = iter.next();  
  101.         LOG.info(entry.getKey() + "\t:\t" + entry.getValue().get());  
  102.       }  
  103.           
  104.     }  
  105.   
  106.     
  107.     public void declareOutputFields(OutputFieldsDeclarer declarer) {  
  108.       declarer.declare(new Fields("word", "count"));          
  109.     }  
  110.   }  
  111.       
  112.   public static void main(String[] args) throws AlreadyAliveException, InvalidTopologyException, InterruptedException {  
  113.     String zks = "localhost:2181";  
  114.     String topic = "test";  
  115.     String zkRoot = "/storm"; // default zookeeper root configuration for storm  
  116.     String id = "word";  
  117.         
  118.     BrokerHosts brokerHosts = new ZkHosts(zks);  
  119.     SpoutConfig spoutConf = new SpoutConfig(brokerHosts, topic, zkRoot, id);  
  120.     spoutConf.scheme = new SchemeAsMultiScheme(new StringScheme());  
  121.     spoutConf.forceFromStart = true;  
  122.     spoutConf.zkServers = Arrays.asList(new String[] {"localhost"});  
  123.     spoutConf.zkPort = 2181;  
  124.         
  125.     TopologyBuilder builder = new TopologyBuilder();  
  126.     builder.setSpout("kafka-reader", new KafkaSpout(spoutConf), 5); // Kafka我们创建了一个5分区的Topic,这里并行度设置为5  
  127.     builder.setBolt("word-splitter", new KafkaWordSplitter(), 2).shuffleGrouping("kafka-reader");  
  128.     builder.setBolt("word-counter", new WordCounter()).fieldsGrouping("word-splitter", new Fields("word"));  
  129.         
  130.     Config conf = new Config();  
  131.         
  132.     String name = MyKafkaTopology.class.getSimpleName();  
  133.     if (args != null && args.length > 0) {  
  134.       // Nimbus host name passed from command line  
  135.       conf.put(Config.NIMBUS_HOST, args[0]);  
  136.       conf.setNumWorkers(3);  
  137.       StormSubmitter.submitTopologyWithProgressBar(name, conf, builder.createTopology());  
  138.     } else {  
  139.       conf.setMaxTaskParallelism(3);  
  140.       LocalCluster cluster = new LocalCluster();  
  141.       cluster.submitTopology(name, conf, builder.createTopology());  
  142.       Thread.sleep(60000);  
  143.       cluster.shutdown();  
  144.     }  
  145.   }  
  146. }  


pom.xml代码

[html]  view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   
  5.   <groupId>com.hgp.kafka</groupId>  
  6.   <artifactId>kafka</artifactId>  
  7.   <version>0.0.1-SNAPSHOT</version>  
  8.   <packaging>jar</packaging>  
  9.   
  10.   <name>kafka</name>  
  11.   <url>http://maven.apache.org</url>  
  12.   
  13.   <properties>  
  14.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  15.   </properties>  
  16.   
  17.   <dependencies>  
  18. <dependency>             
  19.  <groupId>org.apache.storm</groupId>               
  20.  <artifactId>storm-core</artifactId>               
  21.  <version>0.9.2-incubating</version>                
  22. <scope>provided</scope>          
  23.  </dependency>           
  24. <dependency>           
  25. <groupId>org.apache.kafka</groupId>          
  26.  <artifactId>kafka_2.10</artifactId>           
  27. <version>0.8.2.1</version>           
  28. <exclusions>              
  29.  <exclusion>                  
  30.  <groupId>org.apache.zookeeper</groupId>                   
  31. <artifactId>zookeeper</artifactId>               
  32. </exclusion>              
  33.  <exclusion>                  
  34.  <groupId>log4j</groupId>                   
  35. <artifactId>log4j</artifactId>              
  36.  </exclusion>          
  37.  </exclusions>      
  38.  </dependency>                   
  39. <dependency>               
  40. <groupId>org.apache.storm</groupId>              
  41. <artifactId>storm-kafka</artifactId>              
  42.  <version>0.9.2-incubating</version>         
  43. </dependency>  
  44.       
  45.   </dependencies>  
  46. </project>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值