2017년 2월 10일 금요일

Linux on POWER(ppc64le) 서버에 Spark 및 SparkR 설치하기

앞선 포스팅과 마찬가지로, Spark를 Ubuntu 16.04 LTS ppc64le 환경에서 build한 뒤, 동일한 OS의 다른 POWER 서버로 그 binary들을 가져가서 제대로 구동되는지 보겠습니다.

다음과 같이 필요한 기본 OS fileset을 설치합니다. 

u0017496@sys-85548:~/spark$ sudo apt install openjdk-8-jdk cmake automake autoconf texlive-latex-base maven

그리고, 먼저 R을 설치해야 합니다.  그에 대해서는 앞의 포스팅을 참조하십시요.  R 설치가 끝나면, 다음과 같이 SparkR build를 위한 R package들을 download 받습니다.  (앞선 포스팅에 올려진 R.tgz 속에는 이 R package들이 이미 포함되어 있으니, 그냥 그걸 쓰셔도 됩니다.)

u0017496@sys-85548:/usr/local/lib/R$ sudo R

> install.packages("knitr")
Installing package into '/usr/local/lib/R/site-library'

> install.packages("e1071")
Installing package into '/usr/local/lib/R/site-library'

> install.packages('survival')
Installing package into '/usr/local/lib/R/site-library'

> install.packages('rmarkdown')
Installing package into '/usr/local/lib/R/site-library'

> install.packages('testthat')
Installing package into '/usr/local/lib/R/site-library'

> install.packages("rJava")
Installing package into '/usr/local/lib/R/site-library'


u0017496@sys-85548:/usr/local/lib/R$ ls -l site-library/
total 120
drwxrwxr-x  7 root staff 4096 Feb  6 23:54 mime
drwxrwxr-x  8 root staff 4096 Feb  6 23:56 stringi
drwxrwxr-x  7 root staff 4096 Feb  6 23:56 magrittr
drwxrwxr-x  9 root staff 4096 Feb  6 23:56 digest
drwxrwxr-x  7 root staff 4096 Feb  6 23:56 highr
drwxrwxr-x  8 root staff 4096 Feb  6 23:56 yaml
drwxrwxr-x 11 root staff 4096 Feb  6 23:56 markdown
drwxrwxr-x  9 root staff 4096 Feb  6 23:56 stringr
drwxrwxr-x  6 root staff 4096 Feb  6 23:56 evaluate
drwxrwxr-x 14 root staff 4096 Feb  6 23:57 knitr
drwxrwxr-x 10 root staff 4096 Feb  7 02:12 MASS
drwxrwxr-x  8 root staff 4096 Feb  7 02:12 class
drwxrwxr-x  8 root staff 4096 Feb  7 02:12 e1071
drwxrwxr-x 10 root staff 4096 Feb  7 04:33 lattice
drwxrwxr-x 12 root staff 4096 Feb  7 04:34 Matrix
drwxrwxr-x  9 root staff 4096 Feb  7 04:35 survival
drwxrwxr-x 16 root staff 4096 Feb  7 04:37 Rcpp
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 bitops
drwxrwxr-x  6 root staff 4096 Feb  7 04:37 backports
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 base64enc
drwxrwxr-x  8 root staff 4096 Feb  7 04:37 jsonlite
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 htmltools
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 caTools
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 rprojroot
drwxrwxr-x  8 root staff 4096 Feb  7 04:37 rmarkdown
drwxrwxr-x  6 root staff 4096 Feb  7 07:03 crayon
drwxrwxr-x  6 root staff 4096 Feb  7 07:03 praise
drwxrwxr-x  7 root staff 4096 Feb  7 07:03 R6
drwxrwxr-x  9 root staff 4096 Feb  7 07:04 testthat
drwxrwxr-x 10 root staff 4096 Feb  7 21:19 rJava



그 다음에 spark build를 시작합니다.  

