Flink的流式处理和批处理有什么不同?

Flink的流式处理和批处理主要有以下不同:

  1. 数据源不同。流式处理读取实时持续产生的数据流,批处理读取静态已完成的数据集。
  2. 窗口机制不同。流式处理使用滑动窗口处理实时数据,批处理使用全局窗口一次性处理完整数据集。
  3. 触发机制不同。流式处理通过时间触发周期性计算,批处理通过调用execute()一次性执行全部计算。
  4. 状态管理不同。流式处理需要管理动态变化的状态,批处理只需要在execute()时初始化一次状态。

下面通过两个简单例子来说明:

流式处理:

DataStream<String> stream = env.readTextFile("input");  

// 5秒滑动窗口,每秒计算一次
DataStream<Tuple2<String, Integer>> result = stream
    .keyBy(s -> s)          
    .timeWindow(Time.seconds(5), Time.seconds(1))
    .aggregate(new AggregateFunction<String, Integer, Integer>() {  
       public Integer createAccumulator() {
          return 0;  
       }
       public Integer add(String s, Integer acc) {
          return acc + 1;
       }
       public Integer getResult(Integer acc) {  
          return acc;  
       }
   }  
);

result.print();
env.execute(); 

批处理:

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

DataSet<String> input = env.readTextFile("input");

// 全局窗口,一次性计算
DataSet<Tuple2<String, Integer>> result = input
    .keyBy(s -> s)
    .sum(1);  // 直接聚合,计数

result.print();
env.execute(); 

可以看到,流式处理通过时间触发周期性计算实时数据流,使用滑动窗口管理状态。批处理通过execute()一次性计算完整数据集,使用全局窗口。

流式处理用于实时计算不断变化的数据,批处理用于离线计算静态已完成的数据集。

两种方式各有优点,Flink提供统一的API支持流批统一,让我们可以灵活地切换。根据需求选择合适的数据源和窗口机制,实现相同的业务逻辑。