[英]Kafka Streams how to get TimeStamp from kafka message in scala
我正在運行一個簡單的 Kafka 流應用程序,它將使用 Node JS 記錄的信息傳輸到 Kafka 主題。
E.g.
Producer = kafka.Producer
KeyedMessage = kafka.KeyedMessage
client = new kafka.KafkaClient()
producer = new Producer(client)
km = new KeyedMessage('key', 'message')
kafka_message = JSON.stringify({ id: req.session.data.toString(), url: article.info })
payloads = [
{ topic: 'eventTopic', messages: kafka_message,timestamp:timestampNow}
];
producer.send(payloads, function (err, data) {
console.log(data);
});
同樣重要的是要注意時間戳只是一個數字,表示自 1970 年 6 月以來的秒數。
我在 Scala 中使用 Kafka Stream 來使用這些數據。
例如
val builder = new StreamsBuilder
val stream = builder
.stream[String, String]("TopicTest")
.foreach((k:String, v:String) => {
println(k)
println(v)
}
但是,我不確定如何將時間戳(我從 nodeJS 發送的)提取到此流。
例如,如果我嘗試做這樣的事情
val stream = builder
.stream[String, String,Long]("TopicTest")
.foreach((k:String, v:String,timeStamp:Long) => {
println(k)
println(v)
println(timeStamp)
}
這會產生錯誤“無法解析符號流”。 我想知道如何解決這個問題。 僅供參考,這里是我的流的拓撲和配置。 val 拓撲 = builder.build
import java.util.Properties
val props = new Properties()
import org.apache.kafka.streams.StreamsConfig
val appId = this.getClass.getSimpleName.replace("$", "")
props.put(StreamsConfig.APPLICATION_ID_CONFIG, appId)
props.put(StreamsConfig.CLIENT_ID_CONFIG, appId)
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, ":9092")
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest")
// Step 4. Create Kafka Streams Client
import org.apache.kafka.streams.KafkaStreams
val ks = new KafkaStreams(topology, props)
ks.start
確實存在 TimeStampExtractor ( https://jaceklaskowski.gitbooks.io/mastering-kafka-streams/content/kafka-streams-TimestampExtractor.html )。 但是,可以將時間戳作為任何常規 kafka 消息發送。 我改變的第一件事是我的 NodeJS 代碼。
kafka_message = JSON.stringify({ id: req.session.information.toString(), url: article.info,timestamp:timestampNow.toString() })
payloads = [
{ topic: 'eventTopic', messages: kafka_message}
];
producer.send(payloads, function (err, data) {
console.log(data);
});
我發送的 JSON 消息中現在有一個時間戳字段。
最后,我們可以使用 argonaut 解析 JSON 消息。
val streamEvents = builder
.stream[String, String]("testTopic")
.foreach((k:String, json:String) => {
println(k)
println(json)
println(Parse.parse(json))
val url:String = Parse.parseWith(json, _.field("url").flatMap(_.string).getOrElse("Error!"), msg => msg)
val id:String = Parse.parseWith(json, _.field("id").flatMap(_.string).getOrElse("Error!"), msg => msg)
val timestamp:String = Parse.parseWith(json, _.field("timestamp").flatMap(_.string).getOrElse("Error!"), msg => msg)
val timeStampInt:Long = timestamp.toLong
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.