본문 바로가기

Machine Learning

Spark 빌드하기

원문: http://spark.apache.org/docs/latest/

Spark는 pre-build 바이너리를 사용해서도 설치가 가능하나 여기서는 Ubuntu 14.04에서 직접 빌드하는 것을 알아보도록 하겠습니다.

빌드를 위해서는 먼저 Maven 3.3.3 이상 그리고 Java 7 이상이 필요합니다.

Maven이 설치되어 있지 않다면 먼저 아래 방법에 따라 먼저 maven 3를 설치합니다.


우선 maven 3 repository를 등록해야합니다.

  1. sudo -H gedit /etc/apt/sources.list
  2. 아래 라인을 sources.list 파일에 추가합니다.

    deb http://ppa.launchpad.net/natecarlson/maven3/ubuntu precise main

    deb-src http://ppa.launchpad.net/natecarlson/maven3/ubuntu precise main

  3. sudo apt-get update && sudo apt-get install maven3

  4. sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn

Maven으로 빌드하기

Spark는 maven으로 빌드하기 쉽도록 소스를 받으면 build/ 디렉토리에 자체적으로 포함된 maven을 사용해서 빌드가 가능합니다. 이 스크립트를 사용하면 자체적으로 필요한 것들(MavenScala, and Zinc)을 다운로드 받고 설치를 합니다.

build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package

만약 암호화된 파일시스템에 설치하면 “Filename too long” 에러가 나며 실패할 수 있습니다. 이런 경우에는 workaround로 아래 설정을 pom.xml의 scala-maven-plugin 에 설정하고

<arg>-Xmax-classfile-name</arg>
<arg>128</arg>

그리고 project/SparkBuild.scala에 아래와 같이 추가하면됩니다.

scalacOptions in Compile ++= Seq("-Xmax-classfile-name", "128"),


실행 가능한 배포버전 빌드하기:

Spark Downloads 페이지와 같은 배포버전을 빌드하기 위해서는 루트 디렉토리에 있는 make-distribution.sh 파일을 아래와 같이 사용하여 빌드합니다.

./make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pyarn

추가적인 정보를 위해서는 "./make-distribution.sh --help"를 실행하세요.


Maven 메모리 설정하기:

Maven이 더 많은 메모리를 사용하도록 하기 위해서는 아래와 같이 설정하세요.

export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

만약 설정하지 않으면 아래와 같은 에러가 발생할 수 있습니다.

