火花流工作

时间:2018-06-07 17:49:06

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

我在Mesos上运行了一个火花流媒体作业。 所有批次都需要完全相同的时间,这个时间比预期的要长得多。 这些工作从kafka中提取数据,处理数据并将其插入cassandra,然后再将kafka插入另一个主题。

每个批次(下面)有3个工作,其中2个从kafka拉出,处理并插入cassandra,另一个从kafka拉出,处理并推回kafka。

我在火花UI中检查了批次,发现他们都花了相同的时间(4s)但是钻了更多,他们实际上每次处理的时间不到一秒,但他们都有相同的时间间隔(大约4秒)。 添加更多执行程序或更多处理能力似乎不会产生影响。

Details of batch: Processing time = 12s & total delay = 1.2 s ??

因此,我深入研究批处理的每个作业(即使他们正在进行不同的处理,它们也会完全相同= 4秒):

Job 175s

Job 1753

Job 1754

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

Details for stage 2336

为什么要等?整个事情实际上只需要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秒:One mesos executor

即使主题没有消息(批量为0条记录),每批次的火花流也需要4秒。

我能够解决此问题的唯一方法是设置cores=1cores.max=1,以便它只创建一个要执行的任务。

此任务具有位置NODE_LOCAL。所以似乎当NODE_LOCAL执行是即时的,但当Locality为ANY时, 4秒需要连接到kafka。所有机器都在同一个10Gb网络中。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

问题在于spark.locality.wait,this link给了我这个想法

它的默认值是3秒,并且在火花流中处理的每个批次花费了这整个时间。

我在使用Mesos(--conf spark.locality.wait=0)提交作业时将其设置为0秒,现在所有内容都按预期运行。