I've been trying to figure out how to write a flink program that receives events, from 3 kafka's topics, sum them up for the today, yesterday, and the day before yesterday.
so the first question is, how can i sum the transaction for 3 different days and extract them as a json file
If you want to read from 3 different kafka topics or partitions, you have to create 3 kafka sources
Flink's documentation about kafka consumer
val env = StreamExecutionEnvironment.getExecutionEnvironment()
val consumer0 = new FlinkKafkaConsumer08[String](...)
val consumer1 = new FlinkKafkaConsumer08[String](...)
val consumer2 = new FlinkKafkaConsumer08[String](...)
consumer0.setStartFromGroupOffsets()
consumer1.setStartFromGroupOffsets()
consumer2.setStartFromGroupOffsets()
val stream0 = env.addSource(consumer0)
val stream1 = env.addSource(consumer1)
val stream2 = env.addSource(consumer2)
val unitedStream = stream0.union(stream1,stream2)
/* Logic to group transactions from 3 days */
/* I need more info, but it should be a Sliding or Fixed windows Keyed by the id of the transactions*/
val windowSize = 1 // number of days that the window use to group events
val windowStep = 1 // window slides 1 day
val reducedStream = unitedStream
.keyBy("transactionId") // or any field that groups transactions in the same group
.timeWindow(Time.days(windowSize),Time.days(windowStep))
.map(transaction => {
transaction.numberOfTransactions = 1
transaction
}).sum("numberOfTransactions");
val streamFormatedAsJson = reducedStream.map(functionToParseDataAsJson)
// you can use a library like GSON for this
// or a scala string template
streamFormatedAsJson.sink(yourFavoriteSinkToWriteYourData)
If your topics names could be matched With a Regular expresion, you can create only one kafka consumer as follows:
val env = StreamExecutionEnvironment.getExecutionEnvironment()
val consumer = new FlinkKafkaConsumer08[String](
java.util.regex.Pattern.compile("day-[1-3]"),
..., //check documentation to know how to fill this field
...) //check documentation to know how to fill this field
val stream = env.addSource(consumer)
Most common aproach is to have all transactions inside the same kafka topic and not in differents topics, in that case, the code will be more simple, because you only have to use a window to process your data
Day 1 -> 11111 -\
Day 2 -> 22222 --> 1111122222333 -> Window -> 11111 22222 333 -> reduce operation per window partition
Day 3 -> 3333 --/ |-----|-----|---|
Example code
val env = StreamExecutionEnvironment.getExecutionEnvironment()
val consumer = new FlinkKafkaConsumer08[String](...)
consumer.setStartFromGroupOffsets()
val stream = env.addSource(consumer)
/* Logic to group transactions from 3 days */
/* I need more info, but it should be a Sliding or Fixed windows Keyed by the id of the transactions*/
val windowSize = 1 // number of days that the window use to group events
val windowStep = 1 // window slides 1 day
val reducedStream = stream
.keyBy("transactionId") // or any field that groups transactions in the same group
.timeWindow(Time.days(windowSize),Time.days(windowStep))
.map(transaction => {
transaction.numberOfTransactions = 1
transaction
}).sum("numberOfTransactions");
val streamFormatedAsJson = reducedStream.map(functionToParseDataAsJson)
// you can use a library like GSON for this
// or a scala string template
streamFormatedAsJson.sink(yourFavoriteSinkToWriteYourData)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.