SparkStreaming写kafka

273 阅读1分钟

spark的运行时架构是多个executor,每个executor里面有个线程池来执行任务。

那么我们需要sink到kafka,由于每个executor是一个独立的进程,而producer是线程安全的,所以我们应该想办法让每个executor有一个producer即可。切不可代码写成下面这样

input.foreachRDD(rdd =>
  rdd.foreachPartition(partition =>
    partition.foreach{
      case x:String=>{
        val props = new HashMap[String, Object]()
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers)
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
          "org.apache.kafka.common.serialization.StringSerializer")
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
          "org.apache.kafka.common.serialization.StringSerializer")
        println(x)
        val producer = new KafkaProducer[String,String](props)
        val message=new ProducerRecord[String, String]("output",null,x)
        producer.send(message)
      }
    }
  )
) 

这个代码每条数据就创建了一个生产者,这是要疯?!