即使有0条消息,Spark流中的转换也要花费更多时间

时间:2019-02-13 10:22:43

标签: apache-spark apache-kafka apache-spark-sql spark-streaming

我在Spark Streaming中遇到严重的性能问题。对于10秒的批处理间隔,程序大约需要2分钟。我尝试调试时没有来自kafka主题的0条消息。即使没有消耗/处理的消息,大多数转换也要花费30秒以上的时间。即使decodeMessagesDF中没有消息,下面的命令也将花费大约40秒。

val enrichedDF: DataFrame = decodeMessagesDF.join(broadcast(customer), (decodeMessagesDF( "rowkey") === customer("rowkey")) && (customer("mkt_opto_flag") === "N") && (customer("ads_opto_flag") === "N"))

下面的发布代码也需要大约30秒的时间来发布0条消息

  message.foreachPartition{ part =>
  val producer = new KafkaProducer[String, String](props)
  part.foreach{ msg =>
    val message = new ProducerRecord[String, String](topic, msg._1, msg._2)
    producer.send(message)
  }
  producer.close()

}

请让我知道代码中是否有错误。谢谢

1 个答案:

答案 0 :(得分:0)

如果'customer'拥有大量数据,广播会很昂贵。也许您应该将广播(customer)排除在这样的联接操作之外:

    val consumerBroadcast = sc.broadcast(customer)
    val enrichedDF: DataFrame = decodeMessagesDF.join(broadcast(consumerBroadcast), (decodeMessagesDF( "rowkey") === customer("rowkey")) && (customer("mkt_opto_flag") === "N") && (customer("ads_opto_flag") === "N"))

此代码仅广播一次客户,但是您的代码将每批广播一次。