2019년 1월 9일 수요일

ppc64le Redhat 서버에서 x86 hadoop cluster에 대해 hive로 query 수행하기

POWER9 CPU와 V100 GPU를 장착한 AC922 서버를 deep learning 용도로 사용하는 환경에서, training에 필요한 dataset은 x86 Cloudera hadoop cluster로부터 가져와야 할 필요가 있을 수 있습니다.

그런 경우, 방법은 크게 2가지가 있습니다.  하나는 그냥 hadoop 본연의 기능을 이용하는 것이고, 나머지 하나는 PyHive를 이용하는 것입니다.  이 포스팅에서는 hadoop 본연의 기능을 이용하는 방법을 먼저 다루겠습니다.  Pyhive를 이용하는 방법은 다음 posting에서 정리하겠습니다.

Hadoop 본연의 기능을 이용하려면 (당연히) ppc64le에 hadoop과 hive를 설치해야 합니다.  여기서는 접근해야 하는 x86 hadoop cluster에 Cloudera 5.14가 설치되어 있다고 가정하겠습니다.  CDH 5.14에는 hadoop 2.6.0과 hive 1.10이 들어있습니다.

먼저, ppc64le용 hadoop과 hive를 source로부터 build 합니다.  이 포스팅에 올려놓은 것처럼 source에서 직접 build하셔도 되고, 제가 미리 build해놓은 것을 download 받아 적절한 directory에 풀어놓기만 해도 됩니다.  제가 build 해놓은 것은 아래 ink의 Google drive에 올려놓았습니다.

hadoop-2.6.5.tar.gz : https://drive.google.com/open?id=12B1e6mBLBOOUW6oajwDMYTUap6iUIHEG

apache-hive-1.1.1-bin.tar.gz : https://drive.google.com/open?id=1Qg-fxWXFoqzwcXEjvXpL2sb9Tk9lssg-

위에서 내려받은 tar.gz을 아래와 같이 적절한 directory에 풀어주면 설치는 끝납니다.

여기서는 /home/hadoop-2.6.5 가 HADOOP_HOME이, 그리고 /home/apache-hive-1.1.1-bin 이 HIVE_HOME 이 됩니다.

[redhat74] root:/root> sudo tar -zxf /home/bsyu/files/hadoop-2.6.5-src/hadoop-dist/target/hadoop-2.6.5.tar.gz -C /home

[redhat74] root:/root> sudo tar -zxf /home/bsyu/files/hive-release-1.1.1/packaging/target/apache-hive-1.1.1-bin.tar.gz -C /home

그리고 다음과 같이 JAVA_HOME과 PATH를 환경에 맞게 설정해줘야 합니다.

[redhat74] root:/root> export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.ppc64le

[redhat74] root:/root> export PATH=/home/apache-hive-1.1.1-bin/bin:/home/hadoop-2.6.5/bin:$PATH

그 다음으로 할 일은 접근해야 하는 x86 Cloudera cluster의 namenode로부터 주요 xml 구성 파일들을 그대로 copy해오는 것입니다.  특히 아래 2개를 해오셔야 합니다.  그 내용은 전혀 바꾸지 않아도 됩니다.  이러면 이 ppc64le 서버는 x86 Cloudera cluster의 slave도 아니면서 그 HDFS 및 Hive에 접근할 수 있는 것입니다.   물론 이 서버들 간에는 해당 user가 password를 답하지 않고서도 ssh를 할 수 있도록 ~/.ssh/authorized_keys 등을 미리 구성해놓아야 합니다.

(아래에서 10.10.14.71이 x86 Cloudera cluster의 namenode이자 hive 서버입니다.) 

[redhat74] root:/root> scp 10.10.14.71:/etc/hadoop/conf.cloudera.yarn/*.xml   /home/hadoop-2.6.5/etc/hadoop

[redhat74] root:/root> scp 10.10.14.71:/etc/hive/conf/*.xml   /home/apache-hive-1.1.1-bin/conf

이제 ppc64le 서버에서 hadoop 명령을 내려보면 x86 Cloudera cluster의 HDFS의 file에 접근이 가능합니다.

[redhat74] root:/root> hadoop fs -df
Filesystem                      Size       Used     Available  Use%
hdfs://powervc131:8020  871687405568  620453786  778279674022    0%

[redhat74] root:/root> hadoop fs -ls /user/hive/warehouse
Found 1 items
drwxrwxrwt   - anonymous hive          0 2019-01-09 14:48 /user/hive/warehouse/pokes

이제 hive로 x86 Cloudera cluster를 향해 query를 날려보겠습니다.  먼저 다음과 같이 환경변수를 설정합니다.  이걸 해주지 않으면 이 stackoverflow에서 언급된 "Found class jline.Terminal, but interface was expected" error를 만나게 됩니다.  ( https://stackoverflow.com/questions/28997441/hive-startup-error-terminal-initialization-failed-falling-back-to-unsupporte )

[redhat74] root:/root> export HADOOP_USER_CLASSPATH_FIRST=true

그 다음에 hive를 구동하여, 마치 AC922 서버가 x86 Cloudera cluster의 일원인 것처럼 자연스럽게 원하는 query를 날리시면 됩니다.   아래와 같이, x86 Cloudera 속에 들어있던 pokes라는 table의 data가 그대로 잘 나오는 것을 보실 수 있습니다.

[redhat74] root:/root> hive
...
hive> select * from pokes;
OK
1       "i love donut"
2       you love pretzel
3       "she loves bagel"
1       "i love donut"
2       you love pretzel
3       "she loves bagel"
1       "i love donut"
2       you love pretzel
3       "she loves bagel"
Time taken: 2.19 seconds, Fetched: 9 row(s)


(좋아, 자연스러웠어 !)


다른 방법을 쓸 수도 있습니다.  이는 HiveServer2를 이용하는 방법인데, CDH 5.14에서는 HiveServer2가 default로 구동되니까 x86 Cloudera cluster에서 별도로 구성을 해주실 것은 없을 겁니다.  위에서 설치한 hive에 포함된 beeline을 이용하여 HiveServer2에 접속할 수 있습니다.  다만 이때는 접속하는 서버를 아래와 같이 -u 옵션으로 지정하셔야 합니다.

[redhat74] root:/root> beeline -u jdbc:hive2://10.10.14.71:10000
scan complete in 2ms
...
Beeline version 1.1.1 by Apache Hive

0: jdbc:hive2://10.10.14.71:10000> select * from pokes;
...
INFO  : OK
+------------+--------------------+--+
| pokes.foo  |     pokes.bar      |
+------------+--------------------+--+
| 1          | "i love donut"     |
| 2          | you love pretzel   |
| 3          | "she loves bagel"  |
| 1          | "i love donut"     |
| 2          | you love pretzel   |
| 3          | "she loves bagel"  |
| 1          | "i love donut"     |
| 2          | you love pretzel   |
| 3          | "she loves bagel"  |
+------------+--------------------+--+
9 rows selected (0.565 seconds)

댓글 없음:

댓글 쓰기