Storm入门程序——WordCount

本文介绍了一个使用Apache Storm实现的简单实时词频统计系统。该系统包括三个主要组件:WordReader Spout用于从指定路径读取文本文件并发送数据;WordSpliter Bolt将接收到的文本行分割成单词;WordCounter Bolt统计每个单词出现的次数,并定期输出统计结果。

spout:

WordReader:

package spout;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;

/**
Author:Benjamin  
 */
public class WordReader extends BaseRichSpout{


    //SpoutOutputCollector 发射器,负责向外面发射数据
    //conf 配置信息
    //private static final long serialVersionUID = 2756293133996402960L;
    private String inputpath;
    private SpoutOutputCollector collector;
    //当一个task被初始化时会调用此open方法
    public void open(Map conf, TopologyContext context,
            SpoutOutputCollector collector) {
         inputpath = (String) conf.get("INPUTPATH");
         this.collector = collector;
    }
    //这个方法会被一直调用
    public void nextTuple() {

        Collection<File> listFiles = FileUtils.listFiles(new File(inputpath), new String[]{"txt"}, true);
        for (File file : listFiles) {
            try {
                List<String> readLines = FileUtils.readLines(file);
                for (String line : readLines) {
                    this.collector.emit(new Values(line));
                }
                FileUtils.moveFile(file, new File(file.getAbsolutePath()+System.currentTimeMillis()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //声明发射的字段
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields("line"));
    }

}

Bolt:

WordSpliter:

package bolt;

import java.util.Map;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;

/**
Author:Benjamin  
 */
public class WordSpliter extends BaseRichBolt{


    //private static final long serialVersionUID = -3411512160818196264L;


    OutputCollector collector;
    @Override
    public void prepare(Map stormConf, TopologyContext context,
            OutputCollector collector) {
        this.collector = collector;
    }

    //一直执行
    @Override
    public void execute(Tuple input) {
        String stringByField = input.getStringByField("line");
        String[] split = stringByField.split(" ");
        for (String word : split) {
            this.collector.emit(new Values(word));
        }
    }

    @Override
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields("word"));
    }   
}

WordCounter:

package bolt;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Tuple;

/**
Author:Benjamin  
 */
public class WordCounter extends BaseRichBolt{

    /**
     * 
     */
    //private static final long serialVersionUID = -8840777246416063904L;

    OutputCollector collector;
    HashMap<String, Integer> hashmap = new HashMap<String, Integer>();
    @Override
    public void prepare(Map stormConf, TopologyContext context,
            OutputCollector collector) {
        this.collector = collector;
        //每三秒统计一次
        new Thread(new Runnable() {

            @Override
            public void run() {

                while(true){
                    System.out.println("=======================");
                    for (Entry<String, Integer> entry : hashmap.entrySet()) {
                        System.out.println(entry.getKey()+"====="+entry.getValue());
                    }
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }

    @Override
    public void execute(Tuple input) {
        String word = input.getStringByField("word");
        Integer integer = hashmap.get(word);

        if(integer == null){
            hashmap.put(word, 1);
        }else {
            hashmap.put(word, integer+1);
        }


    }

    @Override
    public void declareOutputFields(OutputFieldsDeclarer declarer) {

    }
}

Topology:

package topolopy;

import spout.WordReader;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.topology.TopologyBuilder;
import bolt.WordCounter;
import bolt.WordSpliter;

/**
Author:Benjamin  
 */
public class WordCountTopo {

    public static void main(String[] args) {

        TopologyBuilder topologyBuilder = new TopologyBuilder();
        topologyBuilder.setSpout("wordreader", new WordReader());
        topologyBuilder.setBolt("wordspliter", new WordSpliter()).shuffleGrouping("wordreader");
        topologyBuilder.setBolt("wordcounter", new WordCounter()).shuffleGrouping("wordspliter");

        Config config = new Config();
        config.put("INPUTPATH", "j:\\inputdir");
        LocalCluster localCluster = new LocalCluster();
        localCluster.submitTopology("wordcount", config, topologyBuilder.createTopology());
    }

}
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制方法。通过结合数据驱动技术与Koopman算子理论,将非线性系统动态近似为高维线性系统,进而利用递归神经网络(RNN)建模并实现系统行为的精确预测。文中详细阐述了模型构建流程、线性化策略及在预测控制中的集成应用,并提供了完整的Matlab代码实现,便于科研人员复现实验、优化算法并拓展至其他精密控制系统。该方法有效提升了纳米级定位系统的控制精度与动态响应性能。; 适合人群:具备自动控制、机器学习或信号处理背景,熟悉Matlab编程,从事精密仪器控制、智能制造或先进控制算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①实现非线性动态系统的数据驱动线性化建模;②提升纳米定位平台的轨迹跟踪与预测控制性能;③为高精度控制系统提供可复现的Koopman-RNN融合解决方案; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注Koopman观测矩阵构造、RNN训练流程与模型预测控制器(MPC)的集成方式,鼓励在实际硬件平台上验证并调整参数以适应具体应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值