MapReduce는 어떤 종류의 문제를 해결합니까?


61

나는 한동안 MapReduce에 대해 읽었지만 이해할 수없는 것은 누군가가 MapReduce를 사용하거나 사용하지 않기로 결정한 방법입니다.

내 말은, MapReduce가 사용될 수 있음을 나타내는 문제 패턴은 무엇입니까?

답변:


47

기본적으로 거대하지만 어렵지는 않은 문제입니다. 여행하는 판매원 은 주어진 도시 쌍 사이의 거리에 결정적으로 의존하므로 여러 부분으로 나눌 수 있지만 부분적으로 결과를 재결합 할 수 없으므로 전 세계적으로 최적의 솔루션이 등장합니다 (잘 모르는 경우에는 지금 Fields 메달을 신청하십시오).

다른 한편으로, 거대한 말뭉치에서 단어의 빈도를 세는 것은 사소하게 분할 가능 하고 사소하게 재결합 가능합니다 (단순한 말뭉치에 대해 계산 된 벡터를 더하기 만하면됩니다),지도 축소는 확실한 해결책입니다.

실제로, 더 많은 문제는 쉽게 재결합 할 수없는 경향이 있기 때문에, 작업을 병렬화할지 여부는 결정이 작업의 규모와 관련이 있고, 얼마나 어려운가와 관련이 없습니다.


여행하는 판매원 문제에 대한 대략적인 답변을 찾고 있다면 병합 할 최소 거리로 답변을 간단하게 선택할 수 있습니다.
dan_waterworth

MapReduce가 Traveling Salesman에 적합하지 않은 이유에 대한 설명을 이해하지 못했습니다.

9
이 발견에 적합 솔루션을, 어쩌면 아주 좋은 한 - 단지 예를 들어, 1-10, 11-20, 21-30는, 그들 사이의 최적의 경로를 찾아, 작은 집합으로 도시의 집합을 분할, 그리고 홉로 가입 10-> 11, 20-> 21 및 30-> 1. 그러나 문제의 핵심은 최적의 경로 를 찾는 것 입니다. 최적의 경로가 이런 식으로 분할된다는 보장은 없습니다. 실제로 1-> 25로 시작할 수 있습니다! 다시 말해, 올바른 파티셔닝을 찾으려면 기본적으로 이미 솔루션을 알고 있어야합니다! 그렇기 때문에 최적의 경로를 찾는 것이 분할 및 재 조립 기법에 영향을받지 않는 이유
Kilian Foth

2
@KilianFoth, 솔루션 공간을 1에서 시작하여 2에서 시작하여 ... 같은 방법으로 공간을 다시 분할하여 각 노드에서 문제를 해결함으로써 철저한 검색을 수행 할 수 있습니다. 루트에서 합병하는 것은 가장 짧은 경로를 찾는 것입니다. 다른 지점에서 합치는 것은 가장 짧은 '자식 경로 + 지점에서 자식으로가는 경로'를 찾는 것입니다.
dan_waterworth

3
해결책이있는 경우 40 세 미만인 경우 Fields 메달 만받을 수 있습니다.
Francesco

28

분산 컴퓨팅을 사용하여 문제를 효율적으로 해결할 수 있습니까?

이 질문에 대한 답변이 예인 경우 MapReduce에 대한 후보 문제가있는 것입니다. 문제 패턴이 더 작은 격리 된 문제로 분리되기 때문입니다.

당신의 작업 :이 책을 파싱

이것을 설명하기 위해 예제가 잘 작동합니다. 당신은 큰 문서 ( Herman Melville의 Moby Dick )를 가지고 있으며 당신의 임무는 그 단어에 사용 된 모든 단어의 빈도 분석을 수행하는 것입니다.

순차적 접근

가장 빠른 기계 (당신은 주위에 많은 거짓말을 했음)를 얻고 처음부터 끝까지 텍스트를 실행하여 찾은 모든 단어 (키)의 해시 맵을 유지하고 매번 빈도 (값)를 증가 시킴으로써이 작업을 순차적으로 수행 할 수 있습니다 당신은 단어를 구문 분석합니다. 간단하고 간단하며 느립니다.

