У меня есть искровая программа, которая по существу делает это:Неожиданной искры
def foo(a: RDD[...], b: RDD[...]) = {
val c = a.map(...)
c.persist(StorageLevel.MEMORY_ONLY_SER)
var current = b
for (_ <- 1 to 10) {
val next = some_other_rdd_ops(c, current)
next.persist(StorageLevel.MEMORY_ONLY)
current.unpersist()
current = next
}
current.saveAsTextFile(...)
}
странного поведение, что я вижу, является то, что искровые этапы, соответствующих val c = a.map(...)
происходят в 10 раз. Я бы ожидал, что это произойдет только один раз из-за немедленного кэширования на следующей строке, но это не так. Когда я смотрю на вкладке «хранилище» текущей работы, очень немногие из разделов c кэшируются.
Кроме того, 10 экземпляров этого этапа сразу же отображаются как «активные». 10 копий этапа, соответствующего val next = some_other_rdd_ops(c, current)
, отображаются в ожидании, и они примерно чередуются с исполнением.
Я не понимаю, как получить Spark для кэширования RDD?
Редактировать: здесь есть программа, содержащая программу для воспроизведения: https://gist.github.com/jfkelley/f407c7750a086cdb059c. Он ожидает, что в качестве входных данных будет список краев графика (с весами краев). Например:
a b 1000.0
a c 1000.0
b c 1000.0
d e 1000.0
d f 1000.0
e f 1000.0
g h 1000.0
h i 1000.0
g i 1000.0
d g 400.0
Линии 31-42 настоящего стандарта соответствуют упрощенной версии выше. Я получаю 10 этапов, соответствующих строке 31, когда я только ожидал 1.
Я думаю, что ваше ожидание является правильным. Может быть, есть что-то подозрительное в коде? Не могли бы вы привести пример, с помощью которого мы можем воспроизвести проблему? Одно из возможных объяснений заключалось бы в том, что, когда вы продолжаете вкладывать вещи в кеш, он выталкивает 'c'. Я не уверен, что это так. –
Догадка Даниэля о том, что кеш выдается, действительна. Кроме того, some_other_rdd_ops - это черный ящик для нас ... так что это может сделать что-то неожиданное. –
Я бы посмотрел больше на 'current.unpersist()' заявление у вас есть. Вы уверены, что c никогда не станет текущим? – marios