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)
}
}
)
)
这个代码每条数据就创建了一个生产者,这是要疯?!