Как распараллелить несколько действий (~ 15) на кешированной искре DStream? - PullRequest
0 голосов
/ 27 октября 2019

Я делаю серию искровых преобразований на stream = KafkaDStream<X>.

DStream<V> cachedStream=stream.map(x-> f(x)).cache(), где f - очень тяжелая интенсивная операция ввода-вывода.

Затем я делаю 3 операции с картами и действия над cachedStream.

  1. cachedStream.map( v-> toP(v)).forEachRDD(saveToCache)
  2. cachedStream.map( v-> toQ(v)).forEachRDD(saveToCache)
  3. 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 для решения этой проблемы?
  • Я что-то упустил?
...