2016-03-24 3 views
1

Я принимаю это course.Функция уменьшения искры: понять, как это работает

В нем говорится, что операция уменьшения на RDD выполняется по одной машине за раз. Это означает, что если ваши данные разделены на 2 компьютера, то нижняя функция будет работать с данными на первом компьютере, найдет результат для этих данных, а затем он займет одно значение со второго компьютера, запустит функцию и продолжит работу таким образом, пока он не закончит все значения с машины 2. Правильно ли это?

Я думал, что функция начнет работать на обеих машинах в то же время, а затем, когда он имеет результаты от 2-х машин, он будет снова запустить функцию в последний раз

rdd1=rdd.reduce(lambda x,y: x+y) 

обновление 1-- ------------------------------------------

будет ниже шагов дать более быстрый ответ по сравнению с функцией уменьшения?

Rdd=[3,5,4,7,4] 
seqOp = (lambda x, y: x+y) 
combOp = (lambda x, y: x+y) 
collData.aggregate(0, seqOp, combOp) 

Update 2 -----------------------------------

Если оба набор кодов ниже выполняется за такое же количество времени? Я проверил, и кажется, что и то и другое.

import datetime 

data=range(1,1000000000) 
distData = sc.parallelize(data,4) 
print(datetime.datetime.now()) 
a=distData.reduce(lambda x,y:x+y) 
print(a) 
print(datetime.datetime.now()) 

seqOp = (lambda x, y: x+y) 
combOp = (lambda x, y: x+y) 
print(datetime.datetime.now()) 
b=distData.aggregate(0, seqOp, combOp) 
print(b) 
print(datetime.datetime.now()) 

ответ

3

reduce поведение немного отличается между нативной (Scala) и языков гостей (Python), но упрощает вещи немного:

  • каждый раздел обрабатывается последовательно поэлементно
  • несколько разделов может обрабатываться одновременно одним работником (несколько потоков исполнителей) или разными работниками
  • Частичные результаты отбираются водителю, где применяется заключительная редукция (это часть, которая имеет di fferent внедрение в PySpark и Scala)

Так это выглядит, как вы используете Python позволяет взглянуть на код:

  1. reducecreates a simple wrapper для пользователя при условии функции:

    def func(iterator): 
        ... 
    
  2. Это обертка is used to mapPartitions:

    vals = self.mapPartitions(func).collect() 
    

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

  3. Собранный vals уменьшается последовательно на водителя, используя стандартный Python reduce:

    reduce(f, vals) 
    

    где f является a функции, переданные по адресу RDD.reduce

Для сравнения Scala will mer ge частичные результаты асинхронно, поскольку они исходят от рабочих.

В случае treeReduce шаг 3. может выполняться также распределенным образом. См Understanding treeReduce() in Spark

reduce Резюмируя, за исключением обработки со стороны водителя, использует одни и те же механизмы (mapPartitions) в качестве основных преобразований, как map или filter и обеспечивают тот же уровень параллелизма (раз за исключением кода драйвера). Если у вас большое количество разделов или f стоит дорого, вы можете параллелизировать/распространять окончательное слияние с использованием tree* семейства методов.

+0

Я прочитал ваш ответ. Мне сложно понять ваши исходные данные, а также выяснить, правильно ли указано в курсе или нет. Похоже, что утверждение неверно на основе того, что «несколько разделов могут обрабатываться одновременно одним рабочим (несколькими потоками исполнителей) или разными работниками». Пожалуйста, дайте прямой ответ? Пожалуйста, обратите внимание на то, что вы говорите, используя пример - например, RDD [1,2,3,4,5,6] и [1,2,3] находятся на одной машине и остальные элементы на другом компьютере. Как искра и скала обрабатывают их отдельно? Спасибо за работу ура – user2543622

+0

Я не смотрел курс, поэтому я не могу на это ссылаться, но если они действительно скажут вам, что это делается машиной в то время, когда вы перешли в 200 долларов. 'reduce', исключая часть драйвера, использует тот же механизм, что и стандартные преобразования Spark, следовательно, демонстрирует тот же параллелизм. – zero323

+0

Пожалуйста, обратите внимание на то, что вы говорите, используя пример - например, RDD [1,2,3,4,5,6] и [1,2,3] находятся на одной машине и остальные элементы на другом компьютере. . Как искра и скала справляются с ними по-другому? Также можно было бы ответить на мой обновленный вопрос? – user2543622

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