Hive server 2에 python impyla 패키지로 접속하기

ipyhton 또는 그냥 python script로 Hive에 접속해서 SQL을 실행하고 결과 데이터를 가져오게 하려면 굉장히 고통스럽습니다.

Python에서 사용할 수 있는 Hive 접속관련 패키지들이 상당히 불안하고 버그가 많습니다. 다 해결해주는 깔끔한 끝판왕이 하나 나와줬으면 싶은데 Hive가 일반 RDBMS 처럼 쓰는 것은 아니어서 그런지 아직까지 깔끔하게 해결해 주는 패키지가 없습니다.

Hive 자체에서 제공하는 python client라는 것이 있긴한데 이걸 쓰려고하면 설정을 위해서 상당히 귀찮은 작업들을 해야 합니다.  예전에 했을 때는 되긴했었습니다만 다시하고 싶지 않습니다.

배보다 배꼽이커요.

그런데
Cloudera에서 impala용 client를 만들어서 제공하는데 이 패키지가 impala 뿐만 아니라 HiveServer2에 접속하는 기능도 제공합니다.
이것 말고도 HiveServer2에 접속할 수 있게 해주는 Python 패키지중에 pyhs2라는 것이 있는데 이 패키지도 동일한 기능을 제공하지만 더 이상 업데이트 하지 않고 impyla를 사용하라고 github에 pyhs2 제작자가 적어놨더군요.  그 외에도 몇개의 패키지가 있습니다만 모두 불편했습니다.

그래서 현재까지 가장 쉽게 Python에서 Hive에 연결해서 쿼리를 실행하거나 작은 실행 결과를 바로 가져오는 방법은 Python에서 HiveServer2에 접속하게 하고  HiveServer2에 접속하기 위해서  impyla 패키지를 쓰는 것입니다. (다른 더 쉬운 방법이 있으면 알려주세요)

impyla 패키지를 사용하려면 당연히 Hive server 2가 어딘가 네트워크로 접속할 수 있는 서버에서 작동하고 있어야 합니다. 이 패키지는 Hive server 2에 접속하는 것이니까요.

그냥 Hive하고 Hive server 2가 다른 것이라는 것은 아시지요? Hive server 2는 Hive를 별도로 Daemon으로 띄워서 사용하게 해주는 일종의 add-on 입니다. Hive에 같이 포함되어 있으니 설정을 잡아주고 구동만 시키면 됩니다.

그런데 이 impyla 패키지도 의존성으로 가진 Thrift 관련된 패키지가 여러단계로 조금씩 의존성이 꼬여 있어서 설치할 때 조금 귀찮게 합니다. 그래서 impyla 패키지를 설치할 때 조금 고생하게 되는데 그때 필요한 것들을 정리도 할겸 포스트로 올립니다.

CentOS Linux에서는 다음과 같은 문제를 고려해서 설치하면 현재는 작동이 됩니다.  각 환경마다 사정이 다르기 때문에 모두 동일하게 해결된다는 보장은 없습니다. Ubuntu에서는 안해봤습니다.

Ubuntu에서도 잘 될 것이라고 생각합니다.

impyla 관련 패키지 설치하기

우선 python package이름이 impala가 아니고 impyla 인것에 주의하시구요. 패키지 이름이 “임팔라”가 아니고 “임파일라”입니다. 무척 헷갈립니다. 게다가 python 코드 내에서 import 할때는 impala를 호출해야 합니다. (왜 그랬는지…)

