Spark & Java Application Local 설정
Spark 로컬 환경 구성
본 포스트는 Spark 와 Java Application 을 이용한 Structured Streaming 구현을 목표로 한다. 방대한 양의 빅데이터가 실시간으로 들어오는 상황에서 database의 관리를 batch processing 이 아닌, streaming 으로 처리하기 위함이다. 그 첫번째 과정으로 로컬 환경을 구성하여 테스트 해 본다.
SPARK LOCAL SETTING
local spark settings, java application settings
REQUIREMENT
Spark, Eclipse(Maven)
WHAT IS MAVEN
개발 프로젝트 시 나타나는 많은 의존성 라이브러리들을 관리해 주는 툴
또한 MAVEN 은 사용할 라이브러리에 필요한 다른 의존성 라이브러리들을 자동으로 다운로드하여 개발 환경에 셋팅할 수 있도록 해준다.
MAVEN INSTALLATION
Eclipse 를 설치하게 되면 자동으로 설치된다. (따로 설치할 필요 없음)
MAVEN LIFECYCLE
메이븐은 프로젝트 생성에 필요한 단계(phases)들을 Build Lifecycle이라 정의하고 default, clean, site 세가지로 표준 정의한다. Lifecycle은 Build Phase 들로 구성되며 일련의 순서를 갖는다. phase 는 실행단위로서 goal과 바인딩된다.

build default lifecycle
- clean : 빌드 시 생성되었던 산출물을 삭제
- pre-clean : clean 작업 전에 사전작업
- clean : 이전 빌드에서 생성된 모든 파일 삭제
- post-clean : 사후작업
- default : 프로젝트 배포절차, 패키지 타입별로 다르게 정의됌
- validate : 프로젝트 상태 점검, 빌드에 필요한 정보 존재유무 체크
- initialize : 빌드 상태를 초기화, 속성 설정, 작업 디렉터리 생성
- generate-sources : 컴파일에 필요한 소스 생성
- process-sources : 소스코드를 처리
- generate-resources : 패키지에 포함될 자원 생성
- compile : 프로젝트의 소스코드를 컴파일
- process-classes : 컴파일 후 후처리
- generate-test-source : 테스트를 위한 소스 코드를 생성
- process-test-source : 테스트 소스코드를 처리
- generate-test-resources : 테스팅을 위한 자원 생성
- process-test-resources : 테스트 대상 디렉터리에 자원을 복사하고 가공
- test-compile : 테스트 코드를 컴파일
- process-test-classes : 컴파일 후 후처리
- test : 단위 테스트 프레임워크를 이용해 테스트 수행
- prepare-package : 패키지 생성 전 사전작업
- package : 개발자가 선택한 war, jar 등의 패키징 수행
- pre-integration-test : 통합테스팅 전 사전작업
- integration-test : 통합테스트
- post-integration : 통합테스팅 후 사후작업
- verify : 패키지가 품질 기준에 적합한지 검사
- install : 패키지를 로컬 저장소에 설치
- deploy : 패키지를 원격 저장소에 배포
- site : 프로젝트 문서화 절차
- pre-site : 사전작업
- site : 사이트문서 생성
- post-site : 사후작업 및 배포 전 사전작업
- site-deploy : 생성된 문서를 웹 서버에 배포
DEPENDENCY (POM.XML)
의존성에 대한 정보는 POM.XML에 저장된다. 이 정의에 의해서 MAVEN 은 자동으로 repository 를 검색하고 필요한 library 를 자동으로 추가해준다.
마치 npm 의 package.json 같은 역할
<dependency>
<groupId>groupid</groupId>
<artifactId>projectid</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<groupId> : 프로젝트의 패키지 명칭
<artifactId> : artifact 이름, groupId 내에서 유일해야 한다.
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version> : artifact 의 현재버전 ex. 1.0-SNAPSHOT
<name> : 어플리케이션 명칭
<packaging> : 패키징 유형(jar, war 등)
<distributionManagement> : artifact가 배포될 저장소 정보와 설정
<parent> : 프로젝트의 계층 정보
<dependencyManagement> : 의존성 처리에 대한 기본 설정 영역
<dependencies> : 의존성 정의 영역
<repositories> : 이거 안쓰면 공식 maven 저장소를 활용하지만, 사용하면 거기 저장소를 사용
<build> : 빌드에 사용할 플러그인 목록을 나열
<reporting> : 리포팅에 사용할 플러그인 목록을 나열
<properties> : 보기좋게 관리가능, 보통 버전에 많이 쓴다.
<!-- properties 에 이렇게 추가하면 -->
<spring-version>4.3.3.RELEASE</spring-version>
<!-- dependencies 에 이렇게 쓸수 있다. -->
<version>${spring-version}</version>
TEST STRUCTURE
<modelVersion>4.0.0</modelVersion>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.spark</groupId>
<artifactId>testSparkApplication</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>wordCounting</name>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven.compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
BUILD
/src/main/java 에 패키지를 생성하고 예제 java 파일을 생성한다.
그리고 maven 을 빌드해서 tar 파일을 생성해보자
example ‘wordcounting.java’

