返回介绍

实验特点

发布于 2025-05-02 18:19:14 字数 1611 浏览 0 评论 0 收藏

本节介绍 DataStream API 中的实验性函数。实验性函数仍在不断发展,可能不稳定,不完整,或者在未来版本中会发生重大变化。

将预分区数据流重新解释为被 Key 化的数据流

我们可以将预分区数据流重新解释为被 Key 化的数据流,以避免混乱。

警告 :重新解释的数据流 必须 已经在预先划分的 确切地 以同样的方式 Flink 的 keyBy 将在洗牌 WRT 键组分配分区中的数据。

一个用例可能是两个作业之间的物化混乱:第一个作业执行 keyBy shuffle 并将每个输出实现为一个分区。第二个作业的来源是,对于每个并行实例,从第一个作业创建的相应分区中读取。现在可以将这些源重新解释为被 Key 化的数据流,例如应用窗口。请注意,这个技巧使第二个作业难以平行,这对于细粒度的恢复方案很有帮助。

这种重新解释函数通过 DataStreamUtils 以下方式公开:

 static <T, K> KeyedStream<T, K> reinterpretAsKeyedStream(
    DataStream<T> stream,
    KeySelector<T, K> keySelector,
    TypeInformation<K> typeInfo)

给定基本流,Keys 选择器和类型信息,该方法从基本流创建 Keys 流。

代码示例:

 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    DataStreamSource<Integer> source = ...
    DataStreamUtils.reinterpretAsKeyedStream(source, (in) -> in, TypeInformation.of(Integer.class))
      .timeWindow(Time.seconds(1))
      .reduce((a, b) -> a + b)
      .addSink(new DiscardingSink<>());
    env.execute();
 val env = StreamExecutionEnvironment.getExecutionEnvironment
  env.setParallelism(1)
  val source = ...
  new DataStreamUtils(source).reinterpretAsKeyedStream((in) => in)
    .timeWindow(Time.seconds(1))
    .reduce((a, b) => a + b)
    .addSink(new DiscardingSink[Int])
  env.execute()

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。