以下Spark Streaming代码生成DStream[Int]
,其中包含随机整数流。
// these lines can be copy-pasted to `spark-shell`
import org.apache.spark.streaming._
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.receiver.Receiver
import scala.util.Random
val ssc = new StreamingContext(sc, Duration(1000))
val numbers = ssc.receiverStream(new Receiver[Int](StorageLevel.MEMORY_ONLY) {
lazy val thread = new Thread() {
override def run(): Unit = {
while(!isInterrupted) {
store(Random.nextInt())
Thread.sleep(100)
}
}
}
override def onStart(): Unit = thread.start()
override def onStop(): Unit = thread.interrupt()
})
numbers.print()
ssc.start()
在本地模式或独立群集模式下,此代码完全按预期工作,延迟小于50毫秒。但是,在YARN上(使用HADOOP_CONF_DIR=/etc/hadoop/conf spark-shell --master yarn-client
运行),延迟随时间线性增加,使得流应用程序无法使用,如下所示:
每秒应该输出print()
,但是在YARN上,输出大约每5秒产生一次,使线性延迟增加。
我在纱线2.5.0-cdh5.3.0上运行spark 1.2.0,它分配了2个执行器,每个执行器-Xmx1024m。如果有人感兴趣,these是stdout日志。
是否有人知道这个问题或有任何线索?提前谢谢。