【问题标题】:Using the same operator in two different streams in Flink在 Flink 的两个不同的流中使用相同的运算符
【发布时间】:2019-11-25 03:06:58
【问题描述】:

我想在两个不同的流中使用相同的运算符。但是,我收到一个错误,即 UID 或该运算符不是唯一的。

lazy val opt: DataStream[Foo] => DataStream[Buzz] = src => src.flatMap(new MyFlatMapFunc).uid("opt")

lazy val pipe1 = : DataStream[Foo] => DataStream[Buzz] = src => opt(src). // Do keyBy and other logic

lazy val pipe2 = : DataStream[Foo] => DataStream[Buzz] = src => opt(src). // Do some other logic

我得到一个例外:

线程“main”java.lang.IllegalArgumentException 中的异常:用户指定 ID“opt”上的哈希冲突。最可能的原因是非唯一 ID。请检查通过uid(String) 指定的所有ID 是否唯一。

【问题讨论】:

    标签: scala apache-flink flink-streaming


    【解决方案1】:

    那是因为uid 是运算符,它将在管道中使用两次。您有两个选择,您可以将union 两个流合并为一个,以便运算符仅使用一次,或者您可以稍微更改逻辑,以便分配不同的 id:

    lazy val opt: (DataStream[Foo], String) => DataStream[Buzz] = (src, id) => src.flatMap(new MyFlatMapFunc).uid(id)
    
    lazy val pipe1 = : (DataStream[Foo], String) => DataStream[Buzz] = src => opt(src, "firstOpt"). // Do keyBy and other logic
    
    lazy val pipe2 = : (DataStream[Foo], String) => DataStream[Buzz] = src => opt(src, "secondOpt"). // Do keyBy and other logic
    

    【讨论】:

    • 谢谢,它实际上是在拆分流而不是union,不是吗?该运营商在上游。如果我给它一个不同的uid,我会得到两个运算符,这在查看代码时很好,但这是一种资源浪费
    • 避免使用两个运算符的唯一方法是合并两个流,例如,使用union
    • @igx 它并没有真正拆分它们;) 这只是两个流将完全通过两个运算符。如果您想拆分它们,那么您可能应该考虑其他方法。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2019-09-14
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多