SPARK生产者写入KAFKA消息-代码及踩坑记录

背景是:

     项目通过大数据spark做模型的评估,评估代码为scala,评估的结果需要通过kafka消息队列进行中转,于是需要通过spark去连接kakfa队列,作为生产者像kafka队列中传送消息。

   直接先上代码:

 

kafka生产者代码:

package com.tiger

import java.util.Properties

import org.apache.kafka.clients.producer.{KafkaProducer, ProducerConfig, ProducerRecord}
import org.apache.kafka.common.serialization.StringSerializer


/**
 * Kafka Producer
 */
class KafkaMsg(topic : String,msg :String) {

  def sendMsg() {
    val props = new Properties()
    //参数大家可以自己去找相关资料
    props.put("metadata.broker.list", ":9092")
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "xx:9092")
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, classOf[StringSerializer].getName)
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, classOf[StringSerializer].getName)
    props.put("producer.type","sync")

    val producer = new KafkaProducer[String, String](props)

    producer.send(new ProducerRecord(topic,msg))
    producer.close
  }
}
测试类:
object testMlib {
    def main(args: Array[String]) {
      new KafkaMsg("emmp_eva_result","test").sendMsg()
    }

pom.xml 引入以下:


    org.apache.kafka
    kafka_2.12
    1.1.0


    org.apache.kafka
    kafka-clients
    1.1.0

看似乎非常简单完美,测试结果让我花了周末大好的几个小时时光

 

一直在报错:

1、首先是 NoClassDefFoundError :StringSerializer

或者

   NoClassDefFoundError:KafkaProducer

或者其他kafka相关的jar包提示依赖缺失

依赖包是跟工程jar包一起打的,检查没有问题

解决思路:

   这类问题根据经验明显是jar包冲突问题

于是:1、查看生产的kafka版本、scala版本,使其和pom文件能完全对应。

   结果:尝试了很多版本,还是一样的报错 

2、后续想起来,应该在kafka本身的安装目录中去找相关的依赖包:

 于是在本地的kafka安装目录找到

kafka-xx.jar

  kafka-client-xxx.jar 

把这两个文件拷贝到spark的jar目录中。

工程打包的时候不再打包该文件。如何进行有效的文件打包请参考另一篇文章。

哇,终于不是报之前的依赖包缺失了,来一个新的:

typesafe scalalogging

 

这个从工程中看到,这个依赖是属于scala-logging的包,

于是,继续从kafka的目录中获取 scala-logging-xxx.jar,拷贝到spark的jar中,

再次启动任务,皇天不负我周末几小时。。。。DONE

 

 

 

 

你可能感兴趣的:(spark,kafka,踩坑)