Hive + Python + VirtualEnv
Hive 쿼리에서 TRANSFORM, MAP/REDUCE 명령어를 사용하면 표준 입/출력을 통해 데이터를 처리할 수 있다.
이걸 이용해 Python 스크립트로 데이터 처리를 해왔었는데 몇가지 귀찮은점이 있었다.
- 모든 노드에 같은 버전의 파이썬을 설치해줘야 한다.
- 모든 노드에 같은 파이썬 의존성 패키지를 설치해줘야 한다.
- 모든 노드에 내가 작성한 파이썬 패키지를 배포해놓아야 한다.
Hive의 ADD FILE 명령어와 VirtualEnv를 사용하면 이런 작업을 좀 더 간단하게 할 수 있다.
위 스크립트는 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
이 스크립트는 사용할 패키지 디렉토리와 나란히 놓는다. 이런 느낌으로.
이제 아래와 같이 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를 쓰면 된다.