【问题标题】:Flink custom partitioner exampleFlink 自定义分区器示例
【发布时间】:2016-10-24 19:52:34
【问题描述】:

我要解决的用例如下:

  • 我们有一个从 Kafka 流入的数据流
  • 我们希望保证包含特定实体的相同值的消息/记录由同一操作员处理。
  • 我们希望维护此 Operator 的状态,以便我们能够丰富未来的消息。

例如:

  • 让我们假设所有消息都是具有表示编码数据的字节数组。
  • 在编码数据中具有特定值的所有消息都应由单个运算符处理。
  • 这样当我们收到某些也对应于相同值的特殊消息时,这些消息可以作为状态存储在 Operator 上(在分区器之后),并可用于丰富后续消息。

问题:

  1. 自定义分区器会对此有所帮助吗?
  2. 如果不是这样,什么是好的解决方案?
  3. 谁能分享一个在 Flink 中为数据流定制分区器的例子。我找不到任何完整的例子。

【问题讨论】:

    标签: apache-kafka apache-flink flink-streaming


    【解决方案1】:

    自定义分区器会有所帮助,但对于您的情况,这不是必需的。

    您可以从消息中提取分组值并将其用作分组键。因此,在源读取数据后,您可以使用 map 来提取值(例如,Record -> (groupingValue, Record) 数据类型为 byte[] -> Tuple2<keyType,byte[]>,如果您想保留原始数据信息)。之后,您可以使用.keyBy(0) 并在其上应用您想要的任何运算符。 keyBy 确保 Tuple2 的第一个字段中具有相同值的所有记录都由同一运算符处理。

    【讨论】:

    • 这将如何在集群中工作? Flink 是否会将任何节点处理的消​​息路由到一个节点上的单个操作员?我也开始认为这可以通过跨集群维护全局缓存来解决。我不确定 Flink 是否支持这一点。 @Matthias 你怎么看?
    • 在集群中,Flink 将重新分配数据以将具有相同键的所有记录传送到单个机器(这就是 keyBy() 所做的)。在每台机器上,将有一个或多个操作员/线程(取决于您的配置)处理记录(在内部,每个操作员将每个键的处理分开 - 这样键不会干扰 - 即,如果您编写自定义UDF,您不会在 UDF 中看到多个键 - UDF 将有多个实例,即每个键一个)。所以你什么都不用做——Flink 会替你处理。
    • 谢谢。我也想知道如果这台机器坏了会发生什么。我猜 Flink 可能会在另一个节点上重做这个。这将意味着我将失去运营商的状态。有没有办法解决这个问题?
    • 使用 Flink 的托管算子状态机制(ci.apache.org/projects/flink/flink-docs-release-1.0/apis/…)即可。因此,Flink 也能够恢复状态。
    • 我刚刚尝试了 map->Tuple2 -> keyBy(0)-> 映射。现在我期待第二个地图的实例在按键分组的所有记录之间共享。但是,当我在第二个地图的实例上设置一些状态时,它不会保留给具有相同键的后续记录。有输入吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多