Какие операции искры обрабатываются параллельно?


Я пытаюсь обернуть мою голову о всей концепции искры. Я думаю, что у меня есть очень рудиментарное представление о платформе spark. Насколько я понимаю, Spark имеет концепцию RDDs, которая представляет собой набор "вещей" в памяти, поэтому обработка происходит быстрее. Вы преобразуете RDDs с помощью таких методов, как map и flatmaps. Поскольку преобразования являются ленивыми, они не обрабатываются до тех пор, пока вы не вызовете действие на конечном RDD. Что мне неясно, так это то, когда вы делаете действие, являются ли преобразования идут параллельно? Можете ли вы назначить работников для выполнения action параллельно?

Например, предположим, что у меня есть текстовый файл, который я загружаю в RDD,

lines = //loadRDD
lines.map(SomeFunction())
lines.count()

Что же на самом деле происходит? Обрабатывает ли функция SomeFunction() разбиение RDD? Что такое параллельный аспект?

2 4

2 ответа:

lines это просто имя для структуры данных RDD, которая находится в драйвере и представляет собой секционированный список строк. partitions управляются на каждом рабочем узле, когда они необходимы.

Когда вызывается действие count, Spark работает в обратном направлении через задачи для выполнения этого действия, в результате чего часть файла считывается (a partition), SomeFunction сериализируется и отправляется по сети рабочим, и выполняется на каждом ряду. Если у вас много работников, то больше за один раз можно прочитать более одного раздела, и SomeFunction может быть отображен на раздел для каждого рабочего/ядра.

Каждый работник отправляет кол-во элементов для раздела, который он обработал, обратно водителю, и водитель может суммировать кол-во всех разделов и вернуть итог.

Примечание: В вашем примере некоторая функция избыточна по отношению к количеству элементов.

An RDD - это абстракция над вашими данными, распределенными по кластеру. Это позволяет вам выполнять операции на нем и не думать о том, на каком узле находится каждая часть.

С любым распределенным вычислительным механизмом некоторые операции будут распараллелены по всему кластеру, а другие потребуют, чтобы данные были агрегированы или сведены к одной машине каким-либо образом. Вы приводите два превосходных примера.

map это тривиально распределяемая команда. Предположим, у вас есть некоторые данные A1, A2 и A3, которые Spark распределяет по трем узлам, N1, N2 и N3 соответственно. Вызов map(someFunction()) в наборе данных позволит N1 применить someFunction ко всем элементам в A1, в то время как все остальные узлы делают то же самое.

count, хотя его можно разбить на "N1, подсчитайте все данные, которые у вас есть", в конечном итоге требуется вернуть одно значение в один узел. В терминологии Spark, collect ing данные. Конечно, подсчет очень, очень быстрый, но вы также можете заставить RDD хранить все данные на одном узле (я использовал это для форматирования вывода и тому подобное).

Таким образом, те, которые могут выполняться параллельно, распараллеливаются, а те, которые не ждут, а затем группируют данные каким-то образом. У Spark есть всевозможные оптимизации под капотом (которые я только начинаю изучать), конечно, чтобы убедиться, что это быстро.

Окончательный отказ от ответственности, я не инженер Spark core, и это действительно высокоуровневый ответ. Я уверен, что есть основные участники, которые могли бы поговорить с особенности того, как команды распараллеливаются, гораздо более подробно.