2010-05-06 2 views
1

제목이 말하는대로. Yet Another Language Geek: Continuation-Passing Style을 읽고 있었는데 MapReduce가 Continuation-Passing Style 일명 CPS의 한 형식으로 분류 될 수 있는지 궁금해합니다.MapReduce는 CPS (Continuation-Passing Style)의 한 형태입니까?

또한 CPS가 복잡한 계산을 수행하기 위해 둘 이상의 컴퓨터를 활용할 수 있는지 궁금합니다. CPS를 사용하면 Actor model으로 더 쉽게 작업 할 수 있습니다.

+0

은 내가 필요가 있다고 생각 읽고 주제에 대해 더 이상의 의견을 나눌 수 있기 전에 더 많은 것을 이해하려고 노력하십시오. – Jeff

답변

1

나는 그들이 정반이라고 말하고 싶습니다. MapReduce는 분명히 하위 작업을 독립적으로 수행 할 수있는 배포에 적합합니다. CPS를 사용하면 각 호출이 돌아 오기 위해 작은 케이스에서 대기하는 재귀 함수를 작성할 수 있습니다.

나는 CPS는 The Future of Parallel: What's a Programmer to do?

+0

실제로, 내가 볼 수있는 한 가이는 그 이야기에서 CPS를 언급하지 않는 것 같습니다. – RD1

1

나는 그렇게 말하지 않을 것이다. MapReduce는 사용자 정의 함수를 실행하지만 "콜백"이라고 더 잘 알려져 있습니다. CPS는 함수, 동시 루틴, 콜백 및 루프와 같이 잘 알려진 개념의 동작을 모델링하는 데 일반적으로 사용되는 매우 추상적 인 개념이라고 생각합니다. 일반적으로 직접 사용되지는 않습니다.

그런데 CPS와 관련하여 혼란 스러울 수 있습니다. 나는 어느 쪽의 전문가도 아니야.

+0

하스켈에서 항상, 그리고 때로는 OCaml과 같은 다른 언어로 Monadic 프로그래밍을하는 것은 실제로 CPS입니다. 그래서 그것은 바로 다른 이름 바로 아래에서 그리고 자주 설탕과 함께 사용됩니다. –

1

모두 CPS에 대한 자신의 이야기에, 가이 스틸은 우리가 빨리 성장하고 잊다해야 할 것들로 설명하는 프로그래밍 기법의 하나라고 생각하고 맵리 듀스는 고차 함수를 사용합니다. 즉, 두 함수 모두 인수로 함수를 사용하는 함수가 포함됩니다.

CPS의 경우 결과와 함께 할 일을 나타내는 인수가있는 함수 (연속이라고 함)가 있습니다. 전형적으로 (항상 그런 것은 아니지만) 연속은 한 번 사용됩니다. 나머지 계산 전체를 계속 수행하는 방법을 지정하는 함수입니다. 이것은 또한 그것을 일련의 종류로 만듭니다. 일반적으로 하나의 실행 스레드가 있고 그 연속은 계속 진행될 방법을 지정합니다.

MapReduce의 경우 여러 번 사용되는 함수 인수를 제공하고 있습니다. 이 인수 함수는 실제로 나머지 계산 전체를 나타내지는 않지만 반복해서 사용되는 빌딩 블록은 거의 없습니다. "반복적 인"비트는 여러 컴퓨터에 분산되어 종종 이와 같은 것을 만들 수 있습니다.

그래서 공통점을 볼 수 있습니다. 그러나 하나는 다른 하나의 예가 아닙니다.

1

지도 축소는 구현입니다. 해당 구현을 사용할 수있는 코딩 인터페이스는 연속성을 사용할 수 있습니다. 프레임 워크와 작업 제어가 추상화되는 방식에 관한 문제입니다. Pig와 같은 Hadoop 용 선언적 인터페이스 또는 SQL과 같은 선언적 언어를 고려하십시오. 인터페이스 아래의 기계는 많은 방법으로 구현 될 수 있습니다. 예를 들어

, 여기 추상화 파이썬 맵 줄일 구현의 :

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) 

그리고 여기에 숨겨 더 많은 마법의 추상화, 코 루틴을 사용하여 동일한 구현의 :

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')