본문 바로가기

프로그래밍/scala

Maven + Java + Spark 연동 개발

메이븐 패키지를 맥에 설치

brew install maven


메이븐 기본 아키타입을 통해서 자바 테스트 앱 생성

mvn archetype:generate -DgroupId={project-packaging} 

   -DartifactId={project-name} 

   -DarchetypeArtifactId=maven-archetype-quickstart 

   -DinteractiveMode=false


bash$> mvn archetype:generate -DgroupId=com.psyoblade.dm4ir \

-DartifactId=foo \

-DarchetypeArtifactId=maven-archetype-quickstart \

-DinteractiveMode=false


실행 후에 아래와 같이 pom.xml 파일을 통해 확인

# cat foo/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.psyoblade.dm4ir</groupId>

  <artifactId>foo</artifactId>

  <packaging>jar</packaging>

  <version>1.0-SNAPSHOT</version>

  <name>foo</name>

  <url>http://maven.apache.org</url>

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

</project>


maven-archetype-quickstart 통해서 아래의 기본자바 앱은 이미 코드가 존재

# cat foo/src/main/java/com/psyoblade/dm4ir/App.java

package com.psyoblade.dm4ir;

public class App {

    public static void main( String[] args )    {   

        System.out.println( "Hello World!" );

    }   

}


메이븐을 통해 빌드 및 테스트

mvn compile

mvn exec:java -Dexec.mainClass="com.psyoblade.dm4ir.App"


메이븐은 플러그인 덩어리인데 너무 많아 헛갈리는 경우가 많으므로 아래의 키워드로 항상 확인하는 습관

mvn help:describe -Dplugin=help

mvn help:describe -Dplugin=exec -Dfull


이제는 스파크 코어를 연동해보기 위해서는 스파크 관련 레퍼런스를 연결

mvnrepository.com 사이트에서 spark-core 를 검색하여 아래의 정보를 조회할 수 있다

http://mvnrepository.com/artifact/org.apache.spark/spark-core_2.10/1.6.0

<dependency>

<groupId>org.apache.spark</groupId>

<artifactId>spark-core_2.10</artifactId>

<version>1.6.0</version>

</dependency>

위의 dependency 정보를 pom.xml 파일에 추가한다.


추가후 빌드 해도 성공만 했지 뭐가 달라진 것인지 모르겠다면 다음과 같이 종속성 확인

mvn dependency:resove

mvn dependency:tree


스파크 공식 페이지의 예제 프로그램 작성

package com.psyoblade.dm4ir;


/* SimpleApp.java */

import org.apache.spark.api.java.*;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.function.Function;


public class SimpleApp {

  public static void main(String[] args) {

    String sparkHomeReadme = "/usr/local/spark-1.5.2-bin-hadoop2.6/README.md";

    SparkConf conf = new SparkConf().setAppName("Simple Application");

    JavaSparkContext sc = new JavaSparkContext(conf);

    JavaRDD<String> logData = sc.textFile(sparkHomeReadme).cache();


    long numAs = logData.filter(new Function<String, Boolean>() {

      public Boolean call(String s) { return s.contains("a"); }

    }).count();


    long numBs = logData.filter(new Function<String, Boolean>() {

      public Boolean call(String s) { return s.contains("b"); }

    }).count();


    System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);

  }

}


스파크 잡 수행을 위한 패키지 생성 및 실행

mvn package

spark-submit --class "com.psyoblade.dm4ir.SimpleApp" --master "local" target/foo-1.0-SNAPSHOT.jar

Lines with a: 60, lines with b: 29


공식 메이븐 레파지토리 - mvnrepository.com

참고서적 - Maven : The Complete Reference

나의 경우에 아래와 같은 오류가 발생했는데 export SPARK_LOCAL_IP="" 으로 리셋으로 해결

16/02/04 22:55:47 ERROR SparkContext: Error initializing SparkContext.

java.net.BindException: Failed to bind to: /218.38.137.27:0: Service 'sparkDriver' failed after 16 retries!

export SPARK_LOCAL_IP=""