티스토리 뷰

728x90

 

단일 머신에서 멀티 스레드를 활용한 병렬 처리

1. 작업을 동일한 크기로 나누기 어려움
처리해야 할 파일마다 크기가 다른 경우, 결국엔 가장 큰 파일을 처리하는 시간에 의해 전체 처리 시간이 결정된다.
최대한 동일한 크기로 나누고 싶다면 각 파일을 고정 길이의 청크 단위로 나누어 처리할 수는 있다.

2. 병렬 처리된 결과를 병합하는 데 더 많은 처리가 필요할 수 있음
파일을 병렬 처리하여 얻은 중간 결과를 모아서 추가적인 처리를 해야만 최종 결과를 얻을 수 있다.

3. 단일 머신의 처리 능력에 한계가 있음
만약 단일 머신에서 여러 개의 프로세서로 처리할 수 있는 최적의 수행 시간이 20분이라면 그 이상 빨라질 수는 없다.

→ 병렬 처리는 매우 복잡하므로 하둡과 같은 프레임워크를 활용하는 것이 좋다.

 

하둡을 활용한 병렬 처리

하둡이 제공하는 병렬 처리를 이용하기 위해 요구사항을 맵리듀스 작업으로 표현해야 한다. 맵리듀스는 맵 단계와 리듀스 단계로 구분되며, 프로그래머가 맵 함수와 리듀스 함수를 작성해야 한다. 각 단계의 입력과 출력은 key-value 쌍이며 타입은 상관없다.

[예제] 날씨 데이터를 가지고 연도별 최고 기온 구하기

  1. 원본 데이터가 맵 함수의 입력으로 주어진다.
    하나의 레코드는 연도, 위도, 경도, 기온, 풍향 등을 포함한다.
  2. 맵 단계에서 주어진 입력에서 연도와 기온을 추출한다. + 잘못된 레코드 필터링
  3. 맵 단계의 결과로 <연도, 기온> 쌍들이 반환된다.
    <2000, 24> <2001, 14> <2000, 32> <2000, 18> <2001, 22> 
  4. 셔플 단계에서 같은 key를 가지는 데이터를 모으고 key를 기준으로 정렬한다. (key = 연도)
    <2000, [24, 32, 18]> <2001, [14, 22]>
  5. 리듀스 단계에서 연도별 최고 기온을 구한다.  최종 결과
    <2000, 32> <2001, 22>

 

맵리듀스

job은 클라이언트가 수행하는 작업의 기본 단위이며 입력 데이터, 맵리듀스 프로그램, 설정 정보로 구성된다. job은 map 태스크와 reduce 태스크로 나누어 실행되고, 각 태스크는 YARN을 통해 스케줄링된다.

하둡은 입력 데이터를 split이라는 고정 크기의 조각으로 분리한다. split의 크기가 작을수록 부하분산 효과가 좋지만 크기가 너무 작으면 관리를 위한 오버헤드 때문에 실행시간이 증가하게 된다. 보통 HDFS 블록의 기본 크기인 128 MB가 적당하다고 한다.

하둡은 split 마다 하나의 map 태스크를 생성하고 record 단위로 처리한다. 특정 노드의 태스크가 실패하면 다른 노드에 재할당하여 다시 실행한다.

하둡은 입력 데이터가 있는 노드에서 map 태스크를 실행할 때 가장 빠르다. 이를 데이터 지역성 최적화라고 한다. 이 방식은 네트워크 자원 사용을 최소화할 수 있다. 데이터의 복제본이 저장된 모든 노드에서 map 태스크를 실행할 수 없는 경우, 동일 랙이 다른 노드에서 map 태스크를 실행할 수도 있다. 이것도 불가능하다면 네트워크 전송을 통해 외부 랙에서 map 태스크를 실행해야 한다.

map 태스크의 결과는 HDFS가 아닌 로컬 디스크에 저장된다. map 단계의 결과는 reduce 단계에서 최종 결과를 생성하기 위한 중간 결과이므로 job이 완료된 후에는 버려지기 때문이다.

reduce 태스크는 모든 map 태스크의 결과를 입력으로 받는다. reduce 태스크의 결과는 로컬 노드의 HDFS에 저장되고, 외부 랙에 복제본을 저장한다. reducer가 여러 개이면 reducer만큼 파티션을 생성하고 mapper의 결과를 각 파티션에 분배한다. 주로 key를 해싱하여 분배한다. 모든 처리를 완전히 병렬로 처리하는 경우 reducer가 없을 수도 있다.

하둡 클러스터에서 job이 사용하는 네트워크 대역폭은 한계가 있기 때문에 mapper의 결과를 reducer로 전송하기 위한 네트워크 사용을 최소화 하기 위해 combiner 함수를 사용할 수 있다. reduce 함수를 combiner 함수로 재사용할 수 있다. combiner 함수는 적용하는 데에 제약이 있다. 예를 들어 max, min 과 같은 처리는 combiner 함수를 적용해도 최종 결과가 바뀌지 않지만 mean 의 경우엔 최종 결과가 달라지기 때문에 combiner 함수를 적용하기 어렵다.

 

자바의 맵리듀스

  • 맵 단계 : Mapper 클래스의 추상 메소드 map()을 정의하여 구현한다.
  • 리듀스 단계 : Reducer 클래스의 추상 메소드 reduce()를 정의하여 구현한다.
  • Job : Job 클래스로 맵리듀스를 수행할 Job을 정의한다. 
    • 하둡 클러스터에서 Job을 실행하기 위해서는 jar 파일을 생성하여 배포해야 한다.
    • 지정한 출력 파일 경로가 미리 존재한다면 에러가 발생하고 Job이 실행되지 않는다. (데이터 유실 방지)
    • 지정한 출력 타입은 매퍼 및 리듀서가 반환하는 것과 반드시 일치해야 한다. (컴파일 시점에 확인되지 않으므로 주의)

 

하둡 스트리밍

하둡과 사용자 프로그램 사이의 인터페이스이다. 유닉스 표준 스트림을 사용하기 때문에 표준 입출력이 가능한 다양한 언어를 사용해 맵리듀스 프로그램을 작성할 수 있도록 한다.

 

728x90
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
공지사항
링크
Total
Today
Yesterday