我试图了解在以local[*]
模式运行的Spark结构流应用程序中观察到的奇怪行为。
我的机器上有8个核心。虽然我的大多数批次都有8个分区,但偶尔我会得到16或32或56等分区/任务。我注意到它始终是8的倍数。打开阶段标签时我注意到,发生这种情况时是因为有多个LocalTableScan。
也就是说,如果我有2个LocalTableScan,则微型批处理作业将具有16个任务/分区,依此类推。
我的意思是,它可以进行两次扫描,将两个批次合并,然后将其送入微型批次作业。但是,否会导致迷你批处理作业,即任务数=核心数*扫描数。
这是我设置MemoryStream的方法:
val rows = MemoryStream[Map[String,String]]
val df = rows.toDF()
val rdf = df.mapPartitions{ it => {.....}}(RowEncoder.apply(StructType(List(StructField("blob", StringType, false)))))
我有一个未来,可以像这样在
之后提供我的内存流Future {
blocking {
for (i <- 1 to 100000) {
rows.addData(maps)
Thread.sleep(3000)
}
}
}
然后是我的查询
rdf.writeStream.
trigger(Trigger.ProcessingTime("1 seconds"))
.format("console").outputMode("append")
.queryName("SourceConvertor1").start().awaitTermination()
我想知道为什么任务数量会有所不同? Spark应该如何确定?