Я делаю серию искровых преобразований на stream = KafkaDStream<X>
.
DStream<V> cachedStream=stream.map(x-> f(x)).cache()
, где f - очень тяжелая интенсивная операция ввода-вывода.
Затем я делаю 3 операции с картами и действия над cachedStream.
cachedStream.map( v-> toP(v)).forEachRDD(saveToCache)
cachedStream.map( v-> toQ(v)).forEachRDD(saveToCache)
cachedStream.map( v-> toR(v)).forEachRDD(saveToCache)
toP, toQ, toR просты в преобразовании памятии я сохраняю вывод в некоторый кеш.
Я знаю, что спарк по умолчанию будет использовать FIFO при выполнении заданий. Spark запустит 3 задания последовательно.
- Job1 X -> f (X) -> toP -> Сохранить
- Job2 X -> f (X) -> toQ -> Сохранить
- Job3 X -> f (X) -> toR -> Save
Job 1может занять все ресурсы. Но когда Job1 будет завершен, он уже кеширует вывод f (X) для Job2 и Job3. Следовательно, для Job2 будет выполняться только toQ -> Save, а для Job3 - только toR -> Save.
Кроме того, если toP является ошибочным кодом и не работает или работает медленно, то Job1 может продолжать сбой, а Job2 иJob3 не получит возможность выполнить.
Моя цель - распараллелить выполнение 3-х заданий, передав их параллельно в отдельных потоках с одинаковым контекстом искры.
, что означает, что X -> f (X) будет выполняться параллельно для каждого задания, что является очень дорогостоящей операцией.
- Как мне этого добиться?
- Подходит ли spark для решения этой проблемы?
- Я что-то упустил?