使用flink实现一个简单的wordcount

一、背景

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

二、需求

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

三、前置条件

1、jdk版本要求

查看jdk版本注意:官方要求1.8及以上的版本

2、maven版本要求

maven版本注意:官方要求3.0.4及以上的版本

四、实现步骤

1、创建 flink 项目

  1. 执行如下命令
mvn archetype:generate                               \
     -DarchetypeGroupId=org.apache.flink              \
     -DarchetypeArtifactId=flink-quickstart-java      \
     -DarchetypeVersion=1.9.0
  1. 执行上一步命令或会提示输入自己项目的groupId,artifactIdversion,此处输入自己像输入的即可。
  2. 生成代码如下截图代码结构

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程序

运行结果

六、程序代码

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

猜你喜欢

转载自blog.csdn.net/fu_huo_1993/article/details/103107125