为什么foreachPartition函数为每条消息进行重复调用以映射函数? (Spark 2.0.2)

时间:2016-12-15 19:05:01

标签: apache-spark spark-streaming

我有以下Spark Java API调用序列(Spark 2.0.2):

  1. 通过map函数处理的Kafka流,该函数从tuple2._2()返回字符串值,用于JavaDStream,如
  2. 返回tuple2._2();

    1. 返回的JavaDStream然后由foreachPartition处理,它由foreachRDD包装。

    2. foreachPartition的调用函数执行Iterator inputParams.next();

    3. 当收到数据时,执行步骤1,这是正确的。但是,步骤3中的inputParams.next()在步骤1中对map函数进行了重复调用。因此,每个消息都会调用两次map函数:第一次从Kafka流接收消息时,第二次当从foreachPartition的调用函数调用Iterator inputParams.next()时。

      我也尝试过转换数据,如

      第1步的公共TestTransformedClass调用(Tuple2 tuple2)

      步骤3的

      public void call(Iterator inputParams)

      并出现同样的问题。所以这个问题就出现了,无论这个Spark API调用序列是否涉及数据转换。

      问题:

      1. 由于消息已在步骤1中处理,为什么步骤3中的inputParams.next()会在步骤1中对map函数进行重复调用?

      2. 如何修复它以避免对每条消息进行重复调用?

      3. 感谢。

0 个答案:

没有答案