使用线程在Consumer流中使用Flink producer in循环运行Flink使用者

时间:2018-01-30 08:52:12

标签: apache-kafka apache-flink flink-streaming

我想让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条消息。

1 个答案:

答案 0 :(得分:1)

大多数Flink运算符都是并行运算符,因此您没有理由在数据管道中创建任何类型的线程,Flink应该是管理运算符可以存在多少并行实例的运算符。如果要设置该值,则应使用以下API方法。

.setParallelism(N) //N is 10 for you,

您可以获得more info in Fink documentation

你可以这样做:

  1. 向群集配置添加更多任务管理器插槽
  2. 而不是map使用生成thoose 10条消息的flatMap
  3. 将flatMap运算符的并行度增加到10。
  4. 您的代码应如下所示:

    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)
    

    如果要对数据接收器执行并行写入,则必须确保使用的接收器支持这种写入操作。