maven build

maven build configuration

build confirmation
위와 같이 BUILD SUCCESS 가 나오면 성공이다.

SPARK .tar FILE TESTING
서버의 spark 가 설치되어 있는 폴더로 이동하여
bin/spark-submit —class 클래스이름 jar파일 분석할md파일

위와 같이 적으면 동작한다. 결과는 다음과 같다.

REFERENCE
https://www.slideshare.net/KangDognhyun/2apache-spark
| 2.apache spark 실습 https://www.slideshare.net/KangDognhyun/2apache-spark |
HOW TO SUBMIT APPLICATION
Standalone Document
Spark Standalone Mode - Spark 2.4.0 Documentation
| Spark Standalone Mode - Spark 2.4.3 Documentation https://spark.apache.org/docs/latest/spark-standalone.html |
Standalone 으로 cluster 를 실행한다**
./sbin/start-master.sh

위와 같이 cluster 실행에 성공하면 기본적으로 localhost:8080 에서 master 의 web ui 를 확인 할 수 있다.

아직 실행중인 worker 나 application 이 없는 것을 확인 할 수 있다.
위에서 만든 wordcounting application 을 배포하려면 spark가 설치된 폴더에서
bin/spark-submit --master spark://computername:7077 --class javaclass something.jar somewhat.md
위와 같이 실행한다. 이 명령은 실행된 cluster 에 application 을 연결하는데, —master spark://computername:7077 옵션으로 연결시킨다.
Submitting Application Reference
Submitting Applications - Spark 2.4.0 Documentation
| Submitting Applications - Spark 2.4.3 Documentation https://spark.apache.org/docs/latest/submitting-applications.html |
Running application이 master 에서 인식된 모습

Terminal에서 application 을 종료하였을 때 인식된 모습

Terminal 에서 application 을 종료하였을 때 인식된 모습
HOW TO SET WORKERS
순서는 다음과 같다
- 클러스터 할당
- 클러스터에 워커 할당
- 어플리케이션 시작
Commands
./sbin/start-master.sh./sbin/start-slave.sh <master-url:port>bin/spark-submit --master <Spark-Master URL> --class <Package>.<Class> <Example>.jar
Real Code
./sbin/start-master.sh
./sbin/start-slave.sh jungyu:7077
bin/spark-submit --master spark://jungyu:7077 --class testSparkApplication.wordCounting testcase/testSparkApplication-0.0.1-SNAPSHOT.jar testcase/test.md
할당된 worker 에는 default 값으로 core 와 memory 가 할당된다.
만약 이를 변경하고 싶다면 /conf/spark-env.sh 파일에 다음과 같은 줄을 추가한다.
export SPARK_WORKER_INSTANCES=2
export SPARK_WORKER_MEMORY=1024m
export SPARK_WORKER_CORES=4
Worker 2개, 각각 4개의 Core 및 1G Memory 가 나타난다


LOG 숨기기
터미널에서 stdout 을 확인해야 하는데, 자꾸 다른 로그들이 겹쳐 나와서 보기가 힘든 경우가 있다. 이 모든 출력되는 로그들은 /conf/log4j.properties 에 설정이 되어있다. 여기에서 log4j.rootCategory=INFO, console 부분을 log4j.rootCategory=ERROR, console 로 바꾸어 주면 ERROR 에 대한 로그만 출력되어 편리하다.
아래는 설정 영상이다.
Comments