u0017496@sys-85548:~$ git clone https://github.com/apache/spark.git

u0017496@sys-85548:~$ cd spark

먼저 다음과 같이 JAVA_HOME을 선언해줍니다.

u0017496@sys-85548:~/spark$ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el


Distribution을 위한 package를 만드려면 dev 밑에 있는 make-distribution.sh을 사용합니다.  먼저, MAKE_R이 default로는 false이므로, Spark에서 R과 함께 사용하려고 한다면 --r option을 쓰셔야 합니다.  그리고 미리 다음과 같이 tar directory 이름을 간단한 것으로 바꿔 둡니다.  


u0017496@sys-85548:~/spark$ vi dev/make-distribution.sh
...
  TARDIR_NAME=spark-bin
#  TARDIR_NAME=spark-$VERSION-bin-$NAME
...
  tar czf "spark-$VERSION-bin.tgz" -C "$SPARK_HOME" "$TARDIR_NAME"
#  tar czf "spark-$VERSION-bin-$NAME.tgz" -C "$SPARK_HOME" "$TARDIR_NAME"

...

그리고, hive와의 연동에 사용되는 zinc 서버의 실행 파일인 ng가 다음과 같이 x86용 binary로 들어있기 때문에 이대로 수행하면 error가 발생합니다.

root@sys-85548:/home/u0017496/spark# file ./build/zinc-0.3.11/bin/ng/linux32/ng
./build/zinc-0.3.11/bin/ng/linux64/ng: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=8946a7b64cafd2b99faac05b088b8943aa0ec2e6, stripped

이를 ppc64le용으로 새로 build해야 합니다.  그런데 그를 위해서는 또 sbt부터 설치해야 합니다. 이는 다음과 같이 하시면 됩니다.

u0017496@sys-85548:~$ wget https://dl.bintray.com/sbt/native-packages/sbt/0.13.13/sbt-0.13.13.tgz
u0017496@sys-85548:~$ tar -zxvf sbt-0.13.13.tgz
u0017496@sys-85548:~$ export PATH=$PATH:~/sbt-launcher-packaging-0.13.13/bin
u0017496@sys-85548:~$ which sbt
/home/u0017496/sbt-launcher-packaging-0.13.13/bin/sbt

이제 sbt가 사용 준비 되었습니다.  이제 zinc를 설치합니다.

u0017496@sys-85548:~$ git clone https://github.com/typesafehub/zinc.git
u0017496@sys-85548:~$ cd zinc/
u0017496@sys-85548:~/zinc$ sbt universal:packageZipTarball

이렇게 해서 build된 것 중 linux32 directory에 생성된 ng를 spark build directory의 ng에 overwrite합니다.

u0017496@sys-85548:~/zinc$ cp ./src/universal/bin/ng/linux32/ng ~/spark/build/zinc-0.3.11/bin/ng/linux32/ng

u0017496@sys-85548:~$ file ./spark/build/zinc-0.3.11/bin/ng/linux32/ng
/home/u0017496/spark/build/zinc-0.3.11/bin/ng/linux32/ng: ELF 64-bit LSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=142230d9ad8099f606dcf8144b308bc938915812, stripped

유의)  이대로 build를 수행하면 도중에 다음의 'Required file not found: scala-compiler-2.11.8.jar'라는 error가 날 수 있습니다.  실제로는 file이 있는데도요.  이는 다음과 같이 zinc 서버를 shutdown 하시면 해결됩니다.

u0017496@sys-85548:/home/u0017496/zinc# ./src/universal/bin/zinc -shutdown

이제 준비가 끝났습니다.  다음과 같이 dev/make-distribution.sh script를 수행하면 됩니다.  이 build 과정은 시간이 매우 오래 걸리는데, virtual CPU 2개짜리인 IBM Power Cloud에서는 무려 140분 정도 걸립니다.

