Spark Streaming Kafka直接流处理时间性能峰值

时间:2015-11-30 15:52:08

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

我有一个Spark Streaming作业,使用直接方法从Kafka集群读取数据。处理时间存在周期性的峰值,我无法理解,也没有反映在Spark UI指标中。下图显示了此模式(批处理时间= 10秒):

enter image description here

每次运行作业时,此问题都可以重现。 Kafka日志中没有数据可供阅读,因此无需执行实际处理。我希望该行是平坦的,接近序列化的最小值并将任务发送给执行者。

模式是一个作业需要9秒(这有5秒的调度程序延迟),下一个作业需要5秒(没有调度程序延迟),接下来的两个作业大约需要0.8和0.2秒。

根据Spark UI(除了调度程序延迟),9秒和5秒的作业似乎没有做更多的工作。

以下是5秒作业的任务时间摘要:

enter image description here

没有任何执行者在5秒内完成任务。

是否还有其他人遇到此问题,或者您是否有任何可能导致此问题的建议?

这是主要流媒体代码的精简版本:

def main(args: Array[String]): Unit = {
    val (runtimeConfig: RuntimeConfig, cassandraConfig: CassandraConfig.type, kafkaConfig: KafkaConfig.type,
streamingContext: StreamingContext) = loadConfig(args)

    val kafkaParams = Map[String, String]("metadata.broker.list" -> kafkaConfig.metadataBrokerList, "fetch.message.max.bytes" -> kafkaConfig.fetchMessageMaxBytes)
    val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder] (streamingContext, kafkaParams, Set(runtimeConfig.kafkaTopic))
    val uuidGenerator = streamingContext.sparkContext.broadcast(Generators.timeBasedGenerator(EthernetAddress.fromInterface()))

    runtimeConfig.kafkaTopic match {
      case Topics.edges => saveEdges(runtimeConfig, messages, uuidGenerator)
      case Topics.messages => {val formatter = streamingContext.sparkContext.broadcast(DateTimeFormat.forPattern(AppConfig.dateFormat))
    saveMessages(cassandraConfig, runtimeConfig, messages, formatter)}
    }
    streamingContext.start()
    streamingContext.awaitTermination()
}

def saveEdges(runtimeConfig: RuntimeConfig, kafkaStream: DStream[(String, String)],
               uuidGenerator: Broadcast[TimeBasedGenerator]): Unit = {
      val edgesMessages = kafkaStream.flatMap(msg => {
    implicit val formats = DefaultFormats
    parse(msg._2).extract[List[EdgeMessage]].flatMap(em => (List.fill(em.ids.size)(em.userId) zip em.ids))
  }).map(edge => Edge(edge._1, edge._2)).saveAsTextFiles("tester", ".txt")
}

Spark设置:

val conf = new SparkConf()
.set("spark.mesos.executor.home", AppConfig.sparkHome)
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.set("spark.streaming.kafka.maxRatePerPartition", "1")
.set("spark.streaming.blockInterval", "500")
.set("spark.cores.max", "36")

相关build.sbt提取:

"org.apache.spark" % "spark-streaming-kafka_2.10"  % "1.5.1",
"org.apache.spark" %% "spark-core" % "1.5.1",
"org.apache.spark" %% "spark-streaming" % "1.5.1",
"org.apache.spark" %% "spark-graphx" % "1.5.1",
  • Kafka版本:2-10-0.8.2.1
  • 资源经理:Mesos 0.23
  • 群集详细信息:6名Spark Worker,6名Kafka Brokers,5个节点Zookeeper Ensemble(在同一台机器上)。 12卡夫卡分区。

注意:sparktmpkafka-logs通常位于每个节点上相同的旋转磁盘上。

1 个答案:

答案 0 :(得分:1)

问题似乎与Mesos调度程序有关。我不确定为什么它开始放慢这样的工作。然而,我重新启动了Mesos集群,现在锯齿处理时间已经过去了。

正如您在此处所看到的,处理时间现在更加稳定:

enter image description here