Что вызывает работу в Spark? - PullRequest
1 голос
/ 15 мая 2019

Я изучаю, как работает Spark внутри Databricks. Я понимаю, как тасование вызывает этапы в работе, но я не понимаю, что вызывает работу. Я думал, что отношения - это одна работа на одно действие, но иногда много действий происходит на одно действие.

* 1003 Е.Г. *

val initialDF = spark                                                       
  .read                                                                     
  .parquet("/mnt/training/wikipedia/pagecounts/staging_parquet_en_only_clean/")   

val someDF = initialDF
   .orderBy($"project")

someDF.show

запускает два задания: одно для просмотра схемы и одно для .show.

И тот же код с .groupBy вместо

val initialDF = spark                                                       
  .read                                                                     
  .parquet("/mnt/training/wikipedia/pagecounts/staging_parquet_en_only_clean/")   

val someDF = initialDF
  .groupBy($"project").sum()

someDF.show

... запускает девять рабочих мест.

Замена .show на .count, версия .groupBy запускает два задания, а версия .orderBy запускает три.

Извините, я не могу поделиться данными, чтобы сделать это воспроизводимым, но надеялся понять правила, когда задания создаются абстрактно. Рад поделиться результатами .explain, если это будет полезно.

1 Ответ

1 голос
/ 15 мая 2019

show без аргумента показывает первые 20 строк в результате.
Когда show запускается в наборе данных, он преобразуется в действие head(20), которое, в свою очередь, преобразуется в действие limit(20).
show -> head -> limit

О limit
Spark выполняет limit в пошаговом режиме, пока не будет удовлетворен лимитный запрос.
В своей первой попытке он пытается получить необходимое количество строк из одного раздела.
Если требование к пределу не было выполнено, во второй попытке он пытается получить необходимое количество строк из 4 разделов (определяется по spark.sql.limit.scaleUpFactor, по умолчанию 4). и после этого обрабатываются 16 разделов и т. д. до тех пор, пока не будет соблюдено ограничение или не исчерпаны данные.

В каждой из попыток создается отдельное задание.

код ссылки: https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkPlan.scala#L365

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...