MapReduce 이란?           


맵리듀스(MapReduce) 구글에서 대용량 데이터 처리를 분산 병렬 컴퓨팅에서 처리하기 위한 목적으로 제작하여 2004년 발표한 소프트웨어 프레임워크다. 이 프레임워크는 페타바이트 이상의 대용량 데이터를 신뢰도가 낮은 컴퓨터로 구성된 클러스터 환경에서 병렬 처리를 지원하기 위해서 개발되었다. 이 프레임워크는 함수형 프로그래밍에서 일반적으로 사용되는 Map과 Reduce라는 함수 기반으로 주로 구성된다.

현재 MapReduce는 Java와 C++, 그리고 기타 언어에서 적용이 가능하도록 작성되었다. 대표적으로 아파치 하둡에서 오픈 소스 소프트웨어로 적용된다.


- WIKI, 위키백과 -

 

맵리듀스는 배치 기반의 분산 컴퓨팅 프레임워크다.



  • 맵리듀스 모델은 연산 병렬화, 작업 분산, 비안정적 하드웨어 및 소프트웨어를 다루는 복잡성 같은 요소를 추상화함으로써 병렬 처리를 단순화해준다.
  • 맵리듀스는 클라이언트에서 전송한 잡을 병렬화된 작은 맵과 리듀스 작업자로 분배한다.




  • 프로그래머가 할 일맵과 리듀스 함수를 정의하는 것이다.
    • 맵 함수는 키/값 튜플(tuple)을 출력
    • 출력된 튜플은 리듀스 함수에 의해 처리돼 최종 결과를 도출
      • 맵 : (key1, value1) → list(key2, value2)
                    ①                        ②
        ① : 맵 함수는 입력 데이터 소스의 논리적 레코드를 나타내는 키/값 쌍을 입력값으로 받는다.
            파일의 경우 이 값은 한 줄이 될 수 있고, 입력 소스가 DB의 테이블인 경우 한 행이 될 수 있다.
        ② : 맵 함수는 한 개의 입력값 쌍에 대해 0개 이상의 출력 키/값 쌍을 내보낸다.
            예를 들어 맵 함수가 필터링 맵 함수이면 특정 조건이 리듀스 함수에서는 충족될 때만 결과를 출력할 수 있다. 또는 한개의 입력 키/값이 여러 개의 키/값 출력 쌍을 반환하는 역다중화 작업을 수행할 수도 있다.
      • 리듀스 : (key2, list(value2)) → list(key3, value3)
            ①                        ②                    ③
        ① : 리듀스 함수는 고유 맵 출력. 키별로 한 번씩 
        ② : 'key2'에 대해 모든 매퍼에서 내보낸 맵. 출력값이 한 개의 목록으로 제공된다.
        ③ : 맵 함수와 마찬가지로 리듀스 함수도 0개 이상의 키/값 쌍을 출력할 수 있다. 리듀서 출력값은 HDFS 내 플랫 파일에 쓰거나, NoSQL DB에서 행을 삽입/업데이트하거나, 다른 요구 조건에 따라 임의의 데이터 싱크에 쓸 수 있다.




Shuffling : 셔플 및 정렬 단계에서는 두 개의 주요 작업을 처리한다. 맵 출력 키/값 쌍을 수신할 리듀서를 판단하는 작업(파티셔닝이라고 부름)과 해당 리듀서에 대해 모든 입력 키가 정렬되게끔 하는 기능.


각 화살표 별로 설명을 하자면!!

  1. 입력 데이터 분리 : 맵리듀스는 입력 파일을 키와 값 형식의 데이터로 분류한다. 이 예제에서 키는 라인 번호이고 값은 문장이다.
  2. 맵 메서드1 : 키와 값 형식의 데이터는 맵 메서드의 입력 데이터로 전달된다.
  3. 맵 메서드2 : 맵 메서드는 라인 번호별로 문장을 체크해 키에 해당하는 글자별로 글자 수를 출력한다.
  4. 정렬과 병합 : 맵리듀스는 맵 메서드의 출력 데이터를 정렬하고, 병합한다.
  5. 리듀스 메서드 : 4번의 결과가 리듀스 메서드의 입력 데이터로 전달된다.
  6. 저장 : 리듀스 메서드는 새로운 키인 글자별로 각 글자 수를 합산해서 출력하고, 리듀스 메서드의 출력 데이터를 하둡 파일 시스템에 저장한다.