MapReduce 접근법

이것을 다른 관점에서 접근하면,이 모든 여분의 머신이 놓여 있고이 작업을 여러 덩어리로 나눌 수 있습니다. 각 컴퓨터에 1Mb 텍스트 블록을 해시 맵으로 구문 분석 한 다음 각 해시 맵을 단일 결과로 조합합니다. 계층화 된 MapReduce 솔루션입니다.

한 줄의 텍스트를 읽고 단어를 모으는 과정은 맵 단계입니다 (빈도 1,2,3 등으로 줄에 단어를 나타내는 간단한 맵을 만듭니다). 그러면 감소 단계는 각 기계가 해당 줄을 정렬 할 때입니다 단일 집계 맵으로 매핑합니다.

전체 솔루션은 모든 집계 맵이 최종 단어로 집계되는 추가 축소 단계에서 비롯됩니다. 약간 더 복잡하고, 평행하고 빠릅니다.

요약

요약하면, 문제가 키, 값, 해당 값에 대한 집계 작업을 개별적으로 표현하는 데 적합하다면 MapReduce에 대한 후보 문제가 있습니다.


2
Meh; 그것은 지나치게 단순화 된 것입니다. MapReduce는 데이터를 분할하고 분석기 간 통신없이 조각에 기능을 병렬 로 적용한 다음 비트를 결합하기 위해 다른 기능을 적용하는 것입니다. 모든 배포 가능한 문제가 해당 모델에 맞는 것은 아닙니다.
Donal Fellows

2
공정한 요점-그러나 그것은 유용한 소개 역할을하며 누군가가 그들의 문제를 "상자에 담을 수있게"합니다.
게리 로우

13

MapReduce 패턴은 함수형 프로그래밍 세계에서 가져 왔습니다. 데이터 구조에 카타 모피 즘이라는 것을 병렬로 적용하는 프로세스입니다. 함수형 프로그래머는 거의 모든 간단한 변환 또는 요약에 이형 법을 사용합니다.

데이터가 트리라고 가정하면 결정 요인은 해당 노드에 포함 된 데이터와 해당 하위 노드의 계산 된 값만 사용하여 노드의 값을 계산할 수 있는지 여부입니다.

예를 들어 catamorphism을 사용하여 나무의 크기를 계산할 수 있습니다. 모든 하위에 대해 계산 된 값의 합에 1을 더한 값을 계산합니다.


좋은 대답, @good_computer가 Google이 개발 한 특정 MapReduce 프레임 워크를 참조하고 있는지 확실하지 않습니다. 그리고 Google 프레임 워크에서 MapReduce가 목록에 동형 유형 이외의 다른 것에 적용되는지 여부는 알 수 없습니다.
scarfridge

1
@scarfridge, 나는 OP가 Google 특정 프레임 워크를 참조하지 않는다고 가정했습니다. 게시하기 전에 목록이나 나무에만 사용되는지 여부와 관련하여 Wikipedia 기사를 참조했습니다. en.wikipedia.org/wiki/MapReduce#Overview
dan_waterworth

2
가 호출 된 경우에만 MapFold ; 이해하기가 훨씬 쉬울 것입니다.
Aditya

6

WPI-응용 프로그램 맵 감소 (ppt) 가 관심을 가질 수 있습니다. MR의 다양한 애플리케이션에 대해 설명하고, 논의 된 사례 중 하나 인 New York Times는 100 EC2 인스턴스와 24 시간을 사용하여 4TB의 스캔 된 기사를 1.5TB의 PDF 문서로 변환 할 수있는 방법을 보여줍니다.

MR이 성능을 가속화하는 데 도움이 된 또 다른 예는 다음과 같습니다. Aster-SQL Map Reduce 는 사기 탐지, 변환 등을 포함한 SQL-Map Reduce 기술에 대한 사례 연구를 보여줍니다.


