2015-06-29 8 views
3

Я пытаюсь обернуть голову обо всем понятии искры. Я думаю, что у меня очень рудиментарное понимание об искровой платформе. Из того, что я понимаю, у Spark есть концепция RDD, которая представляет собой коллекцию «материала» в памяти, поэтому обработка выполняется быстрее. You transform RDD с помощью таких методов, как карта и карты. Поскольку преобразования lazy, они не обрабатываются до тех пор, пока вы не вызовете действие на конечном RDD. О чем я не понимаю, когда вы выполняете действие, происходят ли параллельные преобразования? Можете ли вы назначить работников для выполнения команды action?Какие операции искры обрабатываются параллельно?

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

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

Что на самом деле происходит? Does SomeFunction() обрабатывает раздел RDD? Что такое параллельный аспект?

+0

'RDD.map' - это преобразование, возвращающее новый RDD. В этом примере он ничего не добивается: (1) вы не используете преобразованное RDD. (2) это означает, что карта никогда не будет выполнена - как вы сказали, преобразования ленивы. (3) карта не может изменить результат 'count'. – Iain

ответ

3

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

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

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

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

+0

Позвольте мне понять, если я это понимаю, RDD разбиваются на разделы, поэтому, когда вы вызываете какое-то преобразование, скажем, SomeFunction(), SomeFunction() будут запускаться параллельно с обработкой каждого раздела RDD? – Instinct

+0

Преобразование - это «карта». map преобразует каждую строку RDD с помощью функции 'SomeFunction'. Задача запуска карты с помощью полезной нагрузки SomeFunction распространяется среди каждого рабочего, а рабочий запускает карту (преобразуя каждую строку в соответствии с SomeFunction) по каждому локальному разделу. Картина сделает это действительно ясным! –

1

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

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

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

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

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

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