지구정복

[HDFS&MR] (역대급삽질) Execute Hadoop Streaming using Python | 파이썬으로 하둡 스트리밍 실행하기 본문

데이터 엔지니어링 정복/HDFS

[HDFS&MR] (역대급삽질) Execute Hadoop Streaming using Python | 파이썬으로 하둡 스트리밍 실행하기

eeaarrtthh 2021. 6. 2. 17:27
728x90
반응형
SMALL

와 진짜 역대급 삽질이었다. 거의 이틀 동안 죽는줄 알았다...;

 

하둡 스트리밍 많이하지는 않지만 혹시라도 나처럼 이틀이란 시간을 낭비하는 분이 없기를 바라면서 작성한다.

 

먼저 에러설명 이후에 올바른 사용법을 설명한다.

 

1. 내가 만난 에러들

-그런 파일이나 디렉토리를 찾을 수 없습니다.

맵리듀스 실행했는데 이런 에러가 뜨면 정말 경로문제가 맞다. 

 

먼저 하둡 스트리밍 명령어 주요 옵션들의 경로를 확인한다.

-file : 매퍼와 리듀스가 있는 로컬 디렉토리이고 매퍼와 리듀스 파일명까지 적어준다.

-mapper : 매퍼 파일명만 적어준다.

-input : hdfs에서 가져올 input데이터 경로이다.

-output : hdfs에 저장될 결과 데이터 경로이다.

 

하둡 스트리밍 명령어가 이상없으면 혹시 분산환경에서 실행하고 있는지 확인한다.

분산환경인 경우 맵리듀스는 각 데이터노드에서 맵리듀스 작업이 실행되기 때문에 각 노드마다 파이썬 인터프리터와 필요한 라이브러리가 위치해야 한다.

 

 

-pipemapred.waitoutputthreads(): subprocess failed with code 1

 

이 에러는 여러 가지의 원인이 있다.

첫 번째는 매퍼와 리듀서가 동시에 실행되어서 발생하는 에러이다. 만약 자신이 코딩할 때 동시에 실행되도 상관없이 코딩했으면 에러가 안나겠지만 나는 매퍼의 완전한 결과가 리듀서로 전달되어 처리되도록 코딩해서 에러가 발생했다.

 

이런 하나의 명령이 끝나고 다음 명령으로 넘어가는 방식을 '명령어 파이프라인'이라고 한다. 

하둡 스트리밍에서 명령어 파이프라인을 적용하려면 스트리밍 명령어어서 아래와 같이 적어줘야 한다.

-mapper 'python3 BA_Mapper.py'
-reducer 'python3 BA_Reducer.py'


아래와 같이 적으면 안된다.
-mapper BA_Mapper.py
-reducer BA_Reducer.py

 

매퍼와 리듀서를 작은따옴표나 쌍따옴표로 묶어주고 앞에 자신의 파이썬 인터프리터 버전을 적어주면된다.

나는 파이썬3.6버전이어서 python3을 적어주었다.

 

 

 

두 번째는 파이썬 스크립트 코드 자체에 문제로 발생하는 것이다.

 

말 그대로 코딩을 잘못했을 때 발생한다.

 

보통 패키지 임포트 문제일 것으로 예상된다. 나도 그랬으니...

패키지 문제 외에도 매퍼의 출력값이 이상하면 리듀서로 넘어가지 않고

반복문이 이상할 경우 매퍼의 출력값이 나오지 않는다.

 

또한 리듀서에서도 매퍼의 결과를 정확히 전달받아서 리듀서 코드를 실행하는지 확인해야한다.

 

이를 확인하기 위해서 매퍼와 리듀서 각각 코드별 단위테스트를 진행해보자.

 

테스트 데이터를 준비하고 매퍼는 정상적인 매퍼, 리듀서는 단순히 매퍼의 결과를 출력하는 리듀서로 실행해본다.

혹은 테스트용 매퍼와 정상적인 리듀서

 

아래처럼 단순히 전달받는 값을 출력을 해본다.

for i in sys.stdin:
    print( i )

 

 

패키지 문제는 아래에서 자세히 설명할 예정.

 

 

암튼 위와 같은 에러와 씨름하느라 거의 이틀을 날렸다...

 

 

 

 

 

2. 파이썬을 이용한 하둡 스트리밍 사용법

 

아래와 같은 순서대로 진행하면 정상적으로 실행될 것이다.

 

나의 하둡 환경

오라클 버추얼박스 5.2.2버전에 CentOS 7 리눅스 가상서버 4대(1대: master, 3대: slaves)