1
스캔 한 기사당 하나의 pdf로 끝나는 경우 MapReduce가 아닌 분산 맵을 사용하는 것입니다. map-reduce에서는 단일 결과를 얻기 위해 맵 결과에 축소를 적용합니다.
피트 커캄

6

맵 / 리 듀스는 특정 종류의 알고리즘의 특정 형태입니다. 하나의 거대한 데이터 세트를 다른 데이터 세트로 변환하는 데 사용합니다. (결과 데이터 세트는 크거나 크지 않을 수 있습니다.) 정적 데이터 입력의 결과로 정적 데이터 출력 세트를 원하지 않으면 맵 / 리 듀스가 적합하지 않습니다. Map / Reduce는 맨해튼 전화 번호부에 몇 개의 John Smiths가 있는지 쉽게 알 수 있지만 웹 서버를 구축하는 데 적합하지 않습니다.

Map / Reduce 작동 방식은 다음과 같습니다.

  • Map은 키 쌍 (k1)과 값 (v1)을 가져 와서 새로운 키 세트 (k2)와 값 (v2)으로 매핑합니다.
  • Reduce는 동일한 k2 키로 모든 v2 값을 가져 와서 새로운 값 (v3)을 생성합니다.

결과적으로 (k1, v1) 쌍 목록이 (v3) 목록으로 변환됩니다. (물론 "v3"값은 k1과 동일하게 정의 될 수있는 k2를 포함하는 복합 일 수 있습니다.)

그래서 당신은 그것을 사용합니다 :

  1. 하나 또는 두 개의 서버를 통해 순차적으로 실행하는 데 필요한 데이터가 너무 많으면 시간이 너무 오래 걸리고

  2. 값 목록 또는 키 값 쌍의 출력 데이터를 생각할 수 있습니다 (일반적으로 "키"는 "고유 레이블"만을 의미 할 때 너무 어렵지 않습니다).

  3. 관계가 무엇이든 각 입력 데이터는 하나의 출력 키에 대한 출력 값에만 영향을줍니다.

단일 서버에서 데이터를 모두 순차적으로 처리 할 수있는 경우, 이것이 지배적 인 컴퓨팅 패러다임이므로 (서버가 구축되고 프로그래머가 훈련 된 것) 단일 서버를 사용하십시오.

맵 스테이지는 모든 입력 데이터를 출력 키로 분할해야합니다. 출력 키와 관련된 출력 값을 생성 할 필요는 없지만 (축소 단계에서 수행됨) 최대 하나의 출력 키 값에 기여하기 위해 각 입력 키 값 쌍을 고유하게 할당해야합니다. 데이터가 너무 상호 연관되어 있으면 map reduce가 문제를 처리하지 못할 수 있습니다. 반면에 여러 라운드의 맵 / 리 듀스를 사용해야 할 수도 있습니다.

데이터 변환을 맵 / 리 듀스로 전환하는 방법을 알 수 없다면 물론 해결책이 아닙니다.

문제가 맵 / 리 듀스가 처리 할 수있는 것으로 분해 될 수 있는지 알아내는 실제 기술이 있습니다. 예를 들어, v1 및 v2는 입력 또는 출력 데이터 세트에 전혀 없을 수 있습니다. 입력 데이터에서 고유 항목을 계산하려면 k1 = k2 = 항목이고 v1 = v2 = 1 또는 0 또는 실제로 무엇이든. 감소는 주어진 k2 수의 합으로 v3을 생성합니다.

따라서 Map / Reduce를 사용하여 데이터 변환을 수행 할 수 없다고 확신하기는 어렵지만 위의 지침을 참고하십시오.


3

MapReduce는 특정 추상화 수준에서 정확히 2 개의 함수로 구성된 모든 문제에 대해 작동합니다. 첫 번째 함수는 입력 집합의 각 항목에 적용되고 두 번째 함수는 결과를 집계합니다.

