data engineering

python hive 관련 삽질

qkqhxla1 2018. 5. 11. 07:33

hive에 관한 지식이 거의 없어서 막상 찾고보니 엄청나게 쉬운데 이거 찾느라 몇일간 헤맸다. 

매번 하이브에 관한 작업을 할때 oozie workflow에 sql파일을 삽입하고 그걸 워크플로우에 넣고 실행시키는 방법으로 해왔는데, 이번에 oozie환경을 벗어나게 된다. 현재 돌아가는 oozie job들을 전부 옮겨가는 서비스의 job들로 바꿔야하는데 사실 너무 귀찮았다. big data에 관련된 팀이 저 서비스를 관리하는데 관리 향상성 등을 위해서 옮겨간다고 하면 유저인 우리로서는 당연히 바꿔야 한다. 


서비스를 하나하나 옮기는 고민을 하면서, 애초에 우지 워크플로우에 등록하는것보다 파이썬 등으로 하이브에 접속해서 특정 하이브 쿼리를 실행시키는 스크립트를 만들고, 크론탭 등으로 자동화를 해놓았으면 굳이 우지의 잡들을 옮겨가는 서비스로 바꾸지 않아도 되었겠다라는 생각을 하게 되었다. 어차피 우지는 자동화 스케쥴러? 그런거니깐.


그리고 요즘 시간도 좀 남아서 삽질을 하기 시작했다. 하이브 관련 지식이 하나도 없어서 이 카테고리 전 글에서 언급한 하이브 튜토리얼도 다 읽어보고 했는데 하이브에 어떻게 접속해야할지는 감이 잘 안잡혔었다. db서버가 리모트에 있을 경우 하이브서버가 대충 하이브 메타스토어를 통해서 db로 접속하는구나... 정도? 그러고 하이브 서버에서 conf파일들을 찾아서 내부를 열어보다가 hive-site.xml파일안에 hive.metastore.uris, javax.jdo.option.ConnectionURL, javax.jdo.option.ConnectionDriverName, javax.jdo.option.ConnectionUserName등의 프로퍼티가 setting되어있는걸 발견했다.

구글에 찾아보면 알겠지만 하이브의 메타스토어에 관련된 정보이다. 왠지 username과 password가 있으니 이 정보로 뭔가 접속을 할수있을것같다! 하고 하루종일 삽질했는데 안되었다. jdbc정보였으나 하이브에서 db로 접속할때 사용하는 정보라고 한다.(사실 아직도 이게 원래는 되는건데 로컬에서는 안되게 막아놓은건지 아니면 원래 안되는건지는 잘 모르겠다.)
블로그는 http://bongury.tistory.com/89 를 참조했었다.

다시보니 위 블로그는 하이브가 중간에 껴있는게 아닌 단순 오라클을 jdbc로 접근하는 예제였다..


https://analyticsanvil.wordpress.com/2016/06/08/python-jdbc-dyanmic-hive-scripting/ 에서도 뭔가 될것처럼 적어놔서 될줄 알았는데 안되었다.


그리고 이틀을 삽질한후 안된다고 확정짓고 다른 방법을 찾으니 바로 나왔다.
http://euriion.com/?p=411856 (설명 잘되어있다.)

ip주소는 Hiveserver2가 설치된 ip주소를 찾았고, 그 대상으로 코드를 돌렸더니 성공하였다!!.

혹시 모르니 코드는 아래에 남겨둠.

sudo pip install impyla후 impala를 임포트한다.

from impala.dbapi import connect

conn = connect(host='hiveserver2 IP address',
               port=10000,
               user='qkqhxla1',
               password='1234',
               auth_mechanism='PLAIN')

cursor = conn.cursor()
cursor.get_databases()

cursor.execute("select * from db.collection limit 10")
results = cursor.fetchall()
for row in results:
    print row