Spark 기반의 Wordcount 예제 수행하기

이 글은 Spark 기반의 Wordcount Application을 작성하고, 그것을 YARN을 통해 deploy 하는 과정에 대한 설명입니다.

WARNING

이 글은 최신버전을 기준으로 설명된 글이 아닙니다. 최신 버전을 대상으로 하였을 때와 설치 과정 혹은 출력 결과가 다를 수 있습니다.


Environment


Dependency

pom.xml에 다음과 같은 dependency를 추가합니다.

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.10</artifactId>
    <version>1.1.0</version>
</dependency>


Wordcount Example

다음과 같은 형태로 wordcount 프로그램을 작성합니다.

//Create spark context
SparkConf conf = new SparkConf().setAppName("Spark Word-count").setMaster("yarn-cluster");
JavaSparkContext context = new JavaSparkContext(conf);

//Split using space
JavaRDD<String> lines = context.textFile(INPUT_PATH);
JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
    @Override
    public Iterable<String> call(String s) throws Exception {
        return Arrays.asList(s.split(" "));
    }
});

//Generate count of word
JavaPairRDD<String, Integer> onesOfWord = words.mapToPair(new PairFunction<String, String, Integer>() {
    @Override
    public Tuple2<String, Integer> call(String s) throws Exception {
        return new Tuple2<String, Integer>(s, 1);
    }
});

//Combine the count.
JavaPairRDD<String, Integer> wordCount = onesOfWord.reduceByKey(new Function2<Integer, Integer, Integer>() {
    @Override
    public Integer call(Integer integer, Integer integer2) throws Exception {
        return integer + integer2;
    }
});

//Save as text file.
wordCount.saveAsTextFile(OUTPUT_PATH);

context.stop();

전체 소스코드는 github page에 있습니다.


Run Spark Application

maven을 이용하여 프로젝트를 패키징 합니다.

$ mvn package

다음과 같은 명령어를 이용하여 작성한 Wordcount application을 YARN에 submit 합니다.

$ spark-submit --class 패키지명.클래스명 --master yarn-cluster Package된Jar파일.jar
Read More...
Spark 1.1.0 설치, Hadoop 2.5.1과의 연동

이 글은, OS X에 Spark 1.1.0을 설치하고, Hadoop 2.5.1 의 Yarn과 연동시키는 과정에 대한 글입니다.
실제 Hadoop Cluster에 Spark Job을 제출하기 전에 Local 에서 테스트 하기 위한 환경을 구축하기 위해 필요한 작업입니다.


WARNING

이 글은 최신버전을 기준으로 설명된 글이 아닙니다. 최신 버전을 대상으로 하였을 때와 설치 과정 혹은 출력 결과가 다를 수 있습니다.


Target Version

설치하고 연동하고자 하는 Hadoop과 Spark의 버전입니다.

  • Hadoop : 2.5.1
  • Spark : 1.1.0


Pre-requirements

설치에 앞서 필요한 사항입니다. homebrew등을 이용해 쉽게 설치 가능합니다.
Mavericks 와, Yosemite 에서 테스트 되었습니다.

  • JDK7
  • Maven 3.x
  • Hadoop 2.5.1

Hadoop의 설치 과정은 OS X에 Hadoop2.5.1 설치하기를 참고해 주시기 바랍니다.


Notation

이 문서에서 사용될 용어들에 대한 정의입니다.

  • ${HADDOP_DIR} : Hadoop이 설치된 위치
  • ${SPARK_DIR} : Spark 압축 해제 위치


I. Spark 설치

Spark 1.1.0 다운로드

Spark 다운로드 페이지에서 다음과 같은 옵션으로 Spark를 다운로드합니다.

  • Version : 1.1.0
  • Package Type : Source Code (Hadoop 2.5.1에 맞는 Pre-build Version이 없으므로)
  • Download Type : Direct

그리고 다운로드 한 파일을 압축해제합니다.


Spark 빌드

${SPARK_DIR}에서 다음 명령어를 차례로 입력합니다. (15분 가량 소요됩니다.)

$ export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
$ mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.5.1 -DskipTests clean package

-Phadoop 옵션을2.4로 하는 이유는, 해당 옵션을 2.5.1로 설정하여 빌드하면, Spark에서 Hadopo 2.5.1에 해당하는 Profile이 없다는 다음과 같은 메시지를 출력한다.

[WARNING] The requested profile "hadoop-2.5" could not be activated because it does not exist.

하지만, 이 페이지 를 보면, 2.4를 그대로 쓰면 2.4+에 적용되므로 괜찮다는 얘기가 있다. 그러므로, 2.4 옵션을 사용한다.


II. Hadoop과의 연결

Spark 설정

${SPARK_DIR}/conf/spark-env.sh.template 을 복사하여 같은 경로에 spark-env.sh 파일을 생성합니다.
파일을 열고, 다음 변수를 추가합니다.

export HADOOP_CONF_DIR=${HADOOP_DIR}/etc/hadoop


Yarn-client와 연결

다음 명령어가 정상적으로 수행되는지 확인합니다.
단, 수행하기 이전에 Hadoop 2.5.1 과 Yarn이 정상적으로 수행되고 있어야합니다.