[ 맵리듀스 시스템 ]



  1. 클라이언트
    사용자가 실행한 맵리듀스 프로그램과 하둡에서 제공하는 맵리듀스 API를 의미한다.
    사용자는 맵리듀스 API로 맵리듀스 프로그램을 개발하고, 개발한 프로그램을 하둡에서 실행할 수 있다.
  2. 잡트래커(JobTracker)
    클라이언트가 하둡으로 실행을 요청하는 맵리듀스 프로그램은 (job)이라는 하나의 작업 단위로 관리된다.
    잡트래커는 하둡 클러스터에 등록된 전체 잡의 스케줄링을 관리하고 모니터링한다.
    전체 하둡 클러스터에서 하나의 잡트래커가 실행되며, 보통 하둡의 네임노드 서버에서 실행된다.(반드시 네임노드 서버에서 실행할 필요는 없음)
    사용자가 새로운 잡을 요청하면 잡트래커는 잡을 처리하기 위해 몇 개의 맵과 리듀스를 실행할지 계산한다.
    이렇게 계산된 맵과 리듀스를 어떤 태스크트래커에서 실행할지 결정하고, 해당 태스크트래커에 잡을 할당한다. 이 때 태스크트래커는 잡트래커의 작업 수행 요청을 받아 맵리듀스 프로그램을 실행한다. 잡트래커와 태스크트래커는 하트비트라는 메서드로 네트워크 통신을 하면서 태스크트래커의 상태와 작업 실행 ㅈ어보를 주고받게 된다. 만약 태스크트래커에 장애가 ㅂ라생하면 잡트래커는 다른 대기 중인 태스크트래커를 찾아 태스크를 재실행하게 된다.
  3. 태스크트래커(TaskTracker)
    사용자가 설정한 맵리듀스 프로그램을 실행하며, 하둡의 데이터노드에서 실행되는 데몬이다.
    태스크트래커는 잡트래커의 작업을 요청받고, 잡트래커가 요청한 맵과 리듀스 개수만큼 맵 태스크(map task)와 리듀스 태스크(reduce task)를 생성한다. 






Posted by 밍쫑
,

운영자의 사탕


문제

위 운영자님에게 N개의 사탕이 생겼다. 운영자님은 N개의 사탕을 K명의 회원들에게 나눠주고 싶어한다. 그런데 멤버십 회원들 사이에는 서열이 존재하여, 서열이 높은 사람은 서열이 낮은 사람보다 같거나 많은 수의 사탕을 받아야한다. 모든 멤버십 회원이 사탕을 1개 이상은 받아야 한다고 가정한다. 

사탕 수와 회원 수가 주어졌을 때, 사탕을 나눠주는 경우의 수를 구해보자.

 

입력

사탕 수 N ( 1 <= N <= 200 ), 회원 수 K ( 1 <= K <= N ) 가 입력으로 주어진다.

출력

결과는 64 비트 정수 형내의 값이다.

 

예제 입력​

7 3

예제 출력

4

입출력 설명

1 1 5
1 2 4
1 3 3
2 2 3

출제자 : 안일규



(http://183.106.113.109/30stair/moving/moving.php?pname=moving)

Posted by 밍쫑
,

규민이는 유성온천 부자


문제 

규민이는 멤버십에서 제일 가는 부자이다. 규민이네 정원 안에는 큰 온천가 있고, 그것을 막는 댐이 있었다. 

그런데 어느날 그 댐이 무너져내려 온천에 있는 유황온천수가 규민이네 정원을 모두 뒤덮으려한다. 

온천에 있는 유황온천수는 다음 1시간에 한 블럭으로 이동하며, 규민이네의 유황온천수는 무한하다. 

유황온천수는 상 하 좌 우로 퍼져나가며 마을을 뒤덮는다.

 

규민이네 가정부인 당신은 댐이 터진 순간 규민이네 정원 지도를 받았다. 

당신이 수행해야 할 일은 완공시간이 K시간인 댐들을 최대한 빨리 지어서 유황온천수가 더 이상 진행하지 못하도록 하는 것이다.

 

입력

첫 줄에는 배열의 크기인 T(1 ≤ T ≤100)가 주어지고

다음 줄부터 배열의 값이 주어진다. 0은 텅 빈 정원, 1은 정원에 있는 건물이다. (유황온천수는 건물을 뒤덮지 못한다고 가정한다.)

그리고 그 다음 줄에는 유황온천수가 터진 좌표 x, y가 주어지고,

다음 줄에는 댐이 지어지는 시간인 K가 주어진다.


출력

지어야 하는 댐의 숫자를 출력한다. 

만약, 정원이 전부 잠길 때까지 댐을 지을 수 없거나 건물에 둘러쌓여 물이 더이상 진행을 못할 경우엔 "OH, MY GOD"을 출력한다. 

(좋은 의미로든, 나쁜 의미로든....)


예제 입력​

5
0 1 0 0 1
0 0 0 0 0
1 1 1 0 1
0 0 0 0 0
1 0 1 0 1
1 1
5

예제 출력

3


예제 입력​

5
0 0 1 0 0
0 0 0 0 0
1 1 1 0 0
0 0 1 1 0
0 0 0 0 0
5 2
3

예제 출력

2


입출력 설명

첫 번째 입력에서 (1,1) 위치에서 유황온천수가 터졌다면, 유황온천수는 시간마다 다음과 같이 진행된다.

(B는 건물의 위치)


0 B 4 5 B

1 2 3 4 5

B B B 5 B

9 8 7 6 7

B 9 B 7 B


그러므로 5 시간인 세군데를 막아 유황온천수이 진행하지 못하게 하는 것이 최선이다.

그러므로 출력이 3

출제자 : 임현수


(http://183.106.113.109/30stair/dam/dam.php?pname=dam)

Posted by 밍쫑
,