Является ли Mapreatuce одна форма продолжения стиля прохождения (CPS)?

StackOverflow https://stackoverflow.com/questions/2781317

  •  03-10-2019
  •  | 
  •  

Вопрос

Как говорит название. я читал Еще один язык гика: продолжение прохождения стиля И я был вроде удивляясь, может ли MapReduce можно классифицировать как одну форму продолжения стиля, проходящего в стиле AKA CPS.

Я также задаюсь вопросом, как CPS может использовать более одного компьютера для выполнения сложных вычислений. Может быть, CPS облегчает работу с Актер Модель.

Это было полезно?

Решение

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

Я думаю, что CPS является одним из методов программирования, которые Guy Stelee описывает, как вещи, которые нам нужно перерастить и отсортировать, в его разговоре Будущее параллельно: что делать программист?

Другие советы

Я бы так не сказал. Maprecuce выполняет определенные пользователем функции, но они более известны как «обратные вызовы». Я думаю, что CPS - очень абстрактная концепция, которая обычно используется для моделирования поведения более известных концепций, таких как функции, COROUTINES, обратные вызовы и петли. Обычно это не используется напрямую.

Опять же, я могу запутать CPS с самими и самими продолжениями. Я не эксперт по любому из них.

Как CPS, так и в MapReduce используют функции более высокого порядка. Это означает, что оба включают функции, которые принимают функции в качестве аргументов.

В случае CPS у вас есть функция (называемая продолжением) с аргументом, который говорит, что делать с результатом. Как правило, (но не всегда) продолжение используется один раз. Это функция, которая определяет, как все остальные вычисления должны продолжаться. Это также делает его последовательным видом. Как правило, у вас есть одна нить выполнения, и продолжение указывает, как он будет продолжаться.

В случае MapReduce вы предоставляете функциональные аргументы, которые используются несколько раз. Эти функции аргумента на самом деле не представляют все остальные вычисления, но просто мало строительные блоки, которые используются снова и снова. Бит «снова и более» часто можно распределить по нескольким машинам, делающим этот параллельный вид вещи.

Так вы правы видеть общность. Но один на самом деле не пример другого.

Map-Semess - это реализация. Интерфейс кодирования, который позволяет использовать эту реализацию, может использовать продолжения; Это действительно вопрос того, как структура и управление работой абстрагированы. Рассмотрим декларативные интерфейсы для Hadoop, таких как свинья или декларативные языки в целом, такие как SQL; Машина ниже интерфейса может быть реализована во многих отношениях.

Например, вот абстрагированная реализация Python Map-Unize Alume Repaine:

def mapper(input_tuples):
    "Return a generator of items with qualifying keys, keyed by item.key"
    # we are seeing a partition of input_tuples
    return (item.key, item) for (key, item) in input_items if key > 1)

def reducer(input_tuples):
    "Return a generator of items with qualifying keys"
    # we are seeing a partition of input_tuples
    return (item for (key, item) in input_items if key != 'foo')

def run_mapreduce(input_tuples):
    # partitioning is magically run across boxes
    mapper_inputs = partition(input_tuples)
    # each mapper is magically run on separate box
    mapper_outputs = (mapper(input) for input in mapper_inputs)
    # partitioning and sorting is magically run across boxes
    reducer_inputs = partition(
        sort(mapper_output for output in mapper_outputs))
    # each reducer is magically run on a separate box
    reducer_outputs = (reducer(input) for input in reducer_inputs)

И вот ту же реализация, используя COROUTINES, с еще более волшебной абстракцией скрыта:

def mapper_reducer(input_tuples):
    # we are seeing a partition of input_tuples
    # yield mapper output to caller, get reducer input
    reducer_input = yield (
        item.key, item) for (key, item) in input_items if key > 1)
    # we are seeing a partition of reducer_input tuples again, but the
    # caller of this continuation has partitioned and sorted
    # yield reducer output to caller
    yield (item for (key, item) in input_items if key != 'foo')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top