В каких ситуациях пропускаются этапы DAG? - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь найти ситуации, в которых Spark пропустил бы этапы, если я использую RDD. Я знаю, что он пропустит этапы, если произойдет случайная операция. Итак, я написал следующий код, чтобы проверить, верен ли он:

def main(args: Array[String]): Unit =
{
  val conf = new SparkConf().setMaster("local").setAppName("demo")
  val sc   = new SparkContext(conf)

  val d = sc.parallelize(0 until 1000000).map(i => (i%100000, i))

  val c=d.rightOuterJoin(d.reduceByKey(_+_)).collect
  val f=d.leftOuterJoin(d.reduceByKey(_+_)).collect
  val g=d.join(d.reduceByKey(_ + _)).collect
}

При проверке интерфейса Spark я получаю следующие задания с его этапами: enter image description here

Я ожидал, что этап 3 и этап 6 будут пропущены, поскольку они используют один и тот же RDD для вычисления требуемых объединений (учитывая тот факт, что в случае случайного перемешивания искра автоматически кэширует данные). Может кто-нибудь объяснить, почему я не вижу здесь пропущенных этапов? И как я могу изменить код, чтобы увидеть пропущенные этапы? И есть ли другие ситуации (кроме перетасовки), когда ожидается, что Spark пропустит этапы?

1 Ответ

0 голосов
/ 15 октября 2019

На самом деле, это очень просто.

В вашем случае ничего нельзя пропустить, так как каждое действие имеет свой тип JOIN. Нужно сканировать d и d ', чтобы вычислить результат. Даже с .cache (который вы не используете и должны использовать, чтобы избежать повторного вычисления до исходного кода для каждого действия), это не имеет значения.

Глядя на эту упрощенную версию:

val d = sc.parallelize(0 until 100000).map(i => (i%10000, i)).cache // or not cached, does not matter

val c=d.rightOuterJoin(d.reduceByKey(_+_))
val f=d.leftOuterJoin(d.reduceByKey(_+_))

c.count
c.collect // skipped, shuffled 
f.count
f.collect // skipped, shuffled

Показывает следующие задания для этого приложения:

(4) Spark Jobs
Job 116 View(Stages: 3/3)
Job 117 View(Stages: 1/1, 2 skipped)
Job 118 View(Stages: 3/3)
Job 119 View(Stages: 1/1, 2 skipped)

Вы можете видеть, что последовательные действия на основе тот же результат перетасовки вызывают пропуск одного или нескольких этапов для второго действия/ Работа для val c или val f. То есть, тип соединения для c и f известен, и 2 действия для одного и того же типа соединения выполняются последовательно, извлекая выгоду из предыдущей работы, то есть второе действие может полагаться на перетасовку первого действия, которое непосредственно применимо ко 2-му действию. Действие. Это просто.

...