使用scala并行集合时,Spark UI活动作业卡住

时间:2017-10-12 18:07:43

标签: scala apache-spark parallel-processing scala-collections parallel-collections

我有一个1000列的dataFrame,我试图通过对每列进行一些操作来获取一些统计信息。我需要对每一列进行排序,因此我基本上无法对其进行多列操作。我正在一个名为 processColumn

的函数中执行所有这些列操作
def processColumn(df: DataFrame): Double = {

  // sort the column
  // get some statistics
}

为了完成这项工作,我将数据帧保存在内存中,并对其进行scala多线程处理。所以,代码是这样的

假设初始数据帧是df

df.columns.grouped(100).foreach { columnGroups =>

  val newDf = df.select(columnGroups.head, columnGroups.tail:_*)
  newDf.persist()

  val parallelCol = columnGroups.par 
  parallelCol.tasksupport = new ForkJoinTaskSupport(
    new scala.concurrent.forkjoin.ForkJoinPool(4)
  )

  parallelCol.foreach { columnName =>

     val result = processColumn(df.select(columnName))
     // I am storing result here to a synchronized list
  }
  newDf.unpersist()
}

所以,如果你看到,我指定一次运行4个线程。但有时候会发生其中一个线程被卡住,并且我有超过4个活动作业在运行。那些卡住的东西永远不会结束。

我觉得从scala并行集合开始的线程有时间,有时它不会等待所有作业完成。然后那个unpersist被召唤了。所以,积极的工作现在永远停滞不前。我试图通过转到源代码来查明scala集合操作是否超时,但是我们无法确定它是否已经找到了。

任何帮助都将受到高度赞赏。如果您有任何疑问,请告诉我。谢谢。

0 个答案:

没有答案