如何加入KStream和GlobalKTable?

时间:2018-04-05 20:38:43

标签: scala apache-kafka-streams

我希望使用GlobalKTable加入我的一个流,我在这个过程中遇到了问题。我有3个主题,我也在听。更新 - 原始主题,更新主题和会话主题。

我的更新 - 原始主题的流将未序列化的更新请求转换为序列化请求([String,String] - > [String,Update])。这是推送到我的更新主题。

val updateTransformStore = Stores.inMemoryKeyValueStore("updateTransformState")
val updateTransformStoreBuilder = Stores.keyValueStoreBuilder(updateTransformStore,stringSerde,updateSerde)
builder.addStateStore(updateTransformStoreBuilder)

val rawUpdateStream = builder.stream("update-raw", Consumed.`with`(Serdes.String,Serdes.String))
    .filter((_,value) => filterUpdateRequest(value))

rawUpdateStream.transform(updateTransformer,"updateTransformState")
    .to("update-stream",Produced.`with`(stringSerde,updateSerde))

我的更新主题是GlobalKTable。

val globalMaterialized: Materialized[String,UpdateInfo,KeyValueStore[Bytes, Array[Byte]]] = Materialized.as("global-update-store").withKeySerde(stringSerde).withValueSerde(updateSerde)
val updateTable: GlobalKTable[String,UpdateInfo] = builder.globalTable("update-stream", globalMaterialized)

我的最后一个主题是我的会话主题

val kvMapper = new KeyValueMapper[String, String, String] {
  override def apply(key: String, value: String): String = {
    val jsonVal = new ObjectMapper().readTree(value).asInstanceOf[ObjectNode]
    val session = jsonVal.findValue("session").findValue("id").toString replaceAll( "\"", "")
    session
  }
}
val vJoiner = new ValueJoiner[String,UpdateInfo,JsonWithUpdateInfo] {
  override def apply(value1: String, value2: UpdateInfo): JsonWithUpdateInfo = {
    if(value2 == null) {
      JsonWithUpdateInfo(value1,0,"default")
    }
    else {
      JsonWithUpdateInfo(value1, value2.info1, value2.info2)
    }
  }
}
val filteredStream = builder.stream("session", Consumed.`with`(Serdes.String, Serdes.String))
  .filter((_, value) => filterRequest(value))

val joinedStream:KStream[String,JsonWithUpdateInfo] = filteredStream.join(updateTable,kvMapper,vJoiner)

joinedStream.print(stringSerde,jsonSerde)

将一个更新和一个会话推送到相应的主题后,我的程序似乎在filteredStream.join尝试执行后停止执行。我的打印从不起作用,也没有尝试运行更多命令。在我的kvMapper和vJoiner中抛出调试打印也不会产生输出。在尝试加入此表和流时是否有任何遗漏?

谢谢

1 个答案:

答案 0 :(得分:0)

(来自上面评论部分的对话)

如果您有任何null键或值,这些键或值将被删除。

为了跟踪呼叫链,您可能想在KStreamKTableJoinProcessor#process()上设置一个断点,以查看join运算符的实际作用。

(OP)似乎是问题所在,我不知道我需要在加入时有一个钥匙。我的映射器使用了部分值来联接表,因此我认为可以使用null键,在联接之前就应用了转换,并且按预期工作。