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秒内反复键入同一个单词(如果无法快速键入,就增大时间窗口宽度☺).
未完待续...