由于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之外,还有其他可能更好的方法来解决此问题吗?
答案 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)
}