Является ли Mapreatuce одна форма продолжения стиля прохождения (CPS)?
-
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')