Spark迭代算法UDF在每次迭代中被多次触发

Posted

技术标签:

【中文标题】Spark迭代算法UDF在每次迭代中被多次触发【英文标题】:Spark iterative Algorithm UDF gets triggered multiple times in each iteration 【发布时间】:2020-07-16 17:54:51 【问题描述】:

我正在 Spark 中运行一个迭代循环。 每次迭代都会生成一个数据帧,然后该数据帧将成为下一次迭代的输入。 该程序包含一个在每次迭代中调用的 UDF。每次迭代后,我将值分配给新数据帧并将旧数据帧写入 hdfs。然后新的数据框成为我下一次迭代的输入。 我观察到的问题是我的 UDF 被多次调用。 DAG 每个时间步都会变长,UDF 会被多次调用。 我怎样才能防止这种行为。由于性能原因,我不会使用缓存和/或检查点,同时我无法承受多次调用 UDF。

【问题讨论】:

您的问题难以理解。你能粘贴一些你的代码吗? 【参考方案1】:

我明白你的意思了!

你可以使用:

tesd1Df =test1Df.sqlContext.createDataFrame(test1Df.rdd, test1Df.schema).cache()

上述方式类似于检查点,但不是物理保存数据帧,而是缓存它。

这不会影响你的表现,我也遇到过同样的情况,我观察到了性能的大幅提升。

这种方式我也在 Spark ML 中使用,但问题是你需要注意你的内存空间容量,否则这种方法会起作用。

【讨论】:

不幸的是,我无法在每次迭代中缓存和取消持久化。我能够通过写入 hdfs 然后在每次迭代中从 hdfs 读回来打破血统。性能现在实际上比缓存更好。 是的,正是我在回答检查点中提到的将您的数据帧保存在 hdfs 中。那么执行检查点呢?还是只是写信给 hdfs ? 写入 hdfs 您能否解释一下检查点如何影响您的性能,因为据我所知,它会将数据帧写入 hdfs 并读回与您正在做的事情相同的事情。

以上是关于Spark迭代算法UDF在每次迭代中被多次触发的主要内容,如果未能解决你的问题,请参考以下文章

Spark MLlib介绍

Spark UDF Java 示例

遗传算法中比赛选择的多次迭代

梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python)

创建一个 Spark udf 函数以迭代字节数组并将其转换为数字

当我们正在循环的迭代在每次迭代中被修改时,循环的行为是啥[重复]