따라서 (n) 개의 입력에서 (1) 개의 결과를 얻고 싶을 때마다 (1) 기능으로 모든 입력을 검사 / 사용할 수 있으며 MapReduce를 사용할 수 있습니다. 다시 말하지만 이것은 특정 추상화 수준에 있습니다. (1) 기능은 입력을 확인하고 몇 가지 다른 기능 중 사용할 기능을 결정하는 그룹화 기능 일 수 있습니다.

이것은 입력량을 미리 알 수 없거나 신중한 "단위"작업을 공유해야하거나 전체 결과를 나타내는 단일 수익을 원할 때 유용합니다 (IE는 5 천 단위 테스트 실행). x % 미만이 실패하면 성공을 반환합니다.


3

여기의 대부분의 답변은 map reduce의 기능을 설명하는 변형으로 보입니다. 그러나 맵 축소를 사용할 수있는 위치를 나타내는 패턴은 실제로 해결되지 않습니다.

보고있는 문제의 순진하고 기능적이지 않은 구현이 무언가를 반복 한 다음 루프 내부의 상태로 루프 외부의 무언가를 업데이트하는 경우 포트를 줄일 수있는 포트가있을 가능성이 있습니다. 특히 두 개의 매개 변수로 작동하는 함수로 중앙 상태 업데이트를 일반화 할 수 있고이 함수가 정식 및 연관성을 보장 할 수있는 경우.

이것이 사실이라면 map reduce를 사용하려는 이유는 두 가지입니다. 1) 맵으로 나누고 함수를 줄이면 약간 더 깔끔하고 테스트하고 디버그하기가 더 쉽습니다. 2) map reduce 함수는 상태가 없으며 동시에 실행될 수 있습니다. 여러 CPU를 사용할 수 있고 hadoop 또는 spark와 같은 기능을 사용하여 클러스터에서 작업을 실행하면 작업 속도가 빨라집니다.

많은 것들을 반복하고 있지만 마일리지는지도 / 축소의 복잡한 정도에 따라 다를 수 있습니다. 결국 체인의 끝에서 복잡한 축소 단계에서 모든 것이 여전히 병목 현상이 발생하는 순차적 체인 또는 맵 축소 트리로 끝나는 것이 일반적입니다. 예를 들어 많은 그래프 알고리즘은 맵 축소만으로 효율적으로 확장하기가 어렵습니다.

map reduce와 잘 작동하는 가장 간단한 예는 물건을 세는 것인데, 이는 매우 저렴한 축소입니다. 이것이 바로 단어 축소가 맵 축소에 자주 사용되는 예입니다. 해당 유스 케이스로 성능에 대한 선형 확장 성을 기대할 수 있습니다. 추가 할 때마다 CPU가 더 빨라집니다.


2

많은 기능적 프로그래밍을 수행하면 일반 맵을 요구하고 축소하는 상황에 처하게됩니다. 아마도 명령형 프로그래밍에서도 볼 수 있지만 루프 및 누산기 마스크 뒤에는 인식하지 못합니다.

최근에 나를 위해 나온 것의 한 예로서, 나는 Haskell에서 파서를 연구하고 있습니다. 파서를 테스트하기 위해 파서를 통해 문자열 조각 목록을 펌핑 한 다음 결과가 올바르게 구문 분석되는지 확인할 수있는 단일 문자열을 얻고 싶습니다. 따라서 다음과 같습니다.

--my initial set of test data, a list
tests = ["string1", "string2", "string3", ...]

--Map Step: turn strings into parsed results
--note the type, which demonstrates the map
applyParser :: [String] -> [Token]
--The actual function
applyParser input = map parser input

--Second map, turn tokens into output
showTokens :: [Token] -> [String]
showTokens t = map show t

--Reduce step, concat the results
combineResults :: [String] -> String
--In haskell, reduce is the foldl function, which takes an operation to fold with, a starting element, and a list to fold on
combineResults strings = foldl concat "" strings

--Finished program
testParser = print (combineResults(showTokens(applyParser tests)))

