触发迭代式编程-退出条件而不启动工作

时间:2019-05-02 18:58:12

标签: scala apache-spark

编写迭代程序时,常见的情况是您需要定义一个条件,程序将在该条件下停止执行并返回结果。该停止条件可以是例如rdd.isEmpty。问题在于,这种“条件测试”是一种触发任务执行的动作,因此每次迭代都需要计划,序列化和其他成本

 def iterate(layer:RDD[Long])={

 layer.cache()

 if(layer.isEmpty) return null;


 val nextlayer=process(layer)//contains hashjoins, joins, filters, cache

 iterate(nextlayer)
 }

时间线如下所示:

[isempty] [------ spacing ----] [isempty] [------ spacing ----] [isempty]

在这种情况下进行迭代编程的最佳方法是什么?我们不应被迫在每次迭代中启动工作。

有没有一种方法可以检查rdd是否为空?

可能的解决方案:

如下面的图像所示,

现在每5次迭代执行一次为空,每次迭代由蓝色矩形的周期性三元组表示。我是通过将停止条件修改为以下内容来做到这一点的:

if(layer.index%5==0 && layer.isEmpty) return null;

但是,如您在下图中所看到的那样,仍然可以执行一些操作,这些操作被执行为“在ThreadPoolExecutor.java中运行”。一项研究表明,这些动作之所以会发生是因为我正在对大型DF进行小型DF的“广播哈希联接”

threadpoolexecutor reason

timeline

1 个答案:

答案 0 :(得分:0)

您可以尝试使用

layer.cache()      
layer.isEmpty

这意味着对empty的检查将触发操作,但是rdd将被缓存,因此当您将其传递给process方法时,在isEmpty中完成的操作将被“跳过”。