2015-07-31 3 views
5

Я исхожу из фона Hadoop и имею ограниченные знания об Искры. BASed по тому, что я узнал до сих пор, Spark не имеет узлов картператора и редуктора, и вместо этого он имеет узлы драйвера/рабочего. Рабочий похож на картографа, и водитель (каким-то образом) похож на редуктор. Поскольку есть только одна программа драйвера, будет один редуктор. Если да, то как простые программы, такие как подсчет слов для очень больших наборов данных, могут быть сделаны в искровом режиме? Потому что у драйвера может просто закончиться нехватка памяти.Концепция редуктора в Spark

+1

@ zero323 имеет точку ... Люди перестанут отвечать, если вы никогда не согласитесь с ответом .... –

ответ

10

Драйвер является скорее контролером работы, только вытягивая данные обратно, если оператор требует его. Если оператор, с которым вы работаете, возвращает RDD/DataFrame/Unit, данные остаются распределенными. Если он вернет родной тип, он действительно вернет все данные обратно.

В противном случае понятие карты и сокращения здесь немного устарело (от типа работы, преследующей). Единственное, что действительно имеет значение, - это то, требует ли операция перетасовки данных или нет. Вы можете видеть точки перетасовки по этапам разбиения либо в пользовательском интерфейсе, либо через toDebugString (где каждый уровень отступов является тасованием).

Все, что сказано, для смутного понимания вы можете приравнивать все, что требует перетасовки к редуктору. В противном случае это картограф.

Последний, чтобы приравнять к вашему количеству слов пример:

sc.textFile(path) 
    .flatMap(_.split(" ")) 
    .map((_, 1)) 
    .reduceByKey(_+_) 

В приведенном выше, это будет сделано в один этап, как загрузка данных (textFile), расщепление (flatMap), и map пинг может все выполняются независимо от остальной части данных. Никакой перетасовки не требуется до тех пор, пока не будет вызван reduceByKey, так как ему потребуется объединить все данные для выполнения операции ... HOWEVER, эта операция должна быть ассоциативной по какой-либо причине. Каждый узел будет выполнять операцию, определенную в reduceByKey локально, только слияние окончательного набора данных после. Это уменьшает как расходы памяти, так и сети.

Примечание, что reduceByKey возвращает RDD и, таким образом, transformation, поэтому данные перемешиваются с помощью HashPartitioner. Все данные НЕ возвращаются к драйверу, он просто перемещается в узлы, которые имеют одинаковые ключи, так что он может объединить свое окончательное значение.

Теперь, если вы используете action такие как reduce или еще хуже, collect, то вы не получите RDD спину что означает, что данные откатывается к водителю, и вы будете нуждаться в комнате для него.

Here is my fuller explanation of reduceByKey if you want more. Или как это ломается в чем-то вроде combineByKey

+0

Ассоциативное свойство приносит функциональность как объединитель в HAdoop. Однако для «therececeByKey» данные должны быть перетасованы и отправлены на другой рабочий узел? Можем ли мы сказать, что рабочий узел играет роль редуктора? –

+0

Итак, это означает, что мое первое понимание было правильным, потому что в случае подсчета слов, скажем, у нас есть 1M уникальных слов. Итак, все эти уникальные слова (вместе с их частичной частотой) передаются водителю для того, чтобы его уменьшить? Другими словами, мы можем заключить, что в Искры есть один редуктор, и это водитель? Все эти сокращения также выполняются в Hadoop (с использованием объединителя). –

+0

Бла, я как-то замалчивал, что reduceByKey - это трансформация .... драйвер НЕ получит все данные в этом случае ... вот почему функции пары нажаты, когда у вас есть представление ключ/значение ...Я обновил свой ответ, чтобы указать, что ... но да, рабочие - это редукторы в этой роли. –

Смежные вопросы