使用flink实现一个简单的wordcount
- 四、实现步骤
- 1、创建Stream执行上下文
- 2、监听系统的9999端口,创建一个socket数据源
- 3、将获取到的每一行数据以","分割,那么每行数据就成了一个数组
- 4、然后将上一步获取到的数组数据组成 (词,次数)这种格式
- 5、然后在以词进行分组
- 6、统计10s钟内出现的各个词的个数
- 7、进行求和
- 8、执行程序
- 五、运行结果
- 六、程序代码
一、背景
最近在学习flink
,此处记录一下学习flink
的第一个示例,写一个简单的word count
程序。
二、需求
程序监听系统中的9999
端口,并统计出该10秒钟内
每个单词出现的次数。每1行的词由逗号
进行分割。
三、前置条件
1、jdk版本要求
注意:官方要求1.8及以上的版本
2、maven版本要求
注意:官方要求3.0.4及以上的版本
四、实现步骤
1、创建 flink 项目
- 执行如下命令
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.9.0
- 执行上一步命令或会提示输入自己项目的
groupId
,artifactId
和version
,此处输入自己像输入的即可。 - 生成代码如下截图
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的第一个字段,即 |
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[]>() {
public void flatMap(String input, Collector<String[]> collector) throws Exception {
collector.collect(input.split(","));
}
})
// 将每个词包装成 (词,1) 这种格式
.flatMap(new FlatMapFunction<String[], Tuple2<String, Integer>>() {
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程序
六、程序代码
代码 https://gitee.com/huan1993/flink-parent/tree/feature/wordcount/