如何将带有显式状态存储的KTable-KTable leftJoin从Kafka 0.11迁移到Kafka 2.0?

时间:2018-11-28 18:26:27

标签: apache-kafka apache-kafka-streams

由于API从Kafka 0.11更改为Kafka 2.0,因此我们面临一个问题。在基于0.11的Kafka流应用程序中,我们在两个使用命名状态存储的KTables[String,Something]之间进行了联接:

val joinedTable = {
    myClass1Table.leftJoin[MyClass1,MyClass2](myClass2Table,new
        MyJoiner, new MySerde[MyClass1Class2],"my-join-store")
}

但是,当迁移到2.0时,显式提供状态存储的唯一方法是:

val joinedTable = {
    val materialized = Materialized.as[String,MyClass1,KeyValueStore[Bytes,Array[Byte]]]("join-store").withValueSerde(new Serde[MyClass1Class2])
    myClass1Table.leftJoin[MyClass1,MyClass2](myClass2Table,new
        MyJoiner,materialized)
}

使用此代码,在生产环境中替换app实例失败,因为Kafka 0.11中的状态存储可能使用了myTable1和myTable2的密钥序列。

org.apache.kafka.streams.errors.StreamsException: A serializer (key: org.apache.kafka.common.serialization.ByteArraySerializer) is not compatible to the actual key type (key type: java.lang.String). Change the default Serdes in StreamConfig or provide correct Serdes via method parameters.
        at org.apache.kafka.streams.state.StateSerdes.rawKey(StateSerdes.java:174)

除了执行kafka-streams-application-reset之外,还有其他可能更好的方法来解决此问题吗?

1 个答案:

答案 0 :(得分:2)

您可以显式传递密钥序列号:

val joinedTable = {
  val materialized = Materialized
    .as[String,MyClass1,KeyValueStore[Bytes,Array[Byte]]]("join-store")
    .withKeySerde(new StringSerde())
    .withValueSerde(new Serde[MyClass1Class2])

  myClass1Table.leftJoin[MyClass1,MyClass2](myClass2Table, new MyJoiner, materialized)
}