Позвольте быть работой, которая содержит две фазы, которые (для удобства) не могут быть объединены.Давайте назовем A
первым шагом и B
вторым шагом.Следовательно, нам всегда нужно A
, а затем B
.
Рабочий процесс
- запуск нового кластера с заданием
A
- сборка
MyOutput
count(MyOutput)
= 2000 (*) write(MyOutput)
- запуск нового кластера с заданием
B
read(MyOutput)
count(MyOutput)
= 1788 (**).
Точность
A
обеспечивает вывод, который является RDD[MyObject]
, а именно MyOutput
.Чтобы написать MyOutput
, вот что я делаю: MyOutput.saveAsObjectFile("...")
Затем B
использует MyOutput
в качестве ввода, читая ранее записанный файл.Вот что я делаю: val MyOutput: RDD[MyObject] = sc.objectFile("...")
A
и B
происходят на двух отдельных кластерах.
Проблема
Суть в том, что проблема не всегда возникает, но когда эта проблема возникает, (*) < (**)
- кажется, мы потеряли некоторые данные, тогда как между этими данными не должно быть никаких различий.Очевидно, что-то не так.
Вы знаете, что здесь происходит?Как это решить?