本次实战就是消费上述消息,然后统计每个用户十五秒内所有的消息,将每次操作的字节数累加起来,就得到用户十五秒内操作的字节数总和,并且每次累加了多少都会记录下来并最终和聚合结果一起展示;
和官网的demo略有不同,官网用的是Tuple2来处理数据,但我这里用了Tuple3,多保存了一个StringBuilder对象,用来记录每次聚合时加了哪些值,这样在结果中通过这个字段就能看出来这个时间窗口内每个用户做了多少次聚合,每次是什么值:
Flink:1.7;
运行模式:单机(官网称之为Local Flink Cluster);
Flink所在机器的操作系统:CentOS Linux release 7.5.1804;
开发环境JDK:1.8.0_181;
开发环境Maven:3.5.0;
今天的实战分为以下步骤:
创建应用;
编码;
构建;
部署运行;
mvn archetype:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.7.0
Define value for property ‘groupId’: com.bolingcavalry
Define value for property ‘artifactId’: wikipediaeditstreamdemo
Define value for property ‘version’ 1.0-SNAPSHOT: :
Define value for property ‘package’ com.bolingcavalry: :
Confirm properties configuration:
groupId: com.bolingcavalry
artifactId: wikipediaeditstreamdemo
version: 1.0-SNAPSHOT
package: com.bolingcavalry
Y: :
应用创建成功,接下来可以开始编码了;
您可以选择直接从GitHub下载这个工程的源码,地址和链接信息如下表所示:
| 名称 | 链接 | 备注 |
| :-- | :-- | :-- |
| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
| git仓库地址(ssh) | [email protected]:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
这个git项目中有多个文件夹,本章源码在wikipediaeditstreamdemo这个文件夹下,如下图红框所示:
接下来开始编码:
org.apache.flink
flink-conne
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
ctor-wikiedits_2.11
${flink.version}
package com.bolingcavalry;
import org.apache.commons.lang3.StringUtils;
import org.apache.flink.api.common.functions.AggregateFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.connectors.wikiedits.WikipediaEditEvent;
import org.apache.flink.streaming.connectors.wikiedits.WikipediaEditsSource;
public class StreamingJob {
public static void main(String[] args) throws Exception {
// 环境信息
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource(new WikipediaEditsSource())
//以用户名为key分组
.keyBy((KeySelector
//时间窗口为5秒
.timeWindow(Time.seconds(15))
//在时间窗口内按照key将所有数据做聚合
.aggregate(new AggregateFunction
@Override
public Tuple3
//创建ACC
return new Tuple3<>("", 0, new StringBuilder());
}
@Override
public Tuple3
StringBuilder sbud = tuple3.f2;
//如果是第一条记录,就加个"Details :"作为前缀,
//如果不是第一条记录,就用空格作为分隔符
if(StringUtils.isBlank(sbud.toString())){
sbud.append("Details : ");
}else {
sbud.append(" ");
}
//聚合逻辑是将改动的字节数累加
return new Tuple3<>(wikipediaEditEvent.getUser(),
wikipediaEditEvent.getByteDiff() + tuple3.f1,
sbud.append(wikipediaEditEvent.getByteDiff()));
}
@Override
public Tuple3
return tuple3;
}
@Override