计数

直接上代码

  1. public class LocalStormSumTopology {
  2. public static void main(String[] agrs) {
  3. //Topology是通过build模式创建出来的
  4. //storm中的所有作业都是通过topology来指定的
  5. TopologyBuilder builder = new TopologyBuilder();
  6. //在设置bolt到topology时,需要设置该bolt的上游的spout或者bolt的id,这样topology才知道该bolt的执行顺序,有点类似于单向链表结构,
  7. //每一个环节持有上一个环节的引用,在bolt这里是持有上一个环节的id,这样同样可以定位到上一个环节
  8. builder.setSpout("DataSourceSpout", new DataSourceSpout());
  9. builder.setBolt("TotalBolt", new TotalBolt()).shuffleGrouping("DataSourceSpout");
  10. //启动一个本地的Storm集群,不需要搭真正的集群,本地集群使用LocalCluster来提交topology,如果是在生产环境上提交topology,那么使用
  11. //这个类StormSubmitter来代替LocalCluster来提交topology
  12. LocalCluster cluster = new LocalCluster();
  13. cluster.submitTopology("LocalStormSumTopology", new Config(), builder.createTopology());
  14. }
  15. private static final String NUM = "num";
  16. /**
  17. * 发送数据源的spout类,一般是继承BaseRichSpout这个类
  18. */
  19. public static class DataSourceSpout extends BaseRichSpout {
  20. private SpoutOutputCollector mCollector;
  21. int num;
  22. /**
  23. * 在storm开始的开始工作前回调一次,在这里做初始化
  24. *
  25. * @param conf 配置参数
  26. * @param context 上下文
  27. * @param collector 数据发射器,用来将数据发送到bolt中,类似于rxjava的数据发射器
  28. */
  29. public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
  30. this.mCollector = collector;
  31. }
  32. /**
  33. * 这是一个死循环方法,会自动循环调用,这个方法用来发送数据到下游
  34. */
  35. public void nextTuple() {
  36. //将数据发射到bolt中,一般使用Values这个类,传入的是可变参数,底层封装成ArrayList
  37. mCollector.emit(new Values(++num));
  38. System.out.println("从spout发射出的数据:" + num);
  39. Utils.sleep(1000);
  40. }
  41. /**
  42. * 声明从spout中发射的数据的字段名,在bolt阶段可以通过这里预设置的字段名进行取值,类似于安卓中的使用sp传输,
  43. * 字段名和发送出来的数据一一对应,这样如果下游需要接收多个数据发射源,那么可以通过该字段名来做区别
  44. *
  45. * @param declarer
  46. */
  47. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  48. //一般使用Fields来进行封装字段名fields底层封装了ArrayList<String>
  49. declarer.declare(new Fields(NUM));
  50. }
  51. @Override
  52. public void close() {
  53. this.mCollector = null;
  54. }
  55. }
  56. public static class TotalBolt extends BaseRichBolt {
  57. private int sum = 0;
  58. /**
  59. * 初始化方法,跟spout中的open方法类似,只会调用一次,在这里做初始化
  60. *
  61. * @param stormConf
  62. * @param context
  63. * @param collector
  64. */
  65. public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
  66. }
  67. /**
  68. * 每从上游接收到一个数据,就调用该方法回调过来
  69. *
  70. * @param input 用来提取上一个流程传过来的数据
  71. */
  72. public void execute(Tuple input) {
  73. //通过在上游设置的字段名来获取数据
  74. Integer integerByField = input.getIntegerByField(NUM);
  75. sum += integerByField;
  76. System.out.println("累加的结果是:" + sum);
  77. }
  78. /**
  79. * 为往下游发送的数据加上字段名,方面区别数据的来源
  80. * @param declarer
  81. */
  82. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  83. }
  84. }
  85. }

词频统计

直接上代码

  1. public class LocalWorldCountStormTopology {
  2. public static void main(String[] agrs) {
  3. TopologyBuilder builder = new TopologyBuilder();
  4. builder.setSpout("DataSourceSpout", new DataSourceSpout());
  5. builder.setBolt("CountBolt", new CountBolt()).shuffleGrouping("DataSourceSpout");
  6. LocalCluster cluster = new LocalCluster();
  7. cluster.submitTopology("LocalWorldCountStormTopology", new Config(), builder.createTopology());
  8. }
  9. /**
  10. * 输出每一行文本的spout
  11. */
  12. public static class DataSourceSpout extends BaseRichSpout {
  13. private SpoutOutputCollector mCollector;
  14. public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
  15. this.mCollector = collector;
  16. }
  17. public void nextTuple() {
  18. //通过这个方法,可以获取到某一个文件夹下所有符合规定后缀的文件,并且可以设置是否递归获取
  19. Collection<File> files = FileUtils.listFiles(new File("/Users/teng/Downloads"), new String[]{"txt"}, true);
  20. try {
  21. for (File file : files) {
  22. //因为下一步还需要做切割,因此需要先将文件一行一行取出来,放在String集合中
  23. List<String> lines = FileUtils.readLines(file);
  24. for (String line : lines) {
  25. //使用,进行分割
  26. String[] split = line.split(",");
  27. //发射单词出去
  28. for (String s : split) {
  29. mCollector.emit(new Values(s));
  30. }
  31. }
  32. //执行完成一次之后,需要修改文件名,这样就不用一直执行
  33. FileUtils.moveFile(file, new File(file.getAbsolutePath()+System.currentTimeMillis()));
  34. }
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  40. //定义数据的字段名
  41. declarer.declare(new Fields("word"));
  42. }
  43. }
  44. /**
  45. * 统计词频的bolt
  46. */
  47. public static class CountBolt extends BaseRichBolt {
  48. private Map<String, Integer> map = new HashMap<String, Integer>();
  49. public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
  50. }
  51. public void execute(Tuple input) {
  52. String word = input.getStringByField("word");
  53. Integer num = map.get(word);
  54. if (num == null) {
  55. num = 1;
  56. } else {
  57. num++;
  58. }
  59. map.put(word, num);
  60. System.out.println("~~~~~~~~~");
  61. Set<Map.Entry<String, Integer>> entries = map.entrySet();
  62. for (Map.Entry<String, Integer> entry : entries) {
  63. System.out.println(entry.getKey() + "出现的次数为:" + entry.getValue());
  64. }
  65. }
  66. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  67. }
  68. }
  69. }

