使用MemoryStream时如何设置任务和分区数?

时间:2018-09-09 04:26:29

标签: scala apache-spark spark-structured-streaming

我试图了解在以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应该如何确定?

0 个答案:

没有答案