[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.10/classes...
[ERROR] PermGen space -> [Help 1]

[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.10/classes...
[ERROR] Java heap space -> [Help 1]

부연설명:

  • Java 8이상에서는 위 단계가 필요없습니다. 
  • 만약 MAVEN_OPTS를 설정하지 않고 build/mvn 를 사용하면 자동으로 처리됩니다.

Hadoop 버전 지정하기:

HDFS가 모든 버전에서 Protocol이 호환되지 않그 때문에 HDFS에서 자료를 읽기를 원한다면 Spark를 빌드할 때 HDFS 버전을 명시해줘야합니다. hadoop.version property가 바로 그것인데 만약 설정하지 않으면 Hadoop 2.2.0를 기본값으로 빌드됩니다. 아래 Profile 정보를 참고해서 설정해주세요.

Hadoop versionProfile required
1.x to 2.1.xhadoop-1
2.2.xhadoop-2.2
2.3.xhadoop-2.3
2.4.xhadoop-2.4
2.6.x and later 2.xhadoop-2.6

Apache Hadoop versions 1.x 에 Cloudera CDH “mr1” distributions이고 YARN이 없는 Hadoop 버전을 사용한다면 아래와 같이 하세요.

# Apache Hadoop 1.2.1
mvn -Dhadoop.version=1.2.1 -Phadoop-1 -DskipTests clean package

# Cloudera CDH 4.2.0 with MapReduce v1
mvn -Dhadoop.version=2.0.0-mr1-cdh4.2.0 -Phadoop-1 -DskipTests clean package

만약 hadoop 버전과 다르다면 yarn 프로파일을 활성화하고 yarn.version property에 설정할 수 있습니다. Spark는 YARN versions 2.2.0 이상만 지원합니다.

예:

# Apache Hadoop 2.2.X
mvn -Pyarn -Phadoop-2.2 -DskipTests clean package

# Apache Hadoop 2.3.X
mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -DskipTests clean package

# Apache Hadoop 2.4.X or 2.5.X
mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=VERSION -DskipTests clean package

Versions of Hadoop after 2.5.X may or may not work with the -Phadoop-2.4 profile (they were
released after this version of Spark).

# Different versions of HDFS and YARN.
mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -Dyarn.version=2.2.0 -DskipTests clean package

여기서는 hadoop 2.6.0을 사용하므로 아래와 같이 하겠습니다.

mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package


Hive있는 경우:

JDBC서버와 CLI 지원하는 Spark SQL을 위해 Hive를 통합하기 위해서는 -Phive 와 Phive-thriftserver profiles을 빌드 옵션에 추가합니다. 아래는 Hive 13 지원하도록 하는 경우입니다.

# Apache Hadoop 2.4.X with Hive 13 support
mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive -Phive-thriftserver -DskipTests clean package


Scala 2.11인 경우 빌드하기:

Spark가 Scala 2.11 와 빌드되기 위해서는 -Dscala-2.11 property를 사용합니다.

./dev/change-scala-version.sh 2.11
mvn -Pyarn -Phadoop-2.4 -Dscala-2.11 -DskipTests clean package

Spark는 아직 Scala 2.11에서는 JDBC를 지원하지 않습니다.


Maven으로 Spark 테스트하기:

테스트는 기본적으로 ScalaTest Maven plugin 을 사용합니다.

몇가지 테스트는 Spark가 먼저 패키지 되어야함로 항상 mvn package 를 -DskipTests 로 실행하고 테스트하세요. 아래는 올바른 build, test 순서의 예입니다.

mvn -Pyarn -Phadoop-2.3 -DskipTests -Phive -Phive-thriftserver clean package
mvn -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver test

ScalaTest plugin은 특정 test suite 만 실행 하는 것도 지원합니다.

mvn -Dhadoop.version=... -DwildcardSuites=org.apache.spark.repl.ReplSuite test


하위 모듈 개별 빌드하기:

하위 모듈을 mvn -pl 옵션을 사용해서 빌드하는 것도 가능합니다. Spark Streaming module을 아래와 같이 빌드할 수 있습니다.

mvn -pl :spark-streaming_2.10 clean install

spark-streaming_2.10 는 streaming/pom.xml file에 있는 artifactId입니다.


지속적인(Continuous) 컴파일:

scala-maven-plugin을 사용해서 점진적으로 지속적인 컴파일도 가능합니다.

mvn scala:cc

변경사하을 기다렸다가 지속적으로 컴파일을 할 겁니다. 그러나 광범위하게 테스트되지는 않았습니다.

  • 오직 src/main 와 src/test 디렉토리 밑에만 스캔합니다. 결국 특정 하위 모듈에 대해서만 작동합니다.

  • 특정 하위 모듈은 root에서 mvn install을 실행해 줘야 합니다. 하위 모듈은 다른 하위모듈에 spark-parent 모듈을 통해 의존하기 때문입니다.


그래서 core 하위모듈을 지속적으로 컴파일 하기 위한 전체 플로우는 아래와 같습니다.

$ mvn install
$ cd core
$ mvn scala:cc

Intellij나 Eclipse의 개발환경 셋업은 wiki page for IDE setup 을 참고하세요.


Java 8 test suite 실행하기:

Java8-test를 실행하기만 하면됩니다.

mvn install -DskipTests -Pjava8-tests

또는 아래와 같이 해도 되고요.

sbt -Pjava8-tests java8-tests/test

Java 8 tests는 -Pjava8-tests profile이 활성화 된 경우 돌아갑니다. -DskipTests Property를 설정해도 돌아가게 됩니다. 당연히 JDK 8이 설치되어 있어야하고 JAVA_HOME이 JDK 8로 설정되어 있어야합니다.


PySpark on YARN 빌드하기:

PySpark on YARN은 jar 파일이 Maven으로 빌드된 경우만 지원됩니다. 부연설명하자만 Red Hat 기반 운영체제에서 이슈가 있어서 그렇습니다.(see SPARK-1753). 만약 Red Hat 환경 YARN 클러스터에서 PySpark를 돌리길 원하면 jar를 다른 곳에서 빌드하기를 추천합니다.


YARN 의존성 없이 Hadoop 패키징하기:

mvn package로 생성된 jar 파일은 Hadoop 및 에코시스템 프로젝트의 모든 Spark 의존파일을 포함하고 있습니다. YARN에 배포한다면 classpath 상에 이들 여러개 버전이 보일 겁니다. Spark assembly에서 빌드된 것이랑 yarn.applicaton.classpath에 포함된 각 노드의 버전들이요. hadoop-provided profile은 Hadoop 에코시스템 프로젝트 즉 Zookeeper와 Hadoop 자체를 포함하지 않고 빌드합니다.


SBT로 빌드하기: 

Maven은 Spark를 패키징하는 공식적인 빌드 툴입니다. 그러나 SBT가 interative 컴파일에서는 훨씬 빠르기 때문에 지원되고 있습니다.

SBT 빌드는 Maven POM 파일에서 추출되고 Maven 프로파일과 변수와 같은 값이 SBT 빌드에서 설정됩니다.

build/sbt -Pyarn -Phadoop-2.3 assembly

재 컴파일할 때 SBT를 런칭하는 오버헤트를 피하기 위해서는 build/sbt를 실행해 interactive 모드로 SBT를 런치합니다. 그리고 모든 build 커맨드를 실해합니다. 더 자세한 설명은 wiki page 를 참고하세요.


SBT로 테스트하기:

몇몇 테스트는 Spark가 먼저 패키징 되어야 합니다. 그래서 항상 build/sbt assembly 를 먼저 실행하세요.

build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver assembly
build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver test

특정 test suite만도 실행할 수 있습니다.

build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver "test-only org.apache.spark.repl.ReplSuite"

특정 하위 프로젝트 내의 test suite도 실해할 수 있습니다.

build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver core/test


'Machine Learning' 카테고리의 다른 글

Hadoop 사용 Port  (1) 2016.04.23
Mesos를 Standalone으로 돌리기  (0) 2016.04.16
Ubuntu에 Hadoop Single Node로 설치하기  (1) 2016.04.16