빅데이터/하둡

하둡 1.0 튜토리얼 - (17) 하둡 스트리밍

_금융덕후_ 2019. 7. 21. 17:26
728x90
반응형

 

하둡스트리밍

하둡 스트리밍이란, 기존 자바로 맵리듀스를 실행하던것 외에

스크립트 언어 (파이썬, 루비, 셸스크립트 등)를 하둡에서 실행하게 해주는 인터페이스를 말합니다.

맵리듀스가 일정 시간동안 쌓인 데이터를 한번에 배치처리 하는 개념이었다면,

하둡스트리밍은 그때그때 데이터를 처리해야할 필요가 있을때 많이 쓰는 방식입니다.

 

하둡스트리밍 패키지

하둡 스트리밍을 실행하기 위해서는 contrib/streaming 디렉터리의 hadoop-streaming-1.2.1.jar 파일이 필요합니다.

이 jar파일을 사용해 스크립트를 실행시키는 구조입니다.

하둡 스트리밍을 사용하기 위한 기본적인 커맨드 문법은 다음과 같습니다.

> hadoop jar hadoop-streaming-1.2.1.jar \
	-input 입력경로 \
	-output 출력경로 \
	-mapper 매퍼소스
	-reducer 리듀서코드

 

파이썬 하둡 스트리밍

먼저 하둡 스트리밍을 비교적 편하게 쓰기위해 Alias를 등록해주겠습니다.

.bashrc파일을 열어 아래의 Alias를 더해줍니다.

alias hadoop-stream="~/hadoop/bin/hadoop jar ~/hadoop/contrib/streaming/hadoop-streaming-1.2.1.jar"

이는 위에서 언급했던 hadoop-streaming jar파일을 실행시켜주는 커맨드입니다.

이제 hadoop-stread뒤에 옵션들만 넣어주면 됩니다.

 

Mapper 파일

아래는 파이썬으로 구현한 Mapper파일입니다.

이 파일은 stdin 즉 리눅스의 표준스트림 (콘솔입출력)에서 라인을 받아옵니다.

그리고 14번 컬럼 즉 도착 딜레이가 있다면 1을 출력하게 되어있습니다.

#!/usr/bin/python

import sys

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

        if len(columns) > 14 and columns[14].isdigit() and int(columns[14]) > 0:
                print '%s\t%s' % (output_key, 1)

위의 코드에서 주의하셔야 할 점은 첫줄인 #!/usr/bin/python입니다.

위의 첫 줄이 있어야 하둡 스트리밍 프로세스가 파이썬의 경로를 보고 실행할 수 있습니다.

만약 파이썬을 따로 설치해 주셨다면 이 부분을 설치하신 파이썬 경로로 설정하셔야 합니다.

아마 튜토리얼을 따라하셨다면, CentOS를 Infrastructure Server로 설치하셨을 것이고,

위의 경로가 기본 파이썬 2.7 경로일 것입니다.

 

Reducer 파일

파이썬 리듀서 파일은 다음과 같습니다.

이 파일 역시 stdin으로 라인을 받아오고, 같은 키에 따라 집계를 실행합니다.

#!/usr/bin/python

import sys

input_key = None
input_value = 0
output_key = None
output_value = 0

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

        if output_key == input_key:
                output_value += input_value
        else:
                if output_key:
                        print '%s\t%s' % (output_key, output_value)
                output_value = input_value
                output_key = input_key
if output_key == input_key:
        print '%s\t%s' % (input_key, output_value)

 

하둡 스트리밍 실행

이제 위의 파일들을 사용해 하둡 스트리밍으로 맵리듀스를 실행하겠습니다.

> hadoop-stream -files ArrivalDelayMapper.py,ArrivalDelayReducer.py \
	-input input \
	-output arr_delay_count_py \
	-mapper ArrivalDelayMapper.py \
	-reducer ArrivalDelayReducer.py

 

옵션 설명

위 옵션들은 다음과 같습니다.

-files -> 스트리밍에 사용할 파일들을 지정해줍니다.

-input -> 입력 파일들이 있는 위치입니다.

-output -> 출력파일이 들어갈 위치입니다.

-mapper -> 매퍼 파이썬 파일입니다.

-reducer -> 리듀서 파이썬 파일입니다.

이때 files를 적용하지 않으면 아래 mapper와 reducer를 지정해줄때 파일들의 경로를 따로 설정해주어야 합니다.

이를 방지하기 위해 먼저 files옵션으로 파일들을 지정해줍니다.

 

결과 확인

이제 아래 커맨드를 사용해 결과를 확인합니다.

> hadoop fs -cat arr_delay_count_py/part-00000 | head -10

결과를 확인해보면 보이는 바와 같이 정렬은 되지 않았지만 결과가 잘 나온것을 볼 수 있습니다.

1987,10 265658
1987,11 255127
1987,12 287408
1988,1  261810
1988,10 230876
1988,11 237343
1988,12 249340
1988,2  242219
1988,3  255083
1988,4  219288

 

참고자료

이 포스팅은 "시작하세요! 하둡 프로그래밍" 책의 예제를 무작정 따라해본 포스팅입니다.

https://wikibook.co.kr/beginning-hadoop-programming-2rev/

728x90
반응형