Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark spark流作业中任务之间的长时间一致等待_Apache Spark_Apache Kafka_Spark Streaming_Mesos - Fatal编程技术网

Apache spark spark流作业中任务之间的长时间一致等待

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秒)。 增加更多的执行器或更多的处

我有一个在Mesos上运行的spark流媒体工作。 所有批次的时间都完全相同,而且这一时间比预期的要长得多。 作业从卡夫卡中提取数据,处理数据并将其插入卡桑德拉,然后再将其返回到卡夫卡的另一个主题中

每个批次(如下)有3个作业,其中2个从卡夫卡提取,处理并插入卡桑德拉,另一个从卡夫卡提取,处理并推回卡夫卡

我检查了spark UI中的批次,发现它们都需要相同的时间(4s),但向下钻取的时间更多,实际上每个批次的处理时间都不到1秒,但它们都有相同的时间间隔(大约4秒)。 增加更多的执行器或更多的处理能力看起来不会有什么不同

因此,我深入研究了批次的每个作业(即使它们正在进行不同的处理,它们都会占用完全相同的时间=4s):

他们都需要4秒钟来运行他们的一个舞台(读卡夫卡的那一个)。 现在我深入到其中一个阶段(它们都非常相似):

为什么要等?整个过程实际上只需要0.5秒,它只是在等待。它在等卡夫卡吗

有没有人经历过类似的事情? 我可能编码错误或配置不正确

编辑:

下面是触发此行为的最低代码。这让我觉得这一定是某种设置

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
),现在一切都按预期运行