flink SourceFunction SinkFunction timeWindowAll reduce
1、实现SourceFunction接口生成数据源
/**
* @Description: 产生数据 traceid,userid,timestamp,status,response time
*/
public class SourceData implements SourceFunction<String> {
private volatile boolean Running = true;
static int status[] = {200, 404, 500, 501, 301}; @Override
public void run(SourceContext<String> ctx) throws Exception {
while (Running) {
Thread.sleep((int) (Math.random() * 10)); StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(UUID.randomUUID().toString());
stringBuffer.append(",");
stringBuffer.append((int) (Math.random() * 100));
stringBuffer.append(",");
stringBuffer.append(System.currentTimeMillis());
stringBuffer.append(",");
stringBuffer.append(status[(int) (Math.random() * 4)]);
stringBuffer.append(",");
stringBuffer.append((int)(Math.random()*200)); ctx.collect(stringBuffer.toString());
}
} @Override
public void cancel() { }
}
2、实现SinkFunction接口,实现数据下沉存储及使用
public class TraceSourceData {
public static void main(String args[]) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Tuple5<String, Integer, Long, Integer, Integer>> ds =
env.addSource(new SourceData())
.flatMap(new FlatMapFunction<String, Tuple5<String, Integer, Long, Integer, Integer>>() {
@Override
public void flatMap(String value, Collector<Tuple5<String, Integer, Long, Integer, Integer>> out) throws Exception {
String ss[] = value.split(",");
out.collect(Tuple5.of(ss[0], Integer.parseInt(ss[1]), Long.parseLong(ss[2]), Integer.parseInt(ss[3]), Integer.parseInt(ss[4])));
}
});
//5秒窗口统计各状态的次数
DataStream<Tuple2<Integer, Integer>> statusData = ds
.flatMap(new FlatMapFunction<Tuple5<String, Integer, Long, Integer, Integer>, Tuple2<Integer, Integer>>() {
@Override
public void flatMap(Tuple5<String, Integer, Long, Integer, Integer> value, Collector<Tuple2<Integer, Integer>> out) throws Exception {
out.collect(Tuple2.of(value.f3, 1));
}
})
.keyBy(0)
.timeWindow(Time.seconds(5))
.sum(1);
statusData.print().setParallelism(1);
//5秒窗口统计响应时间大于50的用户访问次数在整个响应中的占比
//大于50,小于等于50,所有次数
DataStream<Tuple3<Integer, Integer, Integer>> greater100UserPer = ds
.flatMap(new FlatMapFunction<Tuple5<String, Integer, Long, Integer, Integer>, Tuple3<Integer, Integer, Integer>>() {
@Override
public void flatMap(Tuple5<String, Integer, Long, Integer, Integer> value, Collector<Tuple3<Integer, Integer, Integer>> out) throws Exception {
if (value.f4 > 50)
out.collect(Tuple3.of(1, 0, 1));
else
out.collect(Tuple3.of(0, 1, 1));
}
})//注意这里,没有使用keyBy
.timeWindowAll(Time.seconds(5))
.reduce(new ReduceFunction<Tuple3<Integer, Integer, Integer>>() {
@Override
public Tuple3<Integer, Integer, Integer> reduce(Tuple3<Integer, Integer, Integer> value1, Tuple3<Integer, Integer, Integer> value2) throws Exception {
return Tuple3.of(value1.f0 + value2.f0, value1.f1 + value2.f1, value1.f2 + value2.f2);
}
})//正常情况下应该重新起一个Double的数据类型,这里懒得麻烦,直接就做map转换了
.map(new MapFunction<Tuple3<Integer, Integer, Integer>, Tuple3<Integer, Integer, Integer>>() {
@Override
public Tuple3<Integer, Integer, Integer> map(Tuple3<Integer, Integer, Integer> value) throws Exception {
Double rate1 = (value.f0.doubleValue() / value.f2.doubleValue()) * 100;
Double rate2 = (value.f1.doubleValue() / value.f2.doubleValue()) * 100;
return Tuple3.of(rate1.intValue(), rate2.intValue(), 1);
}
});
//SinkFunction,实现接口后,可以随意处理数据
greater100UserPer.addSink(new SinkFunction<Tuple3<Integer, Integer, Integer>>() {
@Override
public void invoke(Tuple3<Integer, Integer, Integer> value, Context context) throws Exception {
System.out.println(LocalDateTime.ofInstant(Instant.ofEpochMilli(context.timestamp()), ZoneId.systemDefault()) + " " + value);
}
});
env.execute("TraceSourceData");
}
}
flink SourceFunction SinkFunction timeWindowAll reduce的更多相关文章
- [源码解析] Flink的groupBy和reduce究竟做了什么
[源码解析] Flink的groupBy和reduce究竟做了什么 目录 [源码解析] Flink的groupBy和reduce究竟做了什么 0x00 摘要 0x01 问题和概括 1.1 问题 1.2 ...
- Generic/Template Programming in Flink
Generic/Template Programming in Flink SourceFunction<T> @Public public interface SourceFunctio ...
- [源码解析] GroupReduce,GroupCombine 和 Flink SQL group by
[源码解析] GroupReduce,GroupCombine和Flink SQL group by 目录 [源码解析] GroupReduce,GroupCombine和Flink SQL grou ...
- [源码解析] Flink UDAF 背后做了什么
[源码解析] Flink UDAF 背后做了什么 目录 [源码解析] Flink UDAF 背后做了什么 0x00 摘要 0x01 概念 1.1 概念 1.2 疑问 1.3 UDAF示例代码 0x02 ...
- Alink漫谈(八) : 二分类评估 AUC、K-S、PRC、Precision、Recall、LiftChart 如何实现
Alink漫谈(八) : 二分类评估 AUC.K-S.PRC.Precision.Recall.LiftChart 如何实现 目录 Alink漫谈(八) : 二分类评估 AUC.K-S.PRC.Pre ...
- Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树
Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 目录 Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 0x00 摘要 0x01 背景概念 1.1 词向量基础 ...
- flink Reduce、GroupReduce、GroupCombine笔记
1.reduce操作,在分组的dataset上使用,也可以在不分组的dataset上使用 应用于分组DataSet的Reduce转换使用用户定义的reduce函数将每个组减少为单个元素.对于每组输入元 ...
- flink流处理从0到1
一.DataStream API之Data Sources(消费者之数据源) 介绍: source是程序的数据源输入,你可以通过StreamExecutionEnvironment.addSource ...
- flink实时数仓从入门到实战
第一章.flink实时数仓入门 一.依赖 <!--Licensed to the Apache Software Foundation (ASF) under oneor more contri ...
随机推荐
- 简单python爬虫实例
先放上url,https://music.douban.com/chart 这是豆瓣的一个音乐排行榜,这里爬取了左边部分的歌曲排行榜部分,爬虫很简单,就用到了beautifulsoup和request ...
- centos 下 gradle 编译打包 apk
由于Jenkins 装在centos环境下,想实现Android程序的编译,只能通过gradle 命令去打包版本apk,以下记录了如何在centos下使用gradle 打包apk 一.安装 gradl ...
- centos7编译安装php 遇到的问题
centos7 编辑安装php遇到的问题: ./configure 配置遇到的No package 'libxml-2.0' found缺失libxml2.0 库,解决方法: yum -y insta ...
- Tkinter 鼠标键盘事件(一)
一: 鼠标事件 <Button-1> 鼠标左键单击 ...
- Netty线程模型(五)
Netty支持单线程.主线程模型.主从多线程模型. 我们在创建线程组的时候,如果不传递参数,则默认构建的线程组线程是CPU核心数量. 一.单线程模型 在ServerBootstrap调用方法group ...
- GAN与VAE
经典算法·GAN与VAE Generative Adversarial Networks 及其变体 生成对抗网络是近几年最为经典的生成模型的代表工作,Goodfellow的经典工作.通过两个神经网络结 ...
- js常用方法总结(以后遇到再进一步总结)
1.index() 返回指定元素相对于其他指定元素的 index 位置. <h1>店铺评价</h1> <div class="star starcd&qu ...
- KDE 上 任务栏 图标位置更改
任务栏上图标是不能直接拖拽的. 右键点任务栏,选[Panel Options -> Panel Settins]之后,就可以拖拽了. 完成之后,按X就行了.
- 【转】TCP连接突然断开的处理方法
TCP是因特网中的传输层协议,使用三次握手协议建立连接,下面是TCP建立连接的全过程. TCP断开连接的过程:TCP四次挥手. TCP/IP 协议簇分层结构 数据链路层主要负责处理传输媒介等众多的物理 ...
- docker的一些常用操作
镜像:一个打包好的应用,还有应用运行的系统.资源.配置等容器:镜像的实例,一个镜像可以有一个或多个实例(容器)对docker容器的变更时写到容器的文件系统的,而不是写到docker镜像中的,可以用一个 ...