Python3.6 인터프리터

 

 

1. 각 서버별 똑같은 위치에 똑같은 버전의 파이썬 인터프리터 설치

나의 경우 /usr/bin/python3.6 에 인터프리터가 위치한다.

 

아래처럼 다른 서버에서도 인터프리터가 실행되는지 확인한다.

서버1 > /usr/bin/python3.6
서버2 > /usr/bin/python3.6
서버3 > /usr/bin/python3.6
서버4 > /usr/bin/python3.6

 

 

 

2. 파이썬 스크립트 맨 위에 인터프리터 위치와 인코딩타입 작성

#!/usr/bin/python3.6
# -*-coding:utf-8 -*

~파이썬 코드~

 

 

3. 패키지 import 시키기 (가장 중요!!)

파이썬 스크립트에 바로 import 패키지명 쓰면 불러와지지 않는다.

이럴 때는 사용할 패키지가 어디있는지 확인하고 이를 명시해줘야한다.

 

나의 경우 파이썬3.6 패키지들이 

/home/hadoop01/.local/lib/python3.6/site-packages

여기에 위치해 있다. 

 

따라서 파이썬 스크립트에 아래와 같이 작성한다.

#!/usr/bin/python3.6
# -*-coding:utf-8 -*

import sys  #시스템 패키지
sys.path.append( '/home/hadoop01/.local/lib/python3.6/site-packages')

import 패키지명1
import 패키지명2
import 패키지명3

 

꼭 임포트할 패키지가 해당 위치에 존재해야하고 다른 곳에 있을 경우 sys.path.append()를 더 해주면 된다.

이거 때문에 몇 시간 헤맸다 ㅠㅠㅠ

 

 

 

4. 파이썬 스크립트 권한 수정하기

chmod -777 ~/mapper.py
chmod -777 ~/reducer.py

해당 파이썬 스크립트 언어를 실행하려면 실행권한을 설정해줘야 한다.

 

 

5. 로컬에서 각 파이썬 스크립트 테스트하기

./mapper.py

./reducer.py

매퍼와 리듀서를 각각 실행하고 테스트 데이터를 입력해본다.

에러가 없으면 리눅스 명령어를 이용해서 맵리듀스를 수동으로 실행해본다.

cat ./test.txt | ./mapper.py | sort | ./reducer.py

원하는 결과가 나오면 성공!

 

 

6. hdfs에 권한 확인

하둡 스트리밍 명령어 실행할 때 output 디렉터리를 만드는데 이때 hdfs에 권한이 없어서 만들지 못할 경우

에러가 발생한다. 보통 하둡 설치할 때 supergroup으로 되어있을 것이다.

 

만약 output디렉터리 만들지 못한다는 에러가 나오면 권한문제를 의심해보자.

 

hdfs권한 설정은 구글링하면 많이 나온다.

 

 

7. input 데이터 hdfs에 업로드

나의 경우 hdfs의 /user/hadoop01/input 디렉터리에 test.txt란 input데이터를 업로드 시킨다.

각자 hdfs 디렉토리에 input데이터 업로드

hdfs dfs -put /home/hadoop01/test.txt /user/hadoop01/input/

 

 

8. 하둡 스트리밍 실행하기

하둡 스트리밍 명령어 예시는 아래와 같다.

hadoop jar 하둡스트리밍.jar파일위치 \
-mapper 매퍼명 \
-file 매퍼위치 \
-reducer 리듀서명 \
-file 리듀서위치 \
-input 입력데이터HDFS위치 \
-output 출력데이터저장될HDFS위치 \

 

나의 경우는 아래와 같다. 이때 맨 처음에  hdfs dfs -rm 명령어로 출력디렉토리가 이미 있을 경우 삭제시킨다.

그리고 맨 마지막에 hdfs전체 디렉토리를 777로 권한을 변경했다. 이 두 줄은 빼도 된다.

hdfs dfs -rm -r /user/hadoop01/test | \
hadoop jar /home/hadoop01/hadoop/share/hadoop/tools/lib/hadoop-streaming-3.3.0.jar \
-mapper 'python3 BA_Mapper.py' \
-file /home/hadoop01/BA_Mapper.py \
-reducer 'python3 BA_Reducer.py' \
-file /home/hadoop01/BA_Reducer.py \
-input /user/hadoop01/input/test.txt \
-output test |\
hdfs dfs chmod -R 777

 

이러면 결과 성공!!

 

모두 저처럼 이틀 동안 삽질하지않기를 바라면서 ㅎ

 

 

 

 

728x90
반응형
LIST
Comments