代码-第5章 DataStream API-林子雨编著《Flink编程基础(Java版)》

💡 原文中文,约145700字,阅读约需347分钟。
📝

内容提要

本文介绍了Flink中的KeyedState和ProcessFunction的使用,包括不同类型的KeyedState和ProcessingTimeTimer的使用。

🔎

延伸解读

从文件到Kafka:数据源接入的两种典型方式

文章通过FileSourceDemo和KafkaSourceDemo展示了Flink读取文件与Kafka的差异。文件源适合批式或离线场景,需指定路径并依赖flink-connector-files;Kafka源则用于实时流,需配置bootstrap servers、group id和topic,并引入flink-connector-kafka。读者可据此根据数据来源的实时性要求选择合适连接器。

算子链的多种写法:匿名类、Lambda与独立类

MapDemo1/2/3、FlatMapDemo1/2/3和FilterDemo1/2/3分别用匿名内部类、Lambda表达式和独立静态类实现相同逻辑。匿名类直观但冗长,Lambda简洁但需注意类型推断(如FlatMapDemo2需调用returns指定返回类型),独立类便于复用和测试。这为代码组织提供了灵活选择。

分组聚合与分流:keyBy、reduce及侧输出流

KeyByDemo和SimpleAggregateDemo演示了按stockId分组后使用min聚合;ReduceDemo1/2/3则用reduce实现自定义累加。SplitByFilterDemo通过多次filter分流,而SplitBySideOutputDemo使用ProcessFunction和OutputTag将不同stockId的数据输出到侧流,主流保留其他数据。侧输出流更适合复杂条件分流。

数据生成器与自定义POJO的配合使用

DataGeneratorSourceDemo和ReadDataGeneratorSource展示了如何用DataGeneratorSource生成测试数据。后者结合自定义的MyGeneratorFunction和StockPrice类,通过RandomDataGenerator生成随机价格,并需指定每秒记录数和总行数。StockPrice类必须提供空参构造器,以便Flink进行反射和序列化。

❓

Q&A

Flink中的KeyedState是什么?

KeyedState是Flink中用于存储状态的机制,允许根据键对数据进行分组和管理状态。

如何在Flink中使用ProcessFunction?

ProcessFunction用于处理流数据,可以访问时间特性和状态,允许用户实现复杂的处理逻辑。

Flink中如何读取文件数据流?

可以使用FileSource读取文件数据流,示例代码中展示了如何从指定路径读取文本文件。

Flink中的flatMap算子有什么作用?

flatMap算子用于将输入数据流中的每个元素映射为零个或多个输出元素,适合处理复杂的转换逻辑。

如何在Flink中实现数据流的分组?

可以使用keyBy算子对数据流进行分组,指定分组的键以便后续的聚合操作。

Flink中如何将数据写入Kafka?

可以使用KafkaSink将处理后的数据流写入Kafka,示例代码展示了如何配置和使用KafkaSink。

🏷️

标签

➡️

继续阅读