Apache spark spark流作业中任务之间的长时间一致等待
我有一个在Mesos上运行的spark流媒体工作。 所有批次的时间都完全相同,而且这一时间比预期的要长得多。 作业从卡夫卡中提取数据,处理数据并将其插入卡桑德拉,然后再将其返回到卡夫卡的另一个主题中 每个批次(如下)有3个作业,其中2个从卡夫卡提取,处理并插入卡桑德拉,另一个从卡夫卡提取,处理并推回卡夫卡 我检查了spark UI中的批次,发现它们都需要相同的时间(4s),但向下钻取的时间更多,实际上每个批次的处理时间都不到1秒,但它们都有相同的时间间隔(大约4秒)。 增加更多的执行器或更多的处理能力看起来不会有什么不同 因此,我深入研究了批次的每个作业(即使它们正在进行不同的处理,它们都会占用完全相同的时间=4s): 他们都需要4秒钟来运行他们的一个舞台(读卡夫卡的那一个)。 现在我深入到其中一个阶段(它们都非常相似): 为什么要等?整个过程实际上只需要0.5秒,它只是在等待。它在等卡夫卡吗 有没有人经历过类似的事情? 我可能编码错误或配置不正确 编辑: 下面是触发此行为的最低代码。这让我觉得这一定是某种设置Apache spark spark流作业中任务之间的长时间一致等待,apache-spark,apache-kafka,spark-streaming,mesos,Apache Spark,Apache Kafka,Spark Streaming,Mesos,我有一个在Mesos上运行的spark流媒体工作。 所有批次的时间都完全相同,而且这一时间比预期的要长得多。 作业从卡夫卡中提取数据,处理数据并将其插入卡桑德拉,然后再将其返回到卡夫卡的另一个主题中 每个批次(如下)有3个作业,其中2个从卡夫卡提取,处理并插入卡桑德拉,另一个从卡夫卡提取,处理并推回卡夫卡 我检查了spark UI中的批次,发现它们都需要相同的时间(4s),但向下钻取的时间更多,实际上每个批次的处理时间都不到1秒,但它们都有相同的时间间隔(大约4秒)。 增加更多的执行器或更多的处
object Test {
def main(args: Array[String]) {
val sparkConf = new SparkConf(true)
val streamingContext = new StreamingContext(sparkConf, Seconds(5))
val kafkaParams = Map[String, String](
"bootstrap.servers" -> "####,####,####",
"group.id" -> "test"
)
val stream = KafkaUtils.createDirectStream[String, Array[Byte], StringDecoder, DefaultDecoder](
streamingContext, kafkaParams, Set("test_topic")
)
stream.map(t => "LEN=" + t._2.length).print()
streamingContext.start()
streamingContext.awaitTermination()
}
}
即使所有的执行器都在同一个节点中(spark.executor.cores=2 spark.cores.max=2
),问题仍然存在,并且与以前一样正好是4秒:
即使主题没有消息(一批0条记录),spark streaming也会为每批花费4秒
我能够解决这个问题的唯一方法是设置cores=1
和cores.max=1
,这样它只创建一个要执行的任务
此任务具有局部性
节点\u LOCAL
。因此,当NODE\u LOCAL
时,执行似乎是瞬时的,但当Locality是ANY
时,连接到卡夫卡需要4秒。所有机器都在同一个10Gb网络中。知道为什么会这样吗?问题出在spark.locality上。等等,我知道了
它的默认值是3秒,对于spark streaming中处理的每个批次,它占用了整个时间
我在使用Mesos提交作业时将其设置为0秒(--conf spark.locality.wait=0
),现在一切都按预期运行