• WebLogProduct

    产生日志类
package top.wintp.weblog;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Random;
import java.util.UUID; /**
* @description: description:生成网络日志
* <p>
* @author: upuptop
* <p>
* @qq: 337081267
* <p>
* @CSDN: http://blog.csdn.net/pyfysf
* <p>
* @cnblogs: http://www.cnblogs.com/upuptop
* <p>
* @blog: http://wintp.top
* <p>
* @email: pyfysf@163.com
* <p>
* @time: 2019/06/2019/6/5
* <p>
*/
public class WebLogProduct {
public static void main(String[] args) {
//网站
String[] webUrl = {
"http://www.wintp.top",
"http://upuptop.top",
"http://github.com",
"http://gitee.com"};
//用户会话id
String[] userSessionId = {
"F5CC242E006B4A81BDE72E03BC7BD34D",
"FA8C3631CE024ED5B98A65EE7F2600E2",
"52EF144D16C24AC0912003539654824A",
"F78F115B613A495F961B194EB2A377C6"}; String[] scanDate = {
"2019-6-5 23:29:00",
"2019-4-5 22:39:20",
"2019-7-5 21:09:05",
"2019-8-5 20:19:08"
}; StringBuilder sb = new StringBuilder(); for (int i = 0; i < 30; i++) {
int randomIndex = new Random().nextInt(3); sb.append(webUrl[randomIndex])
.append("\t")
.append(userSessionId[randomIndex])
.append("\t")
.append(scanDate[randomIndex])
.append("\n"); } FileOutputStream fos = null;
try {
fos = new FileOutputStream("E:/weblog.log");
fos.write(sb.toString().getBytes()); System.out.println("write weblog.log success");
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("write weblog.log fail"); } catch (IOException e) {
e.printStackTrace();
System.out.println("write weblog.log fail"); } finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} } }
  • WebLogSpout

    读取日志类

package top.wintp.weblog;

import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map; /**
* @description: description:
* <p>
* @author: upuptop
* <p>
* @qq: 337081267
* <p>
* @CSDN: http://blog.csdn.net/pyfysf
* <p>
* @cnblogs: http://www.cnblogs.com/upuptop
* <p>
* @blog: http://wintp.top
* <p>
* @email: pyfysf@163.com
* <p>
* @time: 2019/06/2019/6/5
* <p>
*/
public class WebLogSpout extends BaseRichSpout { private SpoutOutputCollector collector;
private BufferedReader mReader; public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
//向下写出数据使用
this.collector = spoutOutputCollector;
// 初始化方法 读取文件
try {
mReader = new BufferedReader(new FileReader("E:/weblog.log"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} } String log = null; public void nextTuple() {
//循环调用该方法 在这里面读取数据
try {
while (null != (log = mReader.readLine())) {
//写出数据
this.collector.emit(new Values(log));
} } catch (IOException e) {
e.printStackTrace();
} } public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
//写出数据的名称
outputFieldsDeclarer.declare(new Fields("log"));
}
}
  • WebLogBlot

    处理日志类
package top.wintp.weblog;

import org.apache.storm.topology.BasicOutputCollector;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseBasicBolt;
import org.apache.storm.tuple.Tuple;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class WebLogBlot extends BaseBasicBolt {
private static final Logger logger = LoggerFactory.getLogger(WebLogBlot.class);
/**
* 统计数据个数
*/
private int count; public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
count++; // 处理数据的方法
//http://www.wintp.top F5CC242E006B4A81BDE72E03BC7BD34D 2019-6-5 23:29:00
String log = tuple.getStringByField("log"); String[] split = log.split("\t");
String webUrl = split[0];
String userSessionId = split[1]; logger.error("WebLogBlot execute() sessionId:{},ThreadId:{},webUrl:{},count:{} ", userSessionId, Thread.currentThread().getId(), webUrl, count);
} public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
//不需要在向下写出数据
}
}
  • WebLogDevice

    提交拓扑测试类
package top.wintp.weblog;

import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.generated.AlreadyAliveException;
import org.apache.storm.generated.AuthorizationException;
import org.apache.storm.generated.InvalidTopologyException;
import org.apache.storm.topology.TopologyBuilder; public class WebLogDevice {
public static void main(String[] args) {
// 创建拓扑
TopologyBuilder topologyBuilder = new TopologyBuilder();
// 设置spout bolt
topologyBuilder.setSpout("WebLogSpout", new WebLogSpout(), 1);
topologyBuilder.setBolt("WebLogBolt", new WebLogBlot(), 1).shuffleGrouping("WebLogSpout"); // 获取配置
Config config = new Config();
// 设置workers
config.setNumWorkers(1); // 提交拓扑
if (args.length > 0) {
// 集群提交
try {
StormSubmitter.submitTopology(args[0], config, topologyBuilder.createTopology());
} catch (AlreadyAliveException e) {
e.printStackTrace();
} catch (InvalidTopologyException e) {
e.printStackTrace();
} catch (AuthorizationException e) {
e.printStackTrace();
}
} else {
// 本地提交
LocalCluster localCluster = new LocalCluster();
localCluster.submitTopology("WebLogTopology", config, topologyBuilder.createTopology());
} } }
  • 控制台打印结果

