storm如何集成kafka

来源:互联网 发布:太阳能发电 知乎 编辑:程序博客网 时间:2024/05/17 01:58

之前的kafka案例:http://blog.csdn.net/weixin_35757704/article/details/77196539

之前的storm案例:http://blog.csdn.net/weixin_35757704/article/details/77246313

首先要提醒:导包的时候要注意导入正确的包,如果出现强制类型转换或是方法不存在,对于新手来说多半是导包导错了

kafka与storm各自的模块了解之后,就要开始集成了.他们都要拿出自己的一部分东西:

  • storm拿出spout给kafka,即数据源交给kafka
  • kafka拿出自身的消费者,将消费者变为storm
那么,逻辑就很简单了,现在只需要在Spout类上动手脚就可以了.如果到这里不是很懂,建议参考头顶上的那两篇博客;

修改即可(在开头的storm案例里的代码的基础上进行修改)
直接更改代表着整个拓扑的Topology类就好:
import backtype.storm.Config;import backtype.storm.LocalCluster;import backtype.storm.StormSubmitter;import backtype.storm.spout.SchemeAsMultiScheme;import backtype.storm.topology.TopologyBuilder;import backtype.storm.tuple.Fields;import storm.kafka.*;public class TopologyWordCount {    public static void main(String[] args) throws Exception {        TopologyBuilder builder = new TopologyBuilder();        // BrokerHosts接口有2个实现类StaticHosts和ZkHosts,ZkHosts会定时(默认60秒)从ZK中更新brokers的信息,StaticHosts是则不会        // 要注意这里的第二个参数brokerZkPath要和kafka中的server.properties中配置的zookeeper.connect对应,没有专门配置就可以不填写,使用默认值        BrokerHosts brokerHosts = new ZkHosts("192.168.0.171:2181," + "192.168.0.207:2181," + "192.168.0.204:2181");        // 定义spoutConfig        // 第一个参数hosts是上面定义的brokerHosts        // 第二个参数topic是该Spout订阅的topic名称,需要提前创建这个topic        // 第三个参数zkRoot是存储消费的offset(存储在zookeeper中了),也就是当这个Topology遇到故障重启后会将故障期间未消费的message继续消费而不会丢失(可不配置)        // 第四个参数id是当前spout的唯一标识,当存在多个spout时,id不能冲突        SpoutConfig spoutConfig = new SpoutConfig(brokerHosts, "shuaige33333", "", "0");        // 定义kafkaSpout如何解析数据,这里是将kafka的producer send的数据放入到String        // 类型的str变量中输出,这个str是StringSchema定义的变量名称        /*通过字符串的方式解析数据*/        spoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme());        /*开始拓扑套路*/        builder.setSpout("kafkaSpout", new KafkaSpout(spoutConfig));        /*kafka 的spout*/        builder.setBolt("WordSplitBolt", new WordSplitBolt()).shuffleGrouping("kafkaSpout");        /*WordCountBolt获得从WordSplitBolt中传递过来的单词并统计词频*/        builder.setBolt("WordCountBolt", new WordCountBolt()).fieldsGrouping("WordSplitBolt", new Fields("word"));        // 本地运行或者提交到集群        if (args != null && args.length == 1) {            // 集群运行            StormSubmitter.submitTopology(args[0], new Config(), builder.createTopology());        } else {            // 本地运行            LocalCluster cluster = new LocalCluster();            cluster.submitTopology("local", new Config(), builder.createTopology());            Thread.sleep(10000000);            cluster.shutdown();        }    }}

只需要更改TopologyWordCount,就可以将storm集成kafka,将storm作为kafka的消费者,之后的那些逻辑就可以自己来写了.
注意这里:
builder.setSpout("kafkaSpout", new KafkaSpout(spoutConfig));
这里的KafkaSpout 是官方的Spout,在下一个bolt进行数据的提取时,要使用的方法是:

public void execute(Tuple input, BasicOutputCollector basicOutputCollector) {        String line = input.getStringByField("str");//得到进入kafka的字符串        for (String word : line.split(" ")) {            basicOutputCollector.emit(new Values(word));        }    }

然后就可以测试了:


整体思路:
先把向kafka发送数据的那个类写好(看头顶第一篇博客),然后再练习storm(第二篇博客),然后更改掉Topology类与Spout类就好