본문 바로가기

Tech/Hadoop

[Hadoop]하둡 완벽가이드 요약 (2)

2장


2장은 맵리듀스에 대한 설명을 한다.

20세기(1900~2000년도) 전 세계 날씨 데이터(약 407GB)를 가지고 해당 장에서 설명한다.

 

Data Access | National Centers for Environmental Information (NCEI)

Free access to NCEI's archive of global coastal, oceanographic, geophysical, climate and historical weather data. These data include quality controlled daily, monthly, seasonal, and yearly measurements of temperature, precipitation, wind, degree days, ocea

www.ncei.noaa.gov

 

awk 사용하여, 각 년도별 최고 기온을 처리하는데 EC2 CPU XL에서 42분이 소모됐다고 한다.

시간을 줄이기 위해 파일을 스레드별로 나누어서 처리하려 한다.

하지만, 이때 발생하는 문제가 있다.

  1. 각 파일을 스레드별로 분류하게 되면, 결국 전체 수행시간은 가장 긴 파일을 처리하는 시간으로 결정된다.
  2. 독립적인 프로세스의 결과를 모두 합치는데 더 많은 처리가 필요할 수 있다.
  3. 단일머신의 처리능력은 한계가 있다.

해결법은 아래와 같다.

→ 고정길이의 데이터 청크로 나누고 분배, 처리한다. 단일머신 이슈는 분산 병렬 처리를 수행하도록 한다.

 

맵리듀스 작업은 맵 단계와 리듀스 단계로 구분된다.

각 단계는 입력과 출력으로 Key-Value 형태이다. 이때 Type은 프로그래머가 선택

맵, 리듀스 함수 또한 프로그래머가 작성한다

 

ex) 단일 맵리듀스 동작. 날씨 데이터를 가지고 연도별 최고 온도를 추출한다면,,

아래는 원본 데이터의 형태이다.

29070999991901-01-01T06:00:00464.333333323.455KALAJOKIULKOKALLAFIFM-1299999V0202701N015919999999N0000001N9-00781+9999910200108991999999999999999999
...

각 행은 Key-Value로 변환되어 맵 함수의 Input이 된다.

(각 행의 시작 offset, 2907...)

Output으로 각 행마다 연도와, 온도를 추출하고 출력한다.

(1950, 0)
(1950, 22)
(1949, 111)
(1949, 78)

맵 함수의 Output은 리듀스 함수의 Input으로 보내지는데, 이때 보내지는 과정은 맵리듀스 프레임워크에 의해 처리된다.(Shuffle 자세한 내용은 추후)

리듀스 함수의 Input은 다음과 같다

(1949, [111,78])
(1950, [0,22])

리듀스 함수에서는 리스트 내 최고 기온값을 측정한다.

리듀스 함수의 Output은 다음과 같다

(1949, 111)
(1950, 22)

맵, 리듀스 함수를 작성 하고 테스트는 작은 데이터셋으로 테스트하는 것이 좋다.

디버깅할때, Job과 Task의 식별자는 유용하니 참고.

Counters에서는 하둡이 수행한 각 잡에 대한 통계를 보여준다.

 


 

맵리듀스의 Job은 작업의 기본단위이다.

입력 데이터, 맵리듀스 프로그램, 설정 정보로 구성된다.

 

하둡은 Job을 맵 테스크, 리듀스 테스크로 나누어 실행한다.

 

각 태스크는 YARN을 이용하여 스케줄링하고 여러 노드에서 실행된다.

특정 노드의 태스크가 실패하면 자동으로 다른 노드에 할당되고, 다시 실행된다.

 

하둡은 맵리듀스의 잡의 입력을 스플릿이라 한다.

고정크기의 조각으로 분리되며, 각 스플릿마다 하나의 맵 태스크를 생성하고 스플릿의 각 레코드를 사용자 정의 맵 함수로 처리한다.

스플릿 크기가 너무 작으면 스플릿 관리와 맵 테스크 생성을 위한 오버헤드 때문에, 잡의 실행 시간이 증가하는 단점이 존재한다.

가장 적절한 크기는 128MB(하둡v2.0 기준)이다. (크기는 수정가능)

 

입력 데이터가 있는 노드에서 맵태스크를 실행할 때 가장 빠르다.

만약 동일 노드에서 맵 태스크 실행할 여유가 없다면, 다른 노드에서 맵 태스크 실행.

위 또한 여유가 없다면, 다른 렉의 노드에서 실행.

 

최적의 스플릿 크기는 HDFS 블록 크기와 같아야한다.

이유는, 그 블록 크기가 단일 노드에 저장된다고 확신할 수 있는 가장 큰 입력 크기이기 때문.

 

맵 태스크 결과는 HDFS가 아닌 로컬디스크에 저장된다.

이유는, 리듀스 테스크에서 사용하기 위한 중간 결과물이고, Job이 완료된 후 맵의 결과는 버려지기 때문. (HDFS에 저장하게되면 데이터의 중복)

맵 태스크의 모든 결과는 리듀스 태스크가 실행중인 노드로 전송되고, 결과를 병합 후, 리듀스 함수로 전달 된다.

 

리듀스 테스크의 수는 입력 크기와 상관없이 독립적으로 지정 가능하다.

리듀스 테스크의 결과는 HDFS에 저장한다.

 

리듀스가 여러개면, 맵 태스크는 리듀스 수 만큼 파티션을 생성한다.

맵 태스크는 여러 파티션에 값을 저장하며, 파티션간 데이터의 중복은 없다.

 

컴바이너 함수는 맵과 리듀스 태스크 사이의 셔플단계에서 데이터 전송을 최소화 하기 위한 함수이다.

컴바이너 함수의 호출 수와 상관없이 리듀스의 결과는 언제나 같다.

반응형

'Tech > Hadoop' 카테고리의 다른 글

[Hadoop]하둡 완벽가이드 요약 (4)  (0) 2022.03.06
[Hadoop]하둡 완벽가이드 요약 (3)  (0) 2022.03.05
[Hadoop]하둡 완벽가이드 요약 (1)  (0) 2022.03.03
[Hadoop]hadoop (2)  (0) 2022.02.27
[Hadoop]hadoop (1)  (0) 2022.02.26