public class WindowWorkCount {
public static void main(String[] args) throws Exception {
// 获取执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(5000);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// 构建数据流
DataStream<Tuple2<String, Integer>> dataStream = env
.socketTextStream("127.0.0.1", 9999) // 监听sockt文本输入流
.flatMap(new Splitter()) // 合并输入映射
.keyBy(value -> value.f0) // 定义元素键
.timeWindow(Time.seconds(5)) // 定义时间窗口
.sum(1); // 对元素键分组进行sum统计
dataStream.print();
env.execute("window wordcount");
}
public static class Splitter extends RichFlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
for(String word : value.split(" ")){
out.collect(new Tuple2<>(word, 1));
}
}
}
}
启动 nc 监听输入
nc -lk 9999
数据源源是程序读取输入的地方。可以使用 StreamExecutionEnvironment. addSource(sourceFunction) 将一个源附加到程序中。
Flink 提供了许多预先实现的数据源函数,同时也支持自定义实现数据源。
→ File-based 文件数据源
→ Socket-based 套接字数据源
→ Collection-based 集合数据源