При написании итеративных программ распространенной ситуацией является то, что вам необходимо определить условие, при котором программа остановит выполнение и вернет результат.Это условие остановки может быть, например, 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] [------ интервал ----] [isempty] [------ интервал ----] [isempty]
что является лучшим способом для итеративного программированияв такой ситуации?мы не должны быть вынуждены запускать задание на каждой итерации.
есть ли способ проверить наличие пустого rdd без выполнения действия?
возможное решение:
как выКак видно на рисунке ниже, пустое значение теперь выполняется каждые 5 итераций. Каждая итерация представлена периодическими тройками синих прямоугольников.я сделал это, изменив условие остановки на следующее:
if(layer.index%5==0 && layer.isEmpty) return null;
Но, как вы можете видеть на рисунке ниже, я все еще получаю действия, которые выполняются как "run at ThreadPoolExecutor.java".Исследования показывают, что эти действия происходят, потому что я выполняю "широковещательные хэш-соединения" маленьких DF с большими
threadpoolexecutor по причине
график времени