Flink随笔 20241129 流数据处理处罚:以生产线烤鸡为例明白 Flink

[复制链接]
发表于 2025-12-18 16:57:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
        流数据(streaming data)就像是一条永不绝歇的生产线,源源不绝地向前推进,带来新的数据。而 Apache Flink 就是这条生产线的核心,它负责对数据举行处理处罚、分类、聚合和存储。为了更好地明白 Flink 的流处理处罚,我们可以通过一个简单的类比来表明:流数据就像是流水线上的烤鸡,而 Flink 就是这条流水线上的工作部,负责对这些烤鸡举行加工、分拣、统计和存储。
下面,我们将通过这个类比一步步教学 Flink 的核心概念,并展示怎样在 Flink 中实现这些利用。
类比:生产线的烤鸡

        想象一下,你在一个生产线的末了,看到源源不绝的烤鸡从流水线上流过。你须要对这些鸡举行以下利用:

  • 去掉烤糊的鸡肉(过滤):生产线上有些鸡被烤得过焦,不能食用,须要将其剔除。
  • 分拣出火鸡还是寻常鸡肉(映射):在生产线的下一步,你须要把鸡肉分成差异的种别,好比火鸡和寻常鸡肉。
  • 统计有多少只火鸡,多少只寻常鸡肉(聚合):你须要统计每种鸡肉的数目,以便后续处理处罚。
  • 将鸡肉存储(存储):末了,全部的合格鸡肉须要被存储,大概被送到市场。
        这些利用正是 Flink 中流数据处理处罚的核心功能。下面我们将逐一先容怎样在 Flink 中实现这些步调。
1. 去掉烤糊的鸡肉(过滤)

        在生产线的第一步,你须要对烤鸡举行筛选,去掉那些已经烤糊大概质量不合格的鸡肉。在 Flink 中,这就是 过滤利用(Filter)。Flink 提供了 filter() 函数,可以根据条件筛选出符合要求的数据。
        比方,假设我们有一个数据流,此中包罗差异范例的鸡肉,而我们只关心康健的鸡肉。你可以通过过滤利用去除那些不符合条件的数据。
  1. DataStream<String> chickenStream = env.fromElements("Turkey", "Burnt Chicken", "Chicken", "Turkey");
  2. DataStream<String> validChickenStream = chickenStream.filter(chicken -> !chicken.equals("Burnt Chicken"));
  3. validChickenStream.print();
复制代码
2. 分拣出火鸡还是寻常鸡肉(映射)

        在生产线的第二步,你须要把鸡肉分成火鸡和寻常鸡肉两类,这就是 映射利用(Map)。在 Flink 中,map() 函数可以将输入数据转换成差异的输出数据。在本例中,我们可以将鸡肉范例映射成差异的标签,比方“火鸡”和“寻常鸡肉”。
  1. DataStream<String> sortedChickenStream = chickenStream
  2.     .map(new MapFunction<String, String>() {
  3.         @Override
  4.         public String map(String value) throws Exception {
  5.             return value.equals("Turkey") ? "Turkey" : "Chicken";
  6.         }
  7.     });
  8. sortedChickenStream.print();
复制代码
3. 统计有多少只火鸡,多少只寻常鸡肉(聚合)

        接下来,你须要统计每种范例的鸡肉有多少只,这就是 聚合利用(Aggregation)。在 Flink 中,keyBy() 和 reduce() 函数常常一起利用,按指定的键(好比鸡肉范例)对数据举行分组,并对每个组举行聚合盘算。
        比方,你可以按鸡肉范例分组,并统计每种鸡肉的数目:
  1. DataStream<Tuple2<String, Integer>> mappedStream = chickenStream
  2.     .map(chicken -> new Tuple2<>(chicken, 1));  // 每个鸡肉事件映射为类型和数量的元组
  3. DataStream<Tuple2<String, Integer>> aggregatedStream = mappedStream
  4.     .keyBy(0)  // 按鸡肉类型分组
  5.     .reduce(new ReduceFunction<Tuple2<String, Integer>>() {
  6.         @Override
  7.         public Tuple2<String, Integer> reduce(Tuple2<String, Integer> value1, Tuple2<String, Integer> value2) throws Exception {
  8.             return new Tuple2<>(value1.f0, value1.f1 + value2.f1);  // 累加数量
  9.         }
  10.     });
  11. aggregatedStream.print();
