본문 바로가기
Data Science/Python

Hive + Python + VirtualEnv

by En.Lee 2014. 9. 10.

Hive + Python + VirtualEnv

Hive 쿼리에서 TRANSFORM, MAP/REDUCE 명령어를 사용하면 표준 입/출력을 통해 데이터를 처리할 수 있다.

이걸 이용해 Python 스크립트로 데이터 처리를 해왔었는데 몇가지 귀찮은점이 있었다.

  1. 모든 노드에 같은 버전의 파이썬을 설치해줘야 한다.
  2. 모든 노드에 같은 파이썬 의존성 패키지를 설치해줘야 한다.
  3. 모든 노드에 내가 작성한 파이썬 패키지를 배포해놓아야 한다.

Hive의 ADD FILE 명령어와 VirtualEnv를 사용하면 이런 작업을 좀 더 간단하게 할 수 있다.

image

위 스크립트는 url.txt에서 주소 하나를 가져와 requests 라이브러리를 사용해 데이터를 긁어와 반환하는 스크립트이다.

특별한 의미는 없고 1. 스크립트가 사용하는 데이터 파일이 있을때 어떻게 해야 하는가 2. 외부 패키지가 잘 작동하는가를 보기 위해 만든 스크립트이다.

# my_main_script.py
import sys
import requests

url = open("url.txt", 'r').read().strip()

data = requests.get(url).text

for line in sys.stdin:
    print(data)

먼저 virtualenv를 생성해보자.

virtualenv에 대해 간단하게 설명하자면 Python 실행환경(실행파일 및 라이브러리)를 별도 공간에 구축하여 쓸 수 있는 툴이다. pip install virtualenv 명령어로 설치할 수 있다.

hadoop@namenode:~/my_python_package$ virtualenv my_python_package_virtualenv
Using base prefix '/home/hadoop/.pyenv/versions/3.4.1'
New python executable in my_python_package_virtualenv/bin/python3.4
Also creating executable in my_python_package_virtualenv/bin/python
Installing setuptools, pip...done.

새로 만든 virtualenv를 활성화하고 필요한 라이브러리도 설치해보자.

hadoop@namenode:~/my_python_package$ source my_python_package_virtualenv/bin/activate
(my_python_package_virtualenv)hadoop@namenode:~/my_python_package$ pip install requests
Downloading/unpacking requests
  Downloading requests-2.3.0-py2.py3-none-any.whl (452kB): 452kB downloaded
Installing collected packages: requests
Successfully installed requests
Cleaning up...
(my_python_package_virtualenv)hadoop@namenode:~/my_python_package$ deactivate

환경 구축이 끝났다면 이 virtualenv를 이동이 가능하게 바꿔줘야 한다.

원래는 환경변수들이 절대경로로 고정되어 있는데 이 과정을 거치면 상대경로로 바뀌어 경로가 변해도 잘 작동하게 된다.

다만 이후에 라이브러리를 새로 설치했을때엔 이 과정을 반복해줘야 한다.

hadoop@namenode:~/my_python_package$ virtualenv --relocatable my_python_package_virtualenv
Making script my_python_package_virtualenv/bin/pip relative
Making script my_python_package_virtualenv/bin/easy_install relative
Making script my_python_package_virtualenv/bin/pip3.4 relative
Making script my_python_package_virtualenv/bin/pip3 relative
Making script my_python_package_virtualenv/bin/easy_install-3.4 relative

그리고 이제 이 스크립트 실행을 위한 간단한 쉘 스크립트 하나를 짠다. virtualenv를 활성화 시키고 스크립트를 실행하는 간단한 스크립트이다.

#!/bin/bash
cd "my_python_package"
source my_python_package_virtualenv/bin/activate
python main.py

이 스크립트는 사용할 패키지 디렉토리와 나란히 놓는다. 이런 느낌으로.

image

이제 아래와 같이 Hive 쿼리를 실행하면 끝이다.

ADD FILE my_python_package;
ADD FILE my_transform_script.sh;

SELECT TRANSFORM(*) USING 'my_transform_script.sh' FROM some_table;

ADD FILE 명령어를 사용하면 해당 파일을 Distributed Cache를 사용해 모든 노드에 배포해주는데, 명령어 생긴것과는 다르게 파일이 아닌 디렉토리를 넣어도 잘 작동한다.

위 예제는 모든 노드가 같은 OS 및 하드웨어에 있다고 가정할때 잘 작동하는 예제이다. 만약에 CPU가 다르거나 해서 시스템별로 다른 Python 인터프리터를 써야 할 경우에는activate_this.py를 쓰면 된다.