Storm 实时读取本地文件操作(模拟分析网络日志)
- 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 实时读取本地文件操作(模拟分析网络日志)的更多相关文章
- H5读取本地文件操作
H5读取本地文件操作 本文转自:转:http://hushicai.com/2014/03/29/html5-du-qu-ben-di-wen-jian.html感谢大神分享. 常见的语言比如php. ...
- 【转】flash air中读取本地文件的三种方法
actionscript中读取本地文件操作有两种代码如下 1.使用File和FileStream两个类,FileStream负责读取数据的所以操作:(同步操作) var stream:FileStre ...
- Storm实时计算:流操作入门编程实践
转自:http://shiyanjun.cn/archives/977.html Storm实时计算:流操作入门编程实践 Storm是一个分布式是实时计算系统,它设计了一种对流和计算的抽象,概念比 ...
- .NET 读取本地文件绑定到GridViewRow
wjgl.aspx.cs: using System; using System.Collections; using System.Configuration; using System.Data; ...
- python 读取本地文件批量插入mysql
Uin_phone.txt 本地文件内容 有1000条,这里只是展示前几条,供参考 133584752 133584759 133584764 133584773 133584775 13358477 ...
- FileReader读取本地文件
FileReader是一种异步读取文件机制,结合input:file可以很方便的读取本地文件. 一.input:type[file] file类型的input会渲染为一个按钮和一段文字.点击按钮可打开 ...
- HTML5 本地文件操作之FileSystemAPI实例(三)
文件夹操作demo 1.读取根目录文件夹内容 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFi ...
- HTML5 本地文件操作之FileSystemAPI实例(二)
文件操作实例整理二 1.删除文件.复制文件.移动文件 //获取请求权限 window.requestFileSystem = window.requestFileSystem || window.we ...
- HTML5 本地文件操作之FileSystemAPI实例(一)
文件操作实例整理一 1.请求系统配额类型 console.info(window.TEMPORARY); //0 临时 console.info(window.PERSISTENT); //1 持久 ...
随机推荐
- Window文件目录遍历 和 WIN32_FIND_DATA 结构(非常详细的中文注释)
第一部分 *百度百科提供的内容总结:WIN32_FIND_DAT 第二部分 *程序实例 第三部分 *一篇使用FindFirstFile和FindNextFile函数的博文 第一部分 ...
- WIN10以后如果Manifest中不写支持WIN10的话,获取版本号的API获取的是6
if TOSVersion.Major = 10 then // 高版本的Delphi(比如Berlin)可以这样写 ShowMessage('Windows 10'); 或者: if Win32M ...
- VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)
IDE:VC6 今天遇到一个小问题,把我郁闷了好久,××医生的VulEngine不时在wcsstr处发生crash,加了一番强大的参数检查后,再加上了强大的try catch,其实不是很喜欢用try和 ...
- 三个臭皮匠,顶上一个诸葛亮——在Google Ideathon上Design Thinking分享
4月26日很荣幸的被邀请参加Google Ideathon做Design Thinking的分享. 这次主要分享了Design Thinking的基本方法流程,以及在真实项目的运用.现在整理一下当时选 ...
- 在本地安装RabbitMQ Server教程以及可能遇到的问题及解决办法
1. Download latest erlang OTP platform from : erlang:http://www.erlang.org/download.html (The latest ...
- Ajax中post与get的区别
get和post都是向服务器发送一种请求,只是发送机制不同 . 1. GET可以通过在请求URL上添加请求参数, 而POST请求则是作为HTTP消息的实体内容发送给WEB服务器. 2. get方式请求 ...
- vue+element——父级元素fixed,遮罩会在上方
前言 这种场景还是蛮场景的 一个共用的head组件,组件里面通常是当前系统登录账号名 退出登录 修改密码这样的弹框 但是现在我又想head不跟着main内容上下滑动.所以用了fixed 定位. 问题来 ...
- vmware centos7虚拟机克隆系统如何修改网卡设置?
1.克隆虚拟机,克隆前需关闭虚拟机2.克隆之后的网卡问题解决,其中需要修改HWADDR和UUID /etc/sysconfig/network-scripts/ifcfg-ens32 uuid获取 ...
- fork和僵尸进程
1. 关于fork fork()函数: 用于创建一个进程,所创建的进程复制父进程的代码段/数据段/BSS段/堆/栈等所有用户空间信息:在内核中操作系统重新为其申请了一个PCB,并使用父进程的PCB进行 ...
- Kali Linux Web渗透测试手册(第二版) - 1.0 - 渗透测试环境搭建
一.配置KALI Linux和渗透测试环境 在这一章,我们将覆盖以下内容: 在Windows和Linux上安装VirtualBox 创建一个Kali Linux虚拟机 更新和升级Kali Linux ...