A Column

[이응수의 IT노트] 맵리듀스 애플리케이션을 활용해서 데이터 분석하기

장성민

view : 984


[이응수의 IT노트] 맵리듀스 애플리케이션을 활용해서 데이터 분석하기



안녕하세요. 중앙HTA 이응수 강사입니다.

오늘은 하둡의 맵리듀스 프레임워크를 활용해서 아래에 제시된 데이터를 분석하는

간단한 애플리케이션을 작성해보도록 하겠습니다.

입력데이터(종관기상관측자료 - 2016년 서울)

파일명 : 108_DAY_2016.csv

지점,일시,평균기온(°C),최저기온(°C),최저기온 시각(hhmi),최고기온(°C),최고기온 시각(hhmi)

108,2016-01-01,1.2,-3.3,456,4,1442

108,2016-01-02,5.7,1,744,9.5,1514

중간 생략

108,2016-02-23,0.7,-4.5,2357,4.5,1444

108,2016-02-24,-3,-6.8,741,2.2,1429

108,2016-02-25,-0.2,-5.8,248,5.7,1606

108,2016-02-26,2.2,-3.2,634,7.5,1502

108,2016-02-27,3.3,0.5,732,8.1,1424

108,2016-02-28,0.7,-2.6,2355,6.9,1133

108,2016-02-29,-3.8,-5.9,2359,-1.1,1605