使用storm分别进行计数和词频统计的更多相关文章

  1. 使用Storm进行词频统计

    词频统计 1.需求:读取指定目录的数据,并且实现单词计数功能 2.实现方案: Spout用于读取指定文件夹(目录),读取文件,将文件的每一行发射到Bolt SplitBolt用于接收Spout发射过来 ...

  2. python瓦登尔湖词频统计

    #瓦登尔湖词频统计: import string path = 'D:/python3/Walden.txt' with open(path,'r',encoding= 'utf-8') as tex ...

  3. c#词频统计命令行程序

    这里将用c#写一个关于词频统计的命令行程序. 预计时间分配:输入处理3h.词条排序打印2h.测试3h. 实际时间分配:输入处理1h.词条排序打印2h.测试3h.程序改进优化6h. 下面将讲解程序的完成 ...

  4. 词频统计 SPEC 20160911

    本文档随时可能修改,并且没有另行通知. 请确保每一次在开始修改你的代码前,读标题中的日期,如果晚于你上次阅读, 请重读一次. 老五在寝室吹牛他熟读过<鲁滨逊漂流记>,在女生面前吹牛热爱&l ...

  5. 软工结对项目之词频统计update

    队友 胡展瑞 031602215 作业页面 GitHub 具体分工 111500206 赵畅:负责WordCount的升级,添加新的命令行参数支持(自定义输入输出文件,权重词频统计,词组统计等所有新功 ...

  6. HW—词频统计

    第一次个人作业——词频统计 第一次做这种大作业,明显感觉陌生,各种规范和技能也是第一次使用,希望自己好运. 目录:一.基本要求 二.需求分析及时间估计 三.实现思路及过程 四.测试用例.时间性能分析及 ...

  7. Hadoop基础学习(一)分析、编写并执行WordCount词频统计程序

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jiq408694711/article/details/34181439 前面已经在我的Ubuntu ...

  8. python复合数据类型以及英文词频统计

    这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2753. 1.列表,元组,字典,集合分别如何增删改查及遍历. 列 ...

  9. 作业3-个人项目<词频统计>

    上了一天的课,现在终于可以静下来更新我的博客了.       越来越发现,写博客是一种享受.来看看这次小林老师的“作战任务”.                词频统计 单词: 包含有4个或4个以上的字 ...

随机推荐

  1. IDEA的配置文件访问

    问题起源 IDEA中当前模块的配置文件无法被访问,只能够访问到外层的Project的配置文件.具体情形可表示如下: Project --------------- project.properties ...

  2. chrome下input文本框自动填充背景问题解决

    chrome下input文本框会自动填充背景,只需要给文本框加一个样式即可解决问题 input:-webkit-autofill {-webkit-box-shadow: 0 0 0px 1000px ...

  3. haproxy下X-Frame-Options修复方法

    X-Frame-Options是网页常见漏洞之一,在其他的frame下加载你网页的内容,达到劫持的目的. 修复方法很简单,在http 请求投中添加X-Frame-Options参数.网上可以查一下Ap ...

  4. eclipse设置git忽略文件

    使用eclipse开发的程序员们经常会接触版本控制软件,这里只要说下eclipse使用egit的情况下设置忽略文件. 特此说明在这里使用window->team->ignored对于git ...

  5. centos/linux下的使得maven/tomcat能在普通用户是使用

    以下操作#代表在root用户下使用 $表示在普通用户下使用 1.创建新用户 # useradd lonecloud 2.设置该用户的密码 # passwd lonecloud 3.因为昨天将tomca ...

  6. Linux下添加自定义脚本到开机自启动,标准rpm,举例:设置Apache自启动

    写一个脚本,名字为:autostart.sh,放在/etc/init.d/目录下,赋予权限chmod +x /etc/init.d/autostart.sh 代码如下 #!/bin/sh #chkco ...

  7. Django在form提交CSRF验证失败. 相应中断问题

    CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因. Your browser is accepting cookies. The view function passe ...

  8. 在linux ubuntu下搭建深度学习/机器学习开发环境

    一.安装Anaconda 1.下载 下载地址为:https://www.anaconda.com/download/#linux 2.安装anaconda,执行命令: bash ~/Downloads ...

  9. SpringMVC的常用注解

             在SpringMVC中常用的注解主要都是用于Controller上,所以下面的四大不同类型的注解都是根据它们处理的request的不同内容部分来区分的:         处理requ ...

  10. linux 搭建CA服务器 http+ssl mail+ssl 扫描与抓包

    搭建CA服务器 CA服务是给服务器发放数字证书,被通信双方信任,独立的第三方机构 国内常见的CA机构 中国金融认证中心(CFCA) 中国电信安全认证中心(CTCA) 北京数字证书认证中心(BJCA) ...