설치할 때 주의해야 할 중요한  내용입니다.

  • Thrift에 접속할 때 인증을 위해서 sasl 관련 library가 필요합니다.  CentOS에서는 yum으로 검색해서 cyrus로 시작하는 sasl 패키지들을 설치해 주어야 합니다. 특히 cyrus-sasl-plain을 설치해야 Hive Server 2에 plain 방식으로  id/password를 입력하고 접속할 수 있습니다. 현재는 Hive Server 2 plain 방식이 아니면 접속할 수 없었습니다. cyrus sasl의 기본 설치에서 제외되므로  빼먹지 말고 찾아서 설치해야 합니다.
  • impyla 패키지가 thrift 패키지에 의존성을 가지는데 현재 0.9.3 이하가 아니면 작동하지 않도록 되어 있습니다. 나중에는 고쳐질 수 있겠습니다만 지금은 아닙니다.  thrift의 현재 시점에서의 최신 버전은 0.10.0 입니다. 그래서 이미 0.10.0 버전으로 설치되어 있으면 0.9.3 이하로 downgrade해야합니다.
  • 기타 thrift 패키지 설치에 필요한 의존성 패키지가 있습니다만 환경에 따라 이미 설치가 되어 있을 수도 있습니다. 의존성 오류가 발생하면 그 패키지를 설치하면 됩니다. 이 것들은 대충 막 설치해도 큰 충돌은 없는 것들입니다.
  • impyla 패키지가 pypi에 등록된 것은 위와 같이 해도 trans관련 오류를 내면서 제대로 접속하지 못합니다. 즉 pip 같은 것으로 빌드된 것을 설치하면 안될 수 있습니다. 그래서 impyla를 설치할 때는 소스를 clone받아서 빌드하고 설치해야 합니다.
  • 이때 thrift_sasl 패키지도 설치해 주어야 thrift를 통한 인증과 암호화 문제를 해결할 수 있습니다.

제가 작업하는 환경에서 작업한 shell command를 정리한 것입니다. python 2.7 버전 기준입니다. 3.x 도 되었던 것 같습니다만 기억이 가물가물하네요.

# install sasl releative packages and thrift
sudo yum install cyrus-sasl.x86_64 cyrus-sasl-devel.x86_64 cyrus-sasl-gssapi.x86_64 cyrus-sasl-md5.x86_64 cyrus-sasl-plain.x86_64 cyrus-sasl-ntlm.x86_64 cyrus-sasl-sql.x86_64 python-saslwrapper.x86_64 libgsasl-devel.x86_64 -y
sudo pip2.7 install thrift_sasl
sudo pip2.7 uninstall thrift  # 0.9.3 version is necessary. so 0.10.0 should be uninstalled
sudo pip2.7 install 'bitarray'
sudo pip2.7 install 'thrift<=0.9.3'

# sudo pip2.7 install pyhs2  # deprecated
# pip install git+https://github.com/cloudera/impyla.git

# install impyla. pypi impyla has a bug. so install from source
mkdir ~/__setup
cd ~/__setup
git clone https://github.com/cloudera/impyla.git
cd impyla
sudo python2.7 setup.py install
cd -
# sudo rm -Rf ~/__setup

이렇게 설치하고 나서 간단하게 작동하는지 다음과 같이 테스트해 보면됩니다. 서버주소와 ID, password, query는 환경에 맞게 수정하셔야 합니다. 당연한 것이지만 아래의 코드는 그대로 실행하면 접속을 못해서 에러입니다.

from impala.dbapi import connect

conn = connect(host='hive-server-2.aidenhong.com',
               port=10000,
               user='hiveuser',
               password='hivepassword',
               auth_mechanism='PLAIN')

cursor = conn.cursor()
cursor.get_databases()  # database 목록 가져오기

cursor.execute("select * from aiden.iris limit 10")  #  query 실행하기 예제
results = cursor.fetchall()
for row in results:
    print row

impyla 패키지의 github 레파지토리는 다음과 같습니다.

https://github.com/cloudera/impyla

향 후 패키지가 업데이트 되고 더 안정화되면 위의 자질구레한 문제들이 자동으로 해결될 수도 있을지도 모릅니다. 그런데 Cloudera 사람들이 저 패키지에 신경을 별로 안쓰는 것 같아서 조금 걱정은 됩니다.

Author: 떰학

답글 남기기