具有大量窗口函数(滞后,超前)的内存不足

时间:2018-05-06 09:49:53

标签: apache-spark window-functions

我需要使用多个潜在客户和滞后来计算数据集中的其他要素。大量的引线和延迟会导致内存不足错误。

数据框:

|----------+----------------+---------+---------+-----+---------|
| DeviceID | Timestamp      | Sensor1 | Sensor2 | ... | Sensor9 |
|----------+----------------+---------+---------+-----+---------|
|          |                |         |         |     |         |
| Long     | Unix timestamp | Double  | Double  |     | Double  |
|          |                |         |         |     |         |
|----------+----------------+---------+---------+-----+---------|

窗口定义:

// Each window contains about 600 rows
val w = Window.partitionBy("DeviceID").orderBy("Timestamp") 

计算额外功能:

var res = df
val sensors = (1 to 9).map(i => s"Sensor$i")

for (i <- 1 to 5) {
  for (s <- sensors) {
    res = res.withColumn(lag(s, i).over(w))
         .withColumn(lead(s, i)).over(w)
  }

  // Compute features from all the lag's and lead's
  [...]
}

系统信息:

RAM: 16G
JVM heap: 11G

代码使用小数据集提供正确的结果,但是输出数据为10GB时出现内存不足错误。 我认为罪魁祸首是大量的窗函数,因为DAG显示了很长的

序列
Window -> WholeStageCodeGen -> Window -> WholeStageCodeGen ...

无论如何以更有效的方式计算相同的功能? 例如,是否可以获得滞后(Sensor1,1),滞后(Sensor2,1),...,滞后(Sensor9,1)而不会将滞后(...,1)调用九次?

如果上一个问题的答案为否,那么我该如何避免内存不足?我已经尝试过增加分区数量。

1 个答案:

答案 0 :(得分:1)

您可以尝试类似

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.4.0/fabric.min.js"></script>
<canvas id="canvasWorkspaceFamiliogram" width="500" height="470" style="border:1px solid #ccc"></canvas>

也就是说,将所有内容都写在res = res.select('*', lag(s"Sensor$1", 1).over(w), lag(s"Sensor$1", 2).over(w), ...) 中,而不是许多select

然后,计划中将只有1个窗口。也许对性能有帮助。