这是我参与「第四届青训营 」笔记创作活动的第7天
Flink(计算框架)
本身是基于流处理设计的,基本数据模型是数据流,对于批数据看成特殊的流(有界的数据流)。采用标准的流执行模式,当一个事件在一个节点执行完毕后才可以分发到下一个节点进行处理。
流处理的应用架构:事件驱动型(从web系统读取事件到消息队列、改变本地应用状态、定期写异步检查点、状态改变后触发写入事件日志并反馈给其他应用)、数据分析型(摄取实时事件、实时改变本地应用状态、更新数据库并生成实时报告)、数据管道型(半双工式借用管道完成输入处理输出)。
操作:
- SQL:最高层语言,使用最方便
- Table API:声明式语言,将流转换成表操作,基于table定义
- DataStream/DataSet API 流批处理
- 获取到有状态流并处理:最底层的处理函数,复杂灵活的操作可使用
实现最简wordCount功能:
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
DataSource<String> lineDataSource = env.readTextFile("input/words.txt");
FlatMapOperator<String, Tuple2<String, Long>> wordAndOneTuple = lineDataSource.flatMap((String thisLine, Collector<Tuple2<String, Long>> out) -> {
String[] words = thisLine.split(" ");
for (String word : words) {
out.collect(Tuple2.of(word, 1L));
}
})
.returns(Types.TUPLE(Types.STRING, Types.LONG));
UnsortedGrouping<Tuple2<String, Long>> group = wordAndOneTuple.groupBy(0);
AggregateOperator<Tuple2<String, Long>> sum = group.sum(1);
try {
sum.print();
} catch (Exception e) {
e.printStackTrace();
}
- 创建执行环境
- 从(文本)文件中读取数据,得到一个数据源,逐行读取到字符串
- 建立二元组,将每行数据进行分词【将一行数据拆分成多行数据,扁平映射】,存储到key-value类型,进行类型转换,把每一个word包装成二元组
- 按照word进行分组 field:字段
- 分组内进行聚合统计
- 结果打印输出
课上:
data streams——两种抽象
- 批式:属于bounded数据集
- 流式:卡夫卡消息队列,unbounded数据,可以完整恢复之前的状态,slot是一个单独的线程在执行
具体服务过程:获取一个上下文的执行环境——>给出该环境的读取数据源(数据库or本地端口)——>实现业务逻辑