我有一个Spark Streaming作业,使用直接方法从Kafka集群读取数据。处理时间存在周期性的峰值,我无法理解,也没有反映在Spark UI指标中。下图显示了此模式(批处理时间= 10秒):
每次运行作业时,此问题都可以重现。 Kafka日志中没有数据可供阅读,因此无需执行实际处理。我希望该行是平坦的,接近序列化的最小值并将任务发送给执行者。
模式是一个作业需要9秒(这有5秒的调度程序延迟),下一个作业需要5秒(没有调度程序延迟),接下来的两个作业大约需要0.8和0.2秒。
根据Spark UI(除了调度程序延迟),9秒和5秒的作业似乎没有做更多的工作。以下是5秒作业的任务时间摘要:
没有任何执行者在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",
注意:sparktmp
和kafka-logs
通常位于每个节点上相同的旋转磁盘上。