spark dataframe groupBy任务号

时间:2017-08-23 05:39:46

标签: apache-spark dataframe

我以本地模式运行,并使用2分区初始化。 当我使用DataFrame.show()时,它是这样的:INFO scheduler.TaskSetManager: Finished task 1.0 in stage 3.0 (TID 5) in 390 ms on localhost (2/2)。 但是当我使用DataFrame.groupBy()时,它会得到如此多的任务:INFO scheduler.TaskSetManager: Finished task 83.0 in stage 15.0 (TID 691) in 644 ms on localhost (84/200)。 我的源代码在这里。

everyIResDF.show()
val resDF = everyIResDF
  .groupBy("dz_id","dev_id","dev_type","time")
  .avg("IRes")
resDF.show()

我想知道为什么groupBy()会引起这个问题以及如何解决它。 任何帮助都很有用。

1 个答案:

答案 0 :(得分:1)

将为每个阶段中的每个分区启动任务。您使用2个分区初始化数据框,因此,第一个INFO打印的任务数量将很少(2)。

但是,每次Spark需要执行数据随机播放时,它将决定并更改随机RDD将具有的分区数。默认值为200.因此,在使用需要完整数据随机播放的groupBy()后,任务数量将增加到200(如第二次INFO打印中所示)。

可以通过更改Spark的配置来设置重排数据时要使用的分区数,例如将其设置为4,只需执行以下操作:

sqlContext.setConf("spark.sql.shuffle.partitions", "4”)

通过使用此配置运行代码,您将不再看到如此多的任务。最佳分区数取决于许多因素,但可以启发式设置为核心数的3或4倍。