물론 이것은 교육적 일뿐입니다. 내 실제 코드는 약간 다르게 보이고 더 많은 내부 함수를 사용합니다 ( fold concat하스켈에 이미 포함되어 있기 때문에 필요 unlines하지 않습니다 [String]->String). 내 주요 요점은 내가 시작할 때지도 / 축소를 사용할 것으로 예상하지 않았다는 것입니다. 나는 목록으로 몇 가지 일을하고 싶었고 내 목록을 단일 출력 요소로 바꿨다. 맵 / 리 듀스의 사용은 자연스럽게 나타났습니다.

문자열 처리 (구문 분석과 같은)는 맵 축소를 매우 분명하게 사용하는 것 중 하나이며, 매핑은 입력 텍스트에 다양한 변형을 적용하고 결과 텍스트를 다시 출력으로 결합하여 줄입니다. 마찬가지로, 폴드를 사용하여 추상 구문 트리 요소 스트림을 더 나은 형태 (최적화)로 만드는 컴파일러도 비슷할 수 있습니다.


1

병렬화 가능합니까?

병렬화 가능한 문제는 본질적으로 맵과 폴드입니다. 반대로, 맵 단계는 본질적으로 병렬화 가능하며 (접는 단계는 접는 구조에 따라 다름) 양방향 속성입니다.


3
난처한 병렬 문제 의 경우에만 해당 됩니다. 병렬화가 가능한 많은 문제가 있지만 간단한 MapReduce가 효율적이지 않은 요소 사이에 충분한 상호 작용이 포함되어 있습니다.
Mark Booth

링크 주셔서 감사합니다, 나는 당황스럽게 패러렐 용어에 대해 몰랐습니다. 모든지도가 해결하기 어려운 문제를 난처하게 해결하지는 않습니까?
Paul Sanwald

1
당황스럽게도 많은 병렬 문제가 있지만 모두 축소 부분이 필요한 것은 아닙니다.
Donal Fellows

1

서버 클러스터를 검색하고 있는데 현재 서버가 응답하지 않는다고 가정하십시오. mapReduce는 트리 노드를 더 큰 Map에 액세스 할 수 없기 때문에 나중에 다시 예약하고 Map 또는 Reduce를 수행합니다. 기본적으로 모든 정보가 환경에서 소프트웨어 및 하드웨어의 예측할 수 없도록 보장되도록 노력합니다.


1

다음은 MapReduce 사용 (또는 사용하지 않음) 결정을 조사하기 위해 사용하는 주요 질문입니다.

  • 주어진 문제에 대해 최소한의 프로그래머 노력으로 합리적인 병렬 실행 성능을 달성하는 것이 중요합니까?
  • 사용할 수있는 수많은 병렬 실행 요소가 있습니까?
  • 병렬 실행 요소 사이에 우수한 통신 대역폭 / 처리량이 있습니까?
  • 대량의 데이터를 처리해야합니까?
  • 해결하려는 문제가 Map and Reduce 작업으로 분해됩니까?

    • 맵 : 모든 데이터에서 동일한 작업을 실행합니다.
    • 감소 : 맵에서 생성 된 각 데이터 그룹에서 동일한 작업을 실행합니다.

1

사실상, 그것은 일반적인 "나누기 및 정복"패턴이므로 계산 분배 솔루션을 일반적으로 작성할 수 있습니다.

간단한 예는 큰 문서와 같습니다. 문제는 해당 문서의 글자 수를 세고 싶다는 것입니다. 단일 컴퓨터에서 실행하는 대신 문서의 모든 단어 배열로 나눌 수 있습니다. 각 단어를 개별적으로 처리하고 결과를 다시 함께 처리 할 수 ​​있습니다.

일반적인 맵 / 감소 구현이 작동하면 동일한 소프트웨어 계층을 사용하여 모든 문제를 해결할 수 있으므로 패턴을 사용하면 문제를 표현할 수 있기 때문에 패턴이 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.