Flink 学习笔记-Flink DataStream API 编程指南

242 阅读2分钟

Flink DataStream API 编程指南

官方 Documnet - Flink DataStream API 编程指南

DataStream 在 FLink 程序中是比较常见的,用来对数据进行转换;e.g. 过滤 (filting)、更新状态(updating state)、定义窗口(define window)、聚合统计(aggregating) 。DataStream 起初可以从多种多样的 source 创建(e.g. message queue、scoket streams、files);最终由 sink 返回(sink 可以是往文件中写数据;可以是标准输出,如命令行终端;也可以是消息队列等等)。DataStream 可以在不同的环境中运行,可以是独立运行,也可以嵌入到其他程序中运行;任务可以在本地 JVM 中执行,也可以在有多个服务器的集群中调度执行。

可以查看Flink 基本API概念了解 Flink API 基本介绍。起初构建 DataStream 程序的话,可以从剖析一个 Flink 程序开始;后面的章节将介绍其他的操作和高级特性。

样例代码

下面的程序是一个完整的流式窗口单词计数应用程序的工作示例;它在5秒的时间窗口中对来自 web scoket 的单词进行计数。可以复制并粘贴代码以在本地运行。

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

public class WindowWordCount {

    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStream<Tuple2<String, Integer>> dataStream = env
                .socketTextStream("localhost", 9999)
                .SplitterFlatMap(new Splitter())
                .keyBy(0)
                .timeWindow(Time.seconds(5))
                .sum(1);

        dataStream.print();

        env.execute("Window WordCount");
    }

    public static class SplitterFlatMap implements FlatMapFunction<String, Tuple2<String, Integer>> {
        @Override
        public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {
            for (String word: sentence.split(" ")) {
                out.collect(new Tuple2<String, Integer>(word, 1));
            }
        }
    }

}

运行程序;然后用 netcat 在终端开启输入流。

nc -lk 9999

输入一些单词,点击回车键,这些单词将会进入计数程序被统计。如果您想看到大于1的计数,请在5秒内反复键入同一个单词(如果无法快速键入,就增大时间窗口宽度☺).

未完待续...