复制代码
4. 将鸡肉存储(存储)

        在生产线的末了一步,合格的鸡肉须要被存储或发送到市场。Flink 提供了多种 Sink 利用,可以将处理处罚效果输出到外部体系,如 Kafka、MySQL、Elasticsearch 或 HDFS。你可以根据须要将聚合效果写入数据库或消息队列,便于后续的处理处罚和存储。
        比方,将处理处罚后的数据输出到 Kafka:
  1. aggregatedStream.addSink(new FlinkKafkaProducer<>(
  2.     "kafka-broker",  // Kafka 服务器地址
  3.     "chicken-topic",  // Kafka 主题
  4.     new SimpleStringSchema()  // 数据序列化方式
  5. ));
复制代码
Flink 流数据处理处罚的完备示例

        通过上述步调,我们可以编写一个完备的 Flink 步伐,来实现流数据的处理处罚,雷同于生产线上的烤鸡加工过程。以下是一个简单的例子,展示怎样利用 Flink 举行数据流的过滤、映射、聚合和存储:
  1. import org.apache.flink.api.common.functions.MapFunction;
  2. import org.apache.flink.api.common.functions.ReduceFunction;
  3. import org.apache.flink.streaming.api.datastream.DataStream;
  4. import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
  5. import org.apache.flink.api.java.tuple.Tuple2;
  6. public class ChickenProcessing {
  7.     public static void main(String[] args) throws Exception {
  8.         // 1. 设置流处理环境
  9.         StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  10.         // 2. 输入数据流:每个事件包含一个鸡肉的类型
  11.         DataStream<String> chickenStream = env.fromElements("Turkey", "Chicken", "Turkey", "Chicken", "Turkey");
  12.         // 3. 映射:将每个事件映射为一个元组(鸡肉类型, 数量)
  13.         DataStream<Tuple2<String, Integer>> mappedStream = chickenStream
  14.             .map(new MapFunction<String, Tuple2<String, Integer>>() {
  15.                 @Override
  16.                 public Tuple2<String, Integer> map(String value) throws Exception {
  17.                     return new Tuple2<>(value, 1);  // 每个事件都标记为1个鸡肉
  18.                 }
  19.             });
  20.         // 4. 聚合:按类型统计每种鸡肉的数量
  21.         DataStream<Tuple2<String, Integer>> aggregatedStream = mappedStream
  22.             .keyBy(0)  // 按鸡肉类型分组
  23.             .reduce(new ReduceFunction<Tuple2<String, Integer>>() {
  24.                 @Override
  25.                 public Tuple2<String, Integer> reduce(Tuple2<String, Integer> value1, Tuple2<String, Integer> value2) throws Exception {
  26.                     return new Tuple2<>(value1.f0, value1.f1 + value2.f1);  // 累加数量
  27.                 }
  28.             });
  29.         // 5. 输出结果到控制台
  30.         aggregatedStream.print();
  31.         // 6. 启动流处理作业
  32.         env.execute("Chicken Processing");
  33.     }
  34. }
复制代码
输出示例
  1. (Turkey, 3)
  2. (Chicken, 2)
复制代码
结论

        通过上面的例子,我们可以看到 Flink 在流数据处理处罚中的应用。它不但可以对数据举行过滤、分类和聚合,还可以或许将处理处罚效果存储或发送到其他体系。流数据处理处罚就像生产线上的烤鸡加工一样,Flink 作为流水线的核心,不但对数据举行有效处理处罚,还确保了高效、实时地转达和存储处理处罚效果。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表