Как в Spark связаны между собой job, stage, task, dag?
Я прочитала, что спарк приложение в момент выполнения имеет иерархию: приложение состоит из job (заданий), задания, в свою очередь, состоят из stage (стадий), стадии - из task (тасков). И есть некая концепция DAG (даг).
Для начала, я не очень понимаю, что такое задание. То есть, если я пишу свое спарк приложение на питоне, то задания - это .py файлы в проекте или нечто иное? Если же это мой код .py делится на задания, то я не понимаю, зачем это деление нужно и по какому принципу все это делится.
Далее стадии. Тут, в целом, понятно, что задание нужно делить на стадии, чтобы понимать, что может выполняться без перетасовки данных по серверам. То есть, различные фильтры where могут выполняться пачкой на одной стадии. А вот уже Джойн и сортировка, к примеру, не могут выполняться на одной стадии. Исправьте, пожалуйста, если я не права
Далее таски. Я так понимаю, что процесс разбивается на таски, чтобы, как раз была параллельность. То есть два условных такса выполняют одну и ту же задачу, например фильтрацию по id, но один берет одну половину датафрейма, а другой - другую. Исправьте, пожалуйста, если я не права.
Ок, вроде бы есть какая-то около-понятная иерархия, НО как все это связать с дагами? Взаимосвязанные ли это вообще вещи, вместе ли они существует и одними ли понятиями оперируют? Я могу представить, что каждая вершина Дага соответствует стадии. И даг вообще нам нужен просто для определения последовательности вычислений. Или, может быть даг, оперирует другими понятиями и строится до вызова итогового датафрейма, до деления приложения на задания, стадии и таски.
Помогите разобраться, пожалуйста)