Hadoop Chapter 2. 맵리듀스 2010301027 김영지
2.1 기상 데이터셋 2.1.1 데이터 포맷 - 국립기후자료센터(http://www.ncdc.noaa.gov/)로부터 가져온 기상 데이터 사용. - 예제에서는 http://www.hadoopbook.com/ 에 있는 데이터 사 용. : 이 데이터들은 반구조적이면서도 레코드 지향적이기 때문에 맵리 듀스를 이용한 데이터 분석에 적합하다. (각 행이 하나의 레코드이며 행 단위의 ASCII형식으로 저장되어있다.)
2.2 유닉스 도구로 데이터 분석하기 Awk - ‘awk’는 행 기반의 데이터 처리를 위한 유닉스 도구. #!/usr/bin/env bash for year in all/* do each –ne ‘bashname $year .gz’ “\t” gunzip –c $year | \ awk ‘{ temp = substring($0, 88, 5) + 0; q = substring($0, 93, 1); if(temp != 9999 && q ~ /[01459]/ && temp > max = temp } END { print max }’ done0000 % ./max_temperature.sh
2.2 유닉스 도구로 데이터 분석하기 문제점 - 이 방법으로 20세기 전체에 대한 완전한 수행은 하나의 EC2 고성 능 CPU XL 인스턴스에서 42분이 걸림. : 처리 속도를 높이기 위해서는 프로그램의 각 부분을 병렬로 수행할 필요가 있다. -> 이러한 이슈를 처리하기 위해 하둡 프레임워크를 사용.
2.3 하둡으로 데이터 분석하기 2.3.1 맵과 리듀스 - 맵리듀스는 맵 단계와 리듀스 단계로 처리 과정을 나누어 작업. _ 각 단계는 입력과 출력으로써 키-값 쌍을 가지고 있고 그 타입은 프로그래머가 선택. <기상데이터를 이용한 예제>에서 맵 함수 : 분석대상인 연도와 기온을 추출한다. 리듀스 함수 : 연도별로 최고 기온을 찾아준다.
2.3 하둡으로 데이터 분석하기 2.3.2 자바 맵리듀스 최고 기온을 구하는 Mapper예제
최고 기온을 구하는 Reducer예제
기상청 데이터셋으로부터 최고 기온을 찾는 프로그램
2.3 하둡으로 데이터 분석하기 2.3.2 자바 맵리듀스 - 컴파일 # javac –classpath /hadoop-core-x.y.z.jar가 있는 경로/ –d /class파일을 저장할 경로/ /java파일이 있는 경로/ ex)(자바파일이 있는 경로에서) # javac –classpath /usr/hadoop- 1.2.1/hadoop-core-1.2.1.jar –d classes MaxTemperatureMapper.java
2.3 하둡으로 데이터 분석하기 2.3.2 자바 맵리듀스 - jar 생성 # jar cvf 파일이름.jar /jar파일로 압축할 디렉토리/ ex)(jar파일을 저장할 경로에서) # jar cvf MaxTemperature.jar classes
2.3 하둡으로 데이터 분석하기 2.3.2 자바 맵리듀스 - 실행 # hadoop jar /jar파일이 있는 경로/파일이름.jar Main문이 있는 클래스명 /입력할 데이터가있는 경로/ /출력할 디렉토리/ ex)(jar파일이 있는 경로에서) # hadoop jar MaxTemperature.jar MaxTemperatureWithCombiner /usr/hadoop- 1.2.1/input/sample.txt /usr/hadoop-1.2.1/output/ (이때 output 디렉토리는 존재하지 않아야 함)
2.3 하둡으로 데이터 분석하기 2.3.2 자바 맵리듀스 - 확인 # cat /output디렉토리/part-r-00000
2.4 분산형으로 확장하기 2.4.1 데이터 흐름 - 맵리듀스 잡은 클라이언트가 수행하려는 작업의 단위. - 맵리듀스 잡은 입력데이터, 맵리듀스 프로그램, 설정 정보로 구성. _ 하둡은 잡을 맵 태스크와 리듀스 태스크로 나누어 실행.
- 잡 실행과정을 제어하기 위해 하나의 잡트래커와 다수의 태스크트래 커가 존재 - 잡 실행과정을 제어하기 위해 하나의 잡트래커와 다수의 태스크트래 커가 존재. 잡트래커는 태스크트래커가 수행할 테스크를 스케쥴링. 태스크트래커는 태스크를 수행하고 각 잡의 전체 경과를 하나 의 레코드로 유지하는 경과 보고서를 잡트래커에게 보냄. 만일 태스크가 실패하면 잡트래커는 그것을 다른 태스크트래커 에게 다시 스케쥴. - 하둡은 맵리듀스의 잡을 스플릿이라고 불리는 고정크기의 조각으로 나눔. 하둡은 각 스플릿마다 맵 태스크를 생성. 그 스플릿에 있는 각 레코드를 사용자 정의 맵 함수로 처리. -> 전체 입력을 통째로 처리하는 시간보다 스플릿을 통해 분할된 조각을 처리하는 시간이 더 짧게 걸리고, 그 스플릿을 병렬로 처리할 경우 비율 적으로 더 많은 스플릿을 처리할 수 있기 때문에 부하 분산에 더 좋은 효 과를 낸다.
- 지역성 최소화 : 하둡은 HDFS 내의 입력 데이터가 있는 노드에서 맵 태스크를 실행할 때 가장 잘 작동된다 - 지역성 최소화 : 하둡은 HDFS 내의 입력 데이터가 있는 노드에서 맵 태스크를 실행할 때 가장 잘 작동된다. (클러스터의 중요 자원인 네트워크 대역폭을 사용하지 않기 때문) - 최적의 스플릿 크기 = HDFS 블록 크기. (단일 노드에 저장된다고 확신할 수 있는 가장 큰 입력크기이기 때문) [그림2-3]단일 리듀스 태스크의 맵리듀스 데이터 흐름
2.4 분산형으로 확장하기 2.4.2 컴바이너 함수 -컴바이너 함수의 출력이 결국 리듀스 함수의 입력이 된다. 2.4.2 컴바이너 함수 -컴바이너 함수의 출력이 결국 리듀스 함수의 입력이 된다. (맵리듀스 잡은 클러스터 내에서 이용할 수 있는 대역폭이 제한적이 기 때문에 맵과 리듀스 태스크 간의 데이터 전송 최소화 할 필요가 있다.) job.setCombiner(MaxTemperatureReducer.class); 만 추가해주면 된다. -> 컴바이너 함수를 추가하여 수행할 경우 CPU XL 인스턴스를 실 행중인 10개의 노드의 EC 클러스터에서 프로그램이 수행된 시간은 6분이었다.
2.5 하둡 스트리밍 2.5.1 루비 2.5.2 파이썬 하둡에서는 자바 외에 다른 언어로 맵과 리듀스 함 수를 작성할 수 있는 맵리듀스 API를 제공한다.
2.6 하둡 파이프 하둡 파이프는 하둡 맵리듀스를 위한 C++ 인터페 이스의 이름이다.