기존 자바로 작성된 jar 기반으로 하는 대신에 하둡 스트리밍을 이용하여 Python같은 스크립트 언어로 Mapper와 Reducer를 만들어서 실행합니다. 이번 글에서는 항공 데이터를 이용하여 년.월별 운항 횟수를 출력해보겠습니다.

Python 위치 확인

우선 리눅스에서 python의 위치를 확인해봅니다.

which python
/usr/bin/python3


mapper 생성

Python의 위치를 확인 후 아래 스크립트를 mapper.py라는 이름으로 리눅스에 만듭니다.

#!/usr/bin/python3

import sys

for line in sys.stdin:
        columns = line.strip().split(",")
        outputkey=columns[0]+"."+columns[1]

        if len(columns)>14 and columns[14].isdigit() and int(columns[14])>0:
                print('{}\t{}'.format(outputkey, 1))

실행할 파일 최상단에 #![프로그램 위치]를 입력하면 해당 프로그램을 기반으로 스크립트가 동작하게 됩니다.

입력된 파일을 한 줄씩 읽어와 ,를 구분자로 사용하여 나누고 1,2번째 원소를 이용해 년.월이라는 변수를 생성합니다.

다음에는 도착 지연 시간이 양수인 경우 (년.월, 1)을 출력합니다.


reducer 생성

다음으로 아래 스크립트를 reducer.py라는 이름으로 리눅스에 만듭니다.

#!/usr/bin/python3

inputkey = None
inputvalue=0
outputkey = None
outputvalue=0

for line in sys.stdin:
    columns = line.strip().split("\t")
    inputkey, inputvalue = columns[0], int(columns[1])

    if outputkey == inputkey:
        outputvalue+=inputvalue
    else:
        if outputkey:
            print('{}\t{}'.format(outputkey, outputvalue))
        outputkey = inputkey
        outputvalue = inputvalue
if outputkey == inputkey:
    print(f'{inputkey}\t{outputvalue}')

mapper에서 (년.월, 1)을 받게 되는데 key값에 년.월을, value에 숫자를 줍니다. 같은 key에 대해서 횟수를 추가하며 key가 바뀔 때마다 년.월에 대한 횟수를 출력하게 됩니다.

하둡 실행 생성

Python 스크립트를 다 작성했으면 명령어를 통해 하둡을 실행합니다.

manager@master:/usr/local/hadoop/code$ hadoop jar ../share/hadoop/tools/lib/hadoop-streaming-2.9.2.jar -input /airdata/2008.csv -output /pyoutput2 -mapper mapper.py -reducer reducer.py


명령어의 문법 설명은 이렇습니다.

hadoop jar ../share/hadoop/tools/lib/hadoop-streaming-2.9.2.jar -input [입력할 파일 위치] -output [결과 파일이 저장될 위치] -mapper [mapper 파일] -reducer [reducer 파일]


명령어 실행 완료 후 파일 내용을 확인해봅니다.

hadoop fs -cat /pyoutput2/part-00000
2008.1 279427
2008.10 183582
2008.11 181506
2008.12 280493
2008.2 278902
2008.3 294556
2008.4 256142
2008.5 254673
2008.6 295897
2008.7 264630
2008.8 239737
2008.9 169959