u0017496@sys-85548:~/spark$ ./dev/make-distribution.sh --name spark-ppc64le --tgz -Psparkr  -Phive -Phive-thriftserver

build가 끝나면 다음과 같은 tgz file이 생깁니다.

u0017496@sys-85548:~/spark$ ls -l *.tgz
-rw-r--r--  1 root     root     177688849 Feb  9 10:12 spark-2.2.0-SNAPSHOT-bin.tgz

이를 먼저 /usr/local directory에 풀어준 뒤, 그 결과 생긴 spark-bin directory를 SPARK_HOME으로 export 하십시요.

u0017496@sys-85548:/usr/local$ sudo tar -zxvf ~/spark/spark-2.2.0-SNAPSHOT-bin.tgz

u0017496@sys-85548:/usr/local$ tail ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el
export R_HOME=/usr/local/lib/R
export SPARK_HOME=/usr/local/spark-bin
export PATH=$SPARK_HOME/bin:$R_HOME/bin:$PATH

그리고, 원래의 spark directory 밑의 R directory에는 R을 위한 SparkR package가 다음과 같이 gz file로 생성되어 있습니다.

u0017496@sys-85548:~/spark$ ls R/*.gz
R/SparkR_2.2.0-SNAPSHOT.tar.gz

R에 이 SparkR package를 설치하겠습니다.

u0017496@sys-85548:/usr/local/spark-bin$ sudo R

> pkgPath <- '/home/u0017496/spark/R/SparkR_2.2.0-SNAPSHOT.tar.gz'
> install.packages(pkgPath)
Installing package into '/usr/local/lib/R/site-library'
..

그 결과는 /usr/local/lib/R/site-library에서 보실 수 있습니다.  아래 보이는 SparkR 패키지가 설치된 R.tgz가 앞선 포스팅에 올려져 있으니, 이 과정을 굳이 거치실 필요없이 그걸 그대로 쓰셔도 됩니다.

u0017496@sys-85548:/usr/local/spark-bin$ ls -ltr /usr/local/lib/R/site-library
total 124
drwxrwxr-x  7 root staff 4096 Feb  6 23:54 mime
drwxrwxr-x  8 root staff 4096 Feb  6 23:56 stringi
drwxrwxr-x  7 root staff 4096 Feb  6 23:56 magrittr
drwxrwxr-x  9 root staff 4096 Feb  6 23:56 digest
drwxrwxr-x  7 root staff 4096 Feb  6 23:56 highr
drwxrwxr-x  8 root staff 4096 Feb  6 23:56 yaml
drwxrwxr-x 11 root staff 4096 Feb  6 23:56 markdown
drwxrwxr-x  9 root staff 4096 Feb  6 23:56 stringr
drwxrwxr-x  6 root staff 4096 Feb  6 23:56 evaluate
drwxrwxr-x 14 root staff 4096 Feb  6 23:57 knitr
drwxrwxr-x 10 root staff 4096 Feb  7 02:12 MASS
drwxrwxr-x  8 root staff 4096 Feb  7 02:12 class
drwxrwxr-x  8 root staff 4096 Feb  7 02:12 e1071
drwxrwxr-x 10 root staff 4096 Feb  7 04:33 lattice
drwxrwxr-x 12 root staff 4096 Feb  7 04:34 Matrix
drwxrwxr-x  9 root staff 4096 Feb  7 04:35 survival
drwxrwxr-x 16 root staff 4096 Feb  7 04:37 Rcpp
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 bitops
drwxrwxr-x  6 root staff 4096 Feb  7 04:37 backports
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 base64enc
drwxrwxr-x  8 root staff 4096 Feb  7 04:37 jsonlite
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 htmltools
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 caTools
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 rprojroot
drwxrwxr-x  8 root staff 4096 Feb  7 04:37 rmarkdown
drwxrwxr-x  6 root staff 4096 Feb  7 07:03 crayon
drwxrwxr-x  6 root staff 4096 Feb  7 07:03 praise
drwxrwxr-x  7 root staff 4096 Feb  7 07:03 R6
drwxrwxr-x  9 root staff 4096 Feb  8 02:56 testthat
drwxrwxr-x 10 root staff 4096 Feb  8 02:57 rJava
drwxrwxr-x 10 root staff 4096 Feb  9 19:39 SparkR



이제 이 binary들을 별도의 서버에 옮겨서 설치하겠습니다.

먼저, 저 SparkR package가 설치된 /usr/local/lib/R directory 전체를 tar로 말아서 설치하려는 서버로 옮기시고, 같은 /usr/local/lib/ 밑에 풀어 놓습니다.

u0017496@sys-85549:/usr/local/lib$ tar -zxvf R.tgz R

이어서, 위에서 만들어진 spark-2.2.0-SNAPSHOT-bin.tgz를 설치하려는 서버로 옮기시고, /usr/local directory에 풀어 넣으시면 됩니다.  그러면 다음과 같이 spark-bin directory가 생깁니다.  이를 SPARK_HOME으로 export 하십시요.

u0017496@sys-85549:/usr/local$ sudo tar -zxvf /tmp/spark-2.2.0-SNAPSHOT-bin.tgz

u0017496@sys-85549:/usr/local$ tail ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el
export R_HOME=/usr/local/lib/R
export SPARK_HOME=/usr/local/spark-bin
export PATH=$SPARK_HOME/bin:$R_HOME/bin:$PATH

u0017496@sys-85549:/usr/local$ cd spark-bin

Spark 구동을 위해서는 local 서버 자체에서도 passwd 없이 ssh가 가능해야 합니다.  이를 위한 준비를 합니다.

u0017496@sys-85549:/usr/local/spark-bin/sbin$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/u0017496/.ssh/id_rsa):
Created directory '/home/u0017496/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

u0017496@sys-85549:/usr/local/spark-bin/sbin$ ssh-copy-id localhost

이제 spark master를 구동합니다.

u0017496@sys-85549:/usr/local/spark-bin/sbin$ sudo mkdir /usr/local/spark-bin/logs
u0017496@sys-85549:/usr/local/spark-bin/sbin$ sudo chown -R u0017496:u0017496 /usr/local/spark-bin/logs
u0017496@sys-85549:/usr/local/spark-bin/sbin$ ./start-all.sh

sparkR을 구동해서 이 spark master에 연결되는지 확인합니다.

u0017496@sys-85549:/usr/local/spark-bin/bin$ sparkR
 Welcome to
    ____              __
   / __/__  ___ _____/ /__
  _\ \/ _ \/ _ `/ __/  '_/
 /___/ .__/\_,_/_/ /_/\_\   version  2.2.0-SNAPSHOT
    /_/


 SparkSession available as 'spark'.
>

성공했습니다.

이제 sparkR에서 그래프를 그려봅니다.  그를 위해서 먼저 DISPLAY를 Xmanager를 띄워놓은 PC client로 세팅합니다.

u0017496@sys-85549:/usr/local/spark-bin/bin$ who
u0017496 pts/0        2017-02-09 19:21 (172.29.97.138)

u0017496@sys-85549:/usr/local/spark-bin/bin$ export DISPLAY=172.29.97.138:0

u0017496@sys-85549:/usr/local/spark-bin/bin$ sparkR

> plot(BOD, type = 'l')

다음과 같이 PC client에 Xmanager를 통해서 그래프가 그려지는 것을 보실 수 있습니다.




여기서 build된 tgz 파일들은 아래 URL에 올려 놓았으니 그대로 쓰셔도 됩니다.  역시 제가 법적, 기술적 책임은 못 진다는 것은 유의하시기 바랍니다.

https://drive.google.com/drive/folders/0B-F0jEb44gqUN3cxaGVDdklwdWc?usp=sharing 

댓글 없음:

댓글 쓰기