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的更多相关文章

  1. [源码解析] Flink的groupBy和reduce究竟做了什么

    [源码解析] Flink的groupBy和reduce究竟做了什么 目录 [源码解析] Flink的groupBy和reduce究竟做了什么 0x00 摘要 0x01 问题和概括 1.1 问题 1.2 ...

  2. Generic/Template Programming in Flink

    Generic/Template Programming in Flink SourceFunction<T> @Public public interface SourceFunctio ...

  3. [源码解析] GroupReduce,GroupCombine 和 Flink SQL group by

    [源码解析] GroupReduce,GroupCombine和Flink SQL group by 目录 [源码解析] GroupReduce,GroupCombine和Flink SQL grou ...

  4. [源码解析] Flink UDAF 背后做了什么

    [源码解析] Flink UDAF 背后做了什么 目录 [源码解析] Flink UDAF 背后做了什么 0x00 摘要 0x01 概念 1.1 概念 1.2 疑问 1.3 UDAF示例代码 0x02 ...

  5. Alink漫谈(八) : 二分类评估 AUC、K-S、PRC、Precision、Recall、LiftChart 如何实现

    Alink漫谈(八) : 二分类评估 AUC.K-S.PRC.Precision.Recall.LiftChart 如何实现 目录 Alink漫谈(八) : 二分类评估 AUC.K-S.PRC.Pre ...

  6. Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树

    Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 目录 Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 0x00 摘要 0x01 背景概念 1.1 词向量基础 ...

  7. flink Reduce、GroupReduce、GroupCombine笔记

    1.reduce操作,在分组的dataset上使用,也可以在不分组的dataset上使用 应用于分组DataSet的Reduce转换使用用户定义的reduce函数将每个组减少为单个元素.对于每组输入元 ...

  8. flink流处理从0到1

    一.DataStream API之Data Sources(消费者之数据源) 介绍: source是程序的数据源输入,你可以通过StreamExecutionEnvironment.addSource ...

  9. flink实时数仓从入门到实战

    第一章.flink实时数仓入门 一.依赖 <!--Licensed to the Apache Software Foundation (ASF) under oneor more contri ...

随机推荐

  1. 简单python爬虫实例

    先放上url,https://music.douban.com/chart 这是豆瓣的一个音乐排行榜,这里爬取了左边部分的歌曲排行榜部分,爬虫很简单,就用到了beautifulsoup和request ...

  2. centos 下 gradle 编译打包 apk

    由于Jenkins 装在centos环境下,想实现Android程序的编译,只能通过gradle 命令去打包版本apk,以下记录了如何在centos下使用gradle 打包apk 一.安装 gradl ...

  3. centos7编译安装php 遇到的问题

    centos7 编辑安装php遇到的问题: ./configure 配置遇到的No package 'libxml-2.0' found缺失libxml2.0 库,解决方法: yum -y insta ...

  4. Tkinter 鼠标键盘事件(一)

    一: 鼠标事件 <Button-1>                                                                     鼠标左键单击 ...

  5. Netty线程模型(五)

    Netty支持单线程.主线程模型.主从多线程模型. 我们在创建线程组的时候,如果不传递参数,则默认构建的线程组线程是CPU核心数量. 一.单线程模型 在ServerBootstrap调用方法group ...

  6. GAN与VAE

    经典算法·GAN与VAE Generative Adversarial Networks 及其变体 生成对抗网络是近几年最为经典的生成模型的代表工作,Goodfellow的经典工作.通过两个神经网络结 ...

  7. js常用方法总结(以后遇到再进一步总结)

    1.index()    返回指定元素相对于其他指定元素的 index 位置. <h1>店铺评价</h1> <div class="star starcd&qu ...

  8. KDE 上 任务栏 图标位置更改

    任务栏上图标是不能直接拖拽的. 右键点任务栏,选[Panel Options -> Panel Settins]之后,就可以拖拽了. 完成之后,按X就行了.

  9. 【转】TCP连接突然断开的处理方法

    TCP是因特网中的传输层协议,使用三次握手协议建立连接,下面是TCP建立连接的全过程. TCP断开连接的过程:TCP四次挥手. TCP/IP 协议簇分层结构 数据链路层主要负责处理传输媒介等众多的物理 ...

  10. docker的一些常用操作

    镜像:一个打包好的应用,还有应用运行的系统.资源.配置等容器:镜像的实例,一个镜像可以有一个或多个实例(容器)对docker容器的变更时写到容器的文件系统的,而不是写到docker镜像中的,可以用一个 ...