$ ${SPARK_DIR}/bin/spark-shell --master yarn-client

중간에 에러 메시지 없이

scala>

가 출력된다면 정상적으로 연결이 된 상태입니다.

Read More...
OS X에 Hadoop 2.5.1 설치하기

이 글은, OS X 에 Hadoop2.5.1을 설치하고, 정상적으로 설치가 되었는지 테스트 하는 방법에 대한 글입니다.
실제 Cluster에 Hadoop 관련 Job을 제출하기 전에 Local에서 테스트 하기 위한 환경을 구축하기 위해 필요한 작업입니다.

WARNING

이 글은 최신버전을 기준으로 설명된 글이 아닙니다. 최신 버전을 대상으로 하였을 때와 설치 과정 혹은 출력 결과가 다를 수 있습니다.


Target Version

설치하고, 연동하고자 하는 Hadoop의 버전은 2.5.1입니다.

Pre-requirements

설치에 앞서 필요한 사항입니다. homebrew등을 이용해 쉽게 설치 가능합니다.
Mavericks 와, Yosemite 에서 테스트 되었습니다.

  • JDK7
  • Maven 3.x

Notation

이 문서에서 사용될 용어들에 대한 정의입니다.

  • ${HADDOP_DIR} : Hadoop 압축 해제 위치


I. Hadoop 설치

Hadopo 2.5.1 다운로드

Hadoop 다운로드 페이지에서 hadoop-2.5.1.tar.gz 를 다운로드 하고 압축을 해제합니다.


hadoop-env.sh 설정

${HADOOP_DIR}/etc/hadoop/hadoop-env.sh 파일에 다음 두 가지를 설정해야 합니다.

  1. JAVA_HOME : Java가 설치된 경로
  2. HADOOP_PREFIX : Hadoop이 설치된 경로, 즉 ${HADOOP_DIR}

해당 변수가 있는 부분을 주석 해제 후, 적절한 경로를 입력하면 됩니다.
Oracle 에서 배포하는 JDK7를 통해서 JDK7을 설치한 경우 /Library/Java/JavaVirtualMachines/jdk1.7_x 가 기본 경로입니다.


core-site.xml 설정

${HADOOP_DIR}/etc/hadoop/core-site.xml파일을 다음과 같이 설정합니다.

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://localhost:9000</value>
        </property>
</configuration>


hdfs-site.xml 설정

${HADOOP_DIR}/etc/hadoop/hdfs-site.xml파일을 다음과 같이 설정합니다.

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>네임노드 정보가 저장될 경로</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>데이터노드 정보가 저장될 경로</value>
        </property>
</configuration>


mapred-site.xml 설정

${HADOOP_DIR}/etc/hadoop/mapred-site.xml파일을 다음과 같이 설정합니다.

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>


yarn-site.xml 설정

${HADOOP_DIR}/etc/hadoop/yarn-site.xml파일을 다음과 같이 설정합니다.

<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>


SSH 인증키 생성

콘솔창에서 다음 명령어를 수행합니다.

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys


II.Hadoop 설치 결과 테스트

설치한 Hadoop이 정상적으로 설치되었는지 확인합니다.

Namenode format

다음 명령어를 수행합니다.

${HADOOP_DIR}/bin/hdfs namenode -format

콘솔에 출력된 결과 중,

common.Storage: Storage directory "hdfs-site.xml에서 설정한 경로" has been successfully formatted

메시지를 확인합니다.


DFS(Distributed File System) 실행

다음 명령어를 수행합니다.

${HADOOP_DIR}/sbin/start-dfs.sh

다음 페이지에서 Live Nodes 항목이 1로 표시되는지 확인합니다.

http://localhost:50070


YARN 실행

다음 명령어를 수행합니다.

${HADOOP_DIR}/sbin/start-yarn.sh

다음 페이지에서 Active Nodes 항목이 1로 표시되는지 확인합니다.

http://localhost:8088


III. 예제 수행

다음 명령어들이 수행되는 기본 경로는 ${HADOOP_HOME}이라 가정합니다.

$ bin/hdfs dfs -put etc/hadoop /input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar grep /input /output 'dfs[a-z.]+'
$ bin/hdfs dfs -cat /output/p*

위 명령어의 최종 수행 결과가 다음과 같은 텍스트를 출력하였다면, 정상적으로 수행된 것입니다.

6   dfs.audit.logger
4   dfs.class
3   dfs.server.namenode.
2   dfs.audit.log.maxbackupindex
2   dfs.period
2   dfs.audit.log.maxfilesize
1   dfsmetrics.log
1   dfsadmin
1   dfs.servers
1   dfs.replication
1   dfs.file
1   dfs.datanode.data.dir
1   dfs.namenode.name.dir


참고 사항

Hadoop 2.5.1에서 사용되는 Native Library 는 Mac OS X Platform 에서 사용이 불가능합니다. 때문에 Hadoop 관련 명령어를 수행할 때 마다 Native Library를 사용할 수 없다는 경고 메시지가 출력됩니다.

Read More...