使用flink实现一个简单的wordcount

一、背景

最近在学习​​flink​​​,此处记录一下学习​​flink​​​的第一个示例,写一个简单的​​word count​​程序。

二、需求

程序监听系统中的​​9999​​​端口,并统计出​​该10秒钟内​​​每个单词出现的次数。每1行的词由​​逗号​​进行分割。

三、前置条件

1、jdk版本要求

使用flink实现一个简单的wordcount_flink 无限流 word count​​​注意:官方要求1.8及以上的版本​

2、maven版本要求

使用flink实现一个简单的wordcount_word count_02​​​注意:官方要求3.0.4及以上的版本​

四、实现步骤

1、创建 flink 项目

  1. 执行如下命令
mvn archetype:generate                               \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.9.0
  1. 执行上一步命令或会提示输入自己项目的​​groupId​​​,​​artifactId​​​和​​version​​,此处输入自己像输入的即可。
  2. 生成代码如下截图使用flink实现一个简单的wordcount_flink_03

2、编写程序步骤

1、创建Stream执行上下文

​final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();​

2、监听系统的9999端口,创建一个socket数据源

​env.socketTextStream("localhost", 9999)​

3、将获取到的每一行数据以","分割,那么每行数据就成了一个数组

输入数据

转换后的结果

描述

a,b,c,d,e,e,f,g

[a,b,c,d,e,e,f,g]

及以逗号分割转成数组

4、然后将上一步获取到的数组数据组成 (词,次数)这种格式

输入数据

转换后的结果

[a,b,c,d,e,e,f,g]

(a,1)… 即数组中的每个数据都转换成了以自身作为key,且值是1的 Tuple2 格式

5、然后在以词进行分组

数据

分组字段索引

描述

(a,1)

0

词是Tuple2的第一个字段,即​​索引​​​为 ​​0​

6、统计10s钟内出现的各个词的个数

此步需要设置一个 window

7、进行求和

8、执行程序

​env.execute("StreamingJob");​

3、程序代码如下

/**
* flink stream word count
*/
public class StreamingJob {

public static void main(String[] args) throws Exception {
// 创建一个stream执行上下文
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 构建一个socket数据源,用于从本地9999端口获取数据
env.socketTextStream("localhost", 9999)
// 将每行数据以","分割,此时每行就是一个数组
.flatMap(new FlatMapFunction<String, String[]>() {
@Override
public void flatMap(String input, Collector<String[]> collector) throws Exception {
collector.collect(input.split(","));
}
})
// 将每个词包装成 (词,1) 这种格式
.flatMap(new FlatMapFunction<String[], Tuple2<String, Integer>>() {
@Override
public void flatMap(String[] words, Collector<Tuple2<String, Integer>> collector) throws Exception {
for (String word : words) {
collector.collect(new Tuple2<>(word, 1));
}
}
})
// 根据第一个词进行分组
.keyBy(0)
// 时间窗口为10s
.timeWindow(Time.seconds(10))
// 根据第二个字段进行统计
.sum(1)
// 数据统计数据
.print();

// 执行程序
env.execute("StreamingJob");
}
}

五、运行结果

1、使用 nc -l 9999 开启端口监听

2、运行java程序

使用flink实现一个简单的wordcount_flink_04

六、程序代码

​代码 https://gitee.com/huan1993/flink-parent/tree/feature/wordcount/​