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 ...
随机推荐
- 201871010108-高文利《面向对象程序设计(java)》第四周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...
- SQL-on-Hadoop 技术
SQL-on-Hadoop 技术 备注 Apache Hive Cloudera Impala Facebook Presto Apache Drill Spark SQL Apache Phoeni ...
- myeclipse开发工具的简单使用
一.使用eclipse.myeclipse开发JAVA程序 将程序开发环境和调试环境集合在一起,提高开发效率 1.创建java项目2.创建程序包3.编写JAVA源程序4.运行JAVA程序 二.程序移植 ...
- Linux进程和计划任务管理
1.笔记: 去掉头部:ps -aux - - no -heade 默认信号:15 强制:9 在命令前些一个nohup不再占用终端 date -s:修改时间 ntpdate pool.ntp.org:同 ...
- ASP.NET开发实战——(一)开篇-用VS创建一个ASP.NET Web程序
本文是本系列文章第一篇,主要通过建立一个默认ASP.NET MVC项目来引出与ASP.NET MVC相关的功能,由于ASP.NET MVC一个简单的模板就具备了数据库操作.身份验证.输入数据校 ...
- mod35云掩膜产品用法
在网上一直没找到一个明确说怎么用MOD35产品的,都是说去看用户手册,第一次看了过一段时间我又忘记怎么搞了,赶紧记下来. 而且现在才发现第一次自己搞的都弄错了. 简单的判断是否是云,只要读取mod35 ...
- WPF DataGrid 鼠标对表格双击导致客户端崩溃
该问题是由于在创建DataGrid时没有设置为只读属性 解决: <DataGrid Name="switchInfoList" MouseLeftBu ...
- Python【每日一问】37
问: 基础题: 设计一个复利计算函数invest(),它包含三个参数:amount(资金),rate(年利率),time(投资时间). 键盘输入每个参数后,输出结果:返回每一年的资金总额 比如,amo ...
- Android开发中网络代理设置实用总结
一.背景 进行Android项目开发时,跟网络代理基本上天天都在打交道.通常情况下,至少有三个场景中经常用到网络代理: 1,经常通过Chrome访问Google等国外的技术网站,如通过SS工具等: 2 ...
- springboot+RabbitMQ 问题 RabbitListener 动态队列名称:Attribute value must be constant
因为多机环境fanout广播模式,每台机器需要使用自己的队列接受消息 所以尝试使用以下的方案 private static final String QUEUE_NAME="foo.&quo ...