我想让flink使用者流中的每条消息通过单独的线程生成多条消息,使用flink kafka producer在kafka中创建一些主题。我在Scala中编写程序但是Java中的答案会做
这样的事情:
def thread(x:String): Thread =
{
val thread_ = new Thread {
override def run {
val str = some_processing(x)
flink_producer(str)
}
}
return thread_
}
val stream = flink_consumer()
stream.map(x =>{
var i = 0
while(i < 10){
val th = thread(x)
th.start()
i = i+1
}
})
因此,对于flink使用者中的每个输入,我想使用多线程向其他队列生成10条消息。
答案 0 :(得分:1)
大多数Flink运算符都是并行运算符,因此您没有理由在数据管道中创建任何类型的线程,Flink应该是管理运算符可以存在多少并行实例的运算符。如果要设置该值,则应使用以下API方法。
.setParallelism(N) //N is 10 for you,
您可以获得more info in Fink documentation
你可以这样做:
您的代码应如下所示:
val stream = flink_consumer()
stream.flatMap((x, out) =>{
var i = 0
while(i < 10){
val valueToCollect = process(x,i)
out.collect(valueToCollect)
}
}).setParallelism(10)
.map(doSomethingWithGeneratedValues)
.addSink(sinkThatSendsDataToYourDesiredSystem)
如果您知道要拥有多少并行任务,那么另一个方法
val stream = flink_consumer()
val resultStream = stream.map(process)
val sinkStream = resultStream.union(resultStream,resultStream,resultStream,...) // joins resultStream N times
sinkStream.addSink(sinkThatSendsDataToYourDesiredSystem)
最后,您还可以为DataStream提供多个接收器
val stream = flink_consumer()
val resultStream = stream.map(process)
resultStream.addSink(sinkThatSendsDataToYourDesiredSystem)
resultStream.addSink(sinkThatSendsDataToYourDesiredSystem)
resultStream.addSink(sinkThatSendsDataToYourDesiredSystem)
...
N
...
resultStream.addSink(sinkThatSendsDataToYourDesiredSystem)
如果要对数据接收器执行并行写入,则必须确保使用的接收器支持这种写入操作。