在apach spark流中使用foreachRDD内的数据库连接

时间:2016-10-18 00:18:23

标签: java serialization apache-spark spark-streaming

在spark streaming中,我想在处理每个批处理之前查询db,将结果存储在一个可以序列化的hashmap中,并通过网络发送给执行程序。

class ExecutingClass implements Serializable {
 init(DB db) {

   try(JavaStreamingContext jsc = new JavaStreamingContext(...)) {

   JavaPairInputDStream<String,String> kafkaStream = getKafkaStream(jsc);

   kafkaStream.foreachRDD(rdd -> {
   // this part is supposed to execute in the driver
  Map<String, String> indexMap = db.getIndexMap();// connects to a db, queries the results as a map

  JavaRDD<String> results = processRDD(rdd, indexMap);

  ...  

 }


  }
    JavaRDD<String> processRDD(JavaPairRDD<String, String> rdd,       Map<String,String> indexMap) {
 ... 
    }
    }

在上面的代码中,indexMap应该在驱动程序中初始化,结果映射用于处理rdd。当我在foreachRDD闭包之外声明indexMap时,我没有问题,但是当我在内部执行时遇到序列化错误。这是什么原因?

我想做这样的事情的原因是为了确保每个批次都有来自数据库的最新值。我怀疑这是因为foreachRDD的关闭试图序列化关闭之外的所有内容。

1 个答案:

答案 0 :(得分:0)

您正在使用 db 对象(这是DB的实例),在forEachRdd中,因此spark尝试序列化 db ,为了避免这种情况,我们需要在forEachRdd中创建数据库连接(或)您可以使用下面文章中讨论的对象池 http://www.michael-noll.com/blog/2014/10/01/kafka-spark-streaming-integration-example-tutorial/