不关闭程序,修改日志文件(注意分割的格式使用\t)控制台打印结果追加

Storm 实时读取本地文件操作(模拟分析网络日志)的更多相关文章

  1. H5读取本地文件操作

    H5读取本地文件操作 本文转自:转:http://hushicai.com/2014/03/29/html5-du-qu-ben-di-wen-jian.html感谢大神分享. 常见的语言比如php. ...

  2. 【转】flash air中读取本地文件的三种方法

    actionscript中读取本地文件操作有两种代码如下 1.使用File和FileStream两个类,FileStream负责读取数据的所以操作:(同步操作) var stream:FileStre ...

  3. Storm实时计算:流操作入门编程实践

    转自:http://shiyanjun.cn/archives/977.html Storm实时计算:流操作入门编程实践   Storm是一个分布式是实时计算系统,它设计了一种对流和计算的抽象,概念比 ...

  4. .NET 读取本地文件绑定到GridViewRow

    wjgl.aspx.cs: using System; using System.Collections; using System.Configuration; using System.Data; ...

  5. python 读取本地文件批量插入mysql

    Uin_phone.txt 本地文件内容 有1000条,这里只是展示前几条,供参考 133584752 133584759 133584764 133584773 133584775 13358477 ...

  6. FileReader读取本地文件

    FileReader是一种异步读取文件机制,结合input:file可以很方便的读取本地文件. 一.input:type[file] file类型的input会渲染为一个按钮和一段文字.点击按钮可打开 ...

  7. HTML5 本地文件操作之FileSystemAPI实例(三)

    文件夹操作demo 1.读取根目录文件夹内容 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFi ...

  8. HTML5 本地文件操作之FileSystemAPI实例(二)

    文件操作实例整理二 1.删除文件.复制文件.移动文件 //获取请求权限 window.requestFileSystem = window.requestFileSystem || window.we ...

  9. HTML5 本地文件操作之FileSystemAPI实例(一)

    文件操作实例整理一 1.请求系统配额类型 console.info(window.TEMPORARY); //0 临时 console.info(window.PERSISTENT); //1 持久 ...

随机推荐

  1. mysql8解压版安装

    1.下载 下载mysql8 2.安装 ① 解压到需要安装的目录,然后新建一个my.ini(位于解压目录下,与bin目录在同一个目录下) # For advice on how to change se ...

  2. Qt4.85静态编译配置VS动态编译(非常详细的图文教程)

    http://www.qter.org/forum.php?mod=viewthread&tid=1409&extra=page%3D1&page=1

  3. BI-学习之 商业智能项目工具安装

    首先咱们先需要下载一个工具,Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2012并安装: 我目前 ...

  4. 用Go语言异常机制模拟TryCatch异常捕捉1

    有的同学看到Go和TryCatch一起出现,心里可能会说,难道Go语言升级了,加入了try...catch语句.哈哈,其实Go语言从创建之初就没打算加入try...catch语句,因为创建Go的那帮大 ...

  5. C++实现半透明按钮控件(PNG,GDI+)

    http://blog.csdn.net/witch_soya/article/details/6889904

  6. Anaconada安装

    目录 Anaconda介绍 Anaconda下载 安装Anaconda 配置环境变量 管理虚拟环境 activate 切换环境 卸载环境 关于环境总结 安装第三方包 卸载第三方包 查看环境包信息 导入 ...

  7. 设计模式之装饰器模式(decorator pattern)

    装饰器模式主要对现有的类对象进行包裹和封装,以期望在不改变类对象及其类定义的情况下,为对象添加额外功能.是一种对象结构型模式.需要注意的是,该过程是通过调用被包裹之后的对象完成功能添加的,而不是直接修 ...

  8. ajax中error函数参数与返回值详解 200 300 400 500

    201-206:都表示服务器成功处理了请求的状态代码,说明网页可以正常访问. 200:(成功) 服务器已成功处理了请求.通常,这表示服务器提供了请求的网页. 201:(已创建) 请求成功且服务器已创建 ...

  9. 高并发IM系统架构优化实践

    互联网+时代,消息量级的大幅上升,消息形式的多元化,给即时通讯云服务平台带来了非常大的挑战.高并发的IM系统背后究竟有着什么样的架构和特性? 以上内容由网易云信首席架构师内部分享材料整理而成 相关阅读 ...

  10. 【JDK8】HashMap集合 源码阅读

    JDK8的HashMap数据结构上复杂了很多,因此读取效率得以大大提升,关于源码中红黑树的增删改查,博主没有细读,会在下一篇博文中使用Java实现红黑树的增删改查. 下面是类的结构图: 代码(摘抄自J ...