(자료출처 : https://data.kma.go.kr/data/grnd/selectAsosList.do?pgmNo=34)

위의 데이터는 2016년 서울 관측소에서 측정된 기상데이터의 일부입니다.

위의 데이터를 사용해서 2016년 월별 최고 기온을 구하는 맵리듀스잡을 작성하도록 하겠습니다.

 

먼저 분석대상 데이터를 하둡 파일시스템으로 복사합니다.

기상데이터를 저장할 디렉토리를 만듭니다.

$$HADOOP_HOME/bin/hadoop -mkdir input_kma

다운받은 기상데이터를 하둡 파일시스템에 추가합니다.

$$HADOOP_HOME/bin/hadoop fs -put 108_DAY_2016.csv input_kma

하둡 파일시스템으로 파일이 복사되었는지 확인해봅니다.

$$HADOOP_HOME/bin/hadoop fs -ls input_kma


이클립스에서 하둡 클라이언트 프로그램 개발환경을 구성합니다.

메이븐 프로젝트를 생성하고, pom.xml에 hadoop-client 의존성을 추가합니다.


 

하둡의 맵리듀스 작업은 맵 단계와 리듀스 단계로 구성됩니다.

본 예제에서 맵 단계의 입력 데이터는 여러 행으로 구성된 기상 데이터입니다.

맵 단계의 입력은 각 행이 시작되는 지점까지의 위치를 나타내는 오프셋을 Key로, 각 행의 텍스트를 Value로 전달받습니다.

맵 함수는 보통 key는 무시하고, value에서 원하는 데이터를 추출하거나 변형합니다.


 

  

맵 함수는 Mapper 클래스를 상속받고, Mapper클래스에 정의된 추상메소드 map( ) 메소드를 재정의합니다.

Mapper클래스는 네 개의 제네릭 타입을 가집니다.

예제에서 입력키는 long타입의 오프셋, 입력값은 한 행의 내용, 출력키는 월, 출력값은 Double타입의 기온입니다.

하둡은 자바의 기본자료형 대신 자체적인 기본 데이터 타입을 제공하는데, 자바의 Long에 해당하는 LongWritable, 자바의 String에 해당하는 Text,

자바의 Integer에 해당하는 IntWritable, 자바의 Double에 해당하는 DoubleWritable 등을 제공합니다.

map( )메소드의 구현내용은 한 행의 텍스트를 입력값으로 전달받아서 자바 String으로 변환하고, 각 행에서 월과 그날의 최고 기온을 추출했습니다.

map( )메소드는 데이터를 출력하기 위해서 Context객체를 제공합니다.

예제에서는 Text를 키로 DoubleWritable을 값으로 사용하는 데이터를 출력레코드로 기록합니다.


맵 함수 입력

(오프셋 텍스트)

맵 함수 출력

(월 기온) *각 월별로 30개의 데이터, 총 365개의 레코드가 출력됩니다.

(0 108,2016-01-01,1.2,-3.3,456,4,1442)

(50 108,2016-01-02,5.7,1,744,9.5,1514)

중간 생략

(500 108,2016-02-23,0.7,-4.5,2357,4.5,1444)

(550 108,2016-02-24,-3,-6.8,741,2.2,1429)

(600 108,2016-02-25,-0.2,-5.8,248,5.7,1606)

(650 108,2016-02-26,2.2,-3.2,634,7.5,1502)

(01 4.0)

(01 9.5)

중간 생략

(02 4.5)

(02 2.2)

(02 5.7)

(02 7.5)

 

리듀스단계의 리듀스 함수도 Reducer 클래스를 상속받고, Reducer클래스에 정의된 추상메소드 reducer( ) 메소드를 재정의합니다.

Reducer 클래스 역시 네 개의 제네릭 타입을 가집니다. 리듀스의 입력 타입은 맵단계의 출력 타입과 동일합니다.

리듀스의 출력타입은 Text와 DoubleWritable인데 Text에는 월, DoubleWritable는 해당 월의 최고 기온을 나타냅니다.


 

맵함수의 출력이 리듀스 함수의 입력으로 보내지는 과정은 맵리듀스 프레임워크에 의해 처리됩니다.

이 과정에서 맵함수의 출력레코드는 키를 기준으로 정렬되고 그룹화됩니다.

예제에서는 맵 함수의 출력키가 , 출력값은 기온이기 때문에 출력키인 월을 기준으로 정렬하고,

같은 월을 가진 기온들을 그룹화해서 아래와 같은 형식의 입력데이터가 리듀스함수의 입력으로 전달됩니다.

리듀스 함수에서는 그룹화된 기온데이터에서 해당 월의 가장 높은 기온을 찾고, 그 결과를 리듀스 함수 출력레코드로 기록합니다.

 

리듀스 함수 입력

(월, [해당 월의 기온들])

리듀스 함수 출력

(월, 최고기온)

(01, [4.0, 9.5, ....])

(02, [4.5, 2.2, 5.7, 7.5, ....])

중간 생략

(09, [20.5, 21.2, 18.7, 23.5, ....])

(10, [12.5, 17.2, 13.7, 15.5, ....])

(11, [10.5, 11.2, 9.7, 7.5, ....])

(12, [8.5, 9.2, 10.7, 6.5, ....])

(01 9.5)

(02 7.5)

중간 생략

(09 23.5)

(10 17.2)

(11 11.2)

(12 10.2)

   

맵리듀스 잡을 실행하기 위해서는 드라이브 클래스가 필요합니다. 드라이버 클래스에서는 맵리듀스잡 객체를 생성하고,

맵리듀스잡에 드라이버 클래스, 맵클래스, 리듀스클래스, 출력타입 등을 설정합니다.


 

 

맵클래스, 리듀스클래스, 드라이버 클래스의 구현이 완료되면 jar 파일로 묶습니다.

이클립스를 사용 중이라면 이클립스 "Run As -> Maven Build"를 선택한 후 goal 항목에 "clean install"을 입력하면 jar 파일이 생성됩니다.

생성된 jar파일(예제에서는 hadoop-mapreduce.jar입니다)은 FTP 프로그램을 활용해서 Hadoop이 실행중인 Linux 머신으로 업로드합니다.

jar파일 업로드가 완료되면 터미널에서 아래와 같이 입력합니다.



맵리듀스 프로그램을 실행하면 아래와 같은 로그가 출력됩니다.



중간 생략



로그 내용에서 가장 중요한 내용을 Map input records와 Reduce input records와 Reduce output records입니다.

본 예제에서는 맵함수입력은 366건, 리듀스함수 입력은 366건이 입력되어, 리듀스함수 출력이 12건 생성되었습니다.

 

맵리듀스 프로그램의 실행이 완료되면 출력파일 경로로 지정된 곳에 파일이 생성됩니다. hadoop 파일 시스템 명령어로 결과를 조회할 수 있습니다.



실행해보면 월별로 최고기온이 출력된 것을 확인할 수 있습니다.

맵리듀스 프로그램의 실행이 완료되면 출력파일 경로에 여러 개의 파일과 폴더가 저장된 것을 확인할 수 있습니다.

이 중에서 리듀스의 출력결과는 part-r-0000으로 저장됩니다.

 

이상으로 기상데이터로부터 월별 최고기온을 분석하는 맵리듀스 프로그램을 작성해보았습니다.

맵리듀스프레임워크를 활용하면 다양한 방법으로 하둡분산파일시스템에 저장된 대용량의 데이터를 분석할 수 있습니다.

다음에는 하둡분산파일시스템의 주요 파일시스템 명령어들을 살펴보겠습니다.





<저작권자(c)중앙에이치티에이(주). 무단전재-재배포금지>



먼저 비밀번호를 입력하여 주세요.

창닫기확인

TOP