Oozie 스케줄러에 Spark 배치 작업 등록
    • PDF

    Oozie 스케줄러에 Spark 배치 작업 등록

    • PDF

    Article Summary

    VPC 환경에서 이용 가능합니다.

    Data Forest에서 Spark 배치 작업을 Apache Oozie 스케줄러에 등록하는 방법을 설명합니다. 이 배치 애플리케이션의 소스 데이터는 Elasticsearch에 저장되어 있습니다.

    df-usercase1_01_vpc_ko

    Step 1. 사전 준비

    1. Data Forest 계정 생성

    • example이라는 계정을 생성합니다.
    • 작업을 제출하기 위해 Kerberos 키탭이 필요하므로 미리 다운로드합니다. ([클러스터 접속 정보] > 커버로스 키탭 다운로드에서 다운로드 가능)
      df-usercase1_02_vpc_ko(1)

    2. Data Forest 앱 생성

    • Elasticsearch: 원본 데이터(로그 등)가 쌓이는 저장소입니다.
    • Kibana: 인덱스를 검색하고 시각화하는데 사용합니다. Kibana 앱 생성 시 Elasticsearch 앱을 먼저 생성해야 합니다. 앱 연동 정보에서 먼저 생성한 Elasticsearch 앱의 이름을 선택해 주십시오.
      df-usercase1_1-1_ko
    • Dev: Oozie 서버에 워크플로를 제출하기 위한 클라이언트로 사용합니다.
      df-usercase1_03-1_vpc_ko

    3. 샘플 데이터 주입

    • 별도의 데이터 수집 모듈을 두지 않고, Kibana 앱에서 제공하는 Sample eCommerce orders를 원본 데이터로 사용하는 것을 예시로 설명합니다.
    • Kibana UI에서 [Load a data set and a Kibana dashboard] > [Sample eCommerce orders] 를 클릭하여 샘플 인덱스를 생성합니다.
    • Kibana의 주소는 Kibana 앱의 Quick links에서 확인할 수 있습니다.
      df-usercase1_04_vpc_ko

    Step 2. Spark 앱 빌드

    실행할 Spark 앱을 빌드해야 합니다. 이 예제에서 사용한 Spark 앱은 Elasticsearch에 저장된 kibana_sample_data_ecommerce 인덱스를 정제하여 다시 인덱스로 쓰는 작업을 수행합니다. 실행되는 시점의 24시간 전 데이터만 가져와서 처리 후 다시 인덱스로 저장하는 작업입니다. 이미 빌드된 jar 파일를 다운받아서 사용해도 무방합니다.

    Step 3. Oozie 코디네이터로 워크플로 실행

    모든 작업은 Dev 앱에서 수행합니다. Data Forest를 사용하기 위한 모든 클라이언트 구성이 Dev 앱에 있습니다.

    Oozie는 Apache Hadoop의 맵리듀스 작업의 흐름을 관리하는 스케줄러 시스템입니다. 워크플로는 흐름 노드(start, end, decision 등)와 액션 노드(mr, pig, shell 등)로 이루어진 DAG (Directed Acyclic Graph)입니다. 여러 개의 배치 애플리케이션과 애플리케이션 전/후로 필요한 스크립트 실행을 워크플로로 등록하면 플로를 한 눈에 파악하고 모니터링할 수 있습니다.

    아래 그림과 같이 간단한 형태의 워크플로를 작성하는 것을 예시로 설명합니다. 해당 워크플로가 하루에 한 번씩 실행되도록 코디네이터로 실행해 보겠습니다.

    df-use-ex1-workflow_vpc

    1. 셸 액션 스크립트 작성

    워크플로에 셸(shell) 액션을 등록하여 spark-submit을 실행하는 예시입니다.
    실행시킬 sh 스크립트를 작성해 주십시오. 앞서 만든 SPARK_JAR는 Elasticsearch 노드 주소를 인자로 받으므로 Quick links에서 elasticsearch.hosts.inside-of-cluster를 찾아 사용합니다.

    주의

    클러스터 외부에서 Elasticsearch 앱에 접근할 때에는 elasticsearch.hosts에 명시된 주소를 사용해야 합니다.

    spark_submit_action.sh

    #!/bin/bash 
    CLASS=$1
    SPARK_JAR=$2
    QUEUE=$3
    
    export HDP_VERSION=3.1.0.0-78
    
    # 키탭으로 Kerberos 인증
    # user name과 keytab 정보를 수정해 주십시오.
    kinit {user name} -kt ./{enter your keytab}
    {user name}@KR.DF.NAVERNCP.COM
    
    # Spark 설정 경로
    export SPARK_HOME=./spark2.tar.gz/spark2
    export SPARK_CONF_DIR=./spark_conf.tar.gz/conf
    
    # Hadoop 설정 경로
    export HADOOP_CONF_DIR=./hadoop_conf.tar.gz/conf
    
    # Spark 작업 제출
    # elasticsearch 노드 주소를 찾아 수정해 주십시오.
    ${SPARK_HOME}/bin/spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --queue $QUEUE \
    --num-executors 2 \
    --executor-memory 1G \
    --driver-memory 1G \
    --executor-cores 1 \
    --name $CLASS \
    --class $CLASS \
    $SPARK_JAR "{enter your elasticsearch.hosts.inside-of-cluster address}"
    

    위 스크립트에서 SPARK_HOME, SPARK_CONF_DIR, HADOOP_CONF_DIR의 경로를 확인해 주십시오. 스크립트에서 사용하는 모든 파일은 분산 캐시에 업로드한 파일 경로입니다. Data Forest에서는 Spark 패키지를 제공하지 않으므로 패키지와 구성정보를 'tar'로 압축하여 분산캐시에 업로드해야 합니다. 업로드하는 방법은 디렉터리 구성 및 배포를 참조해 주십시오.

    2. job.properties와 workflow.xml, coordinator.xml 작성

    job.properties에서는 .xml 파일에서 사용할 파라미터를 정의해 주십시오. 이 파일은 따로 배포할 필요 없이 Oozie CLI를 실행할 장비에만 있으면 됩니다.

    # {user name}을 사용하는 계정으로 수정해 주세요.
    
    # cluster configuration 
    nameNode=hdfs://koya
    jobTracker=rm1
    
    # job directory information
    homeDir=${nameNode}/user/{user name}/myproject/oozie
    workflowDir=${homeDir}/workflow
    
    # oozie configuration
    # this is where you deploy coordinator.xml into
    oozie.coord.application.path=${homeDir}/coordinator
    
    # user information
    user.name= {user name}
    
    # job configuration
    class=ecomm.BatchProducerRunnerSpark
    queueName=longlived
    shellActionScript=spark_submit_action.sh
    sparkJar=sample-analyzer-1-assembly-0.1.jar
    

    workflow.xml는 아래처럼 셸 액션을 정의할 수 있습니다. job.properties에 정의한 파라미터를 사용한 것을 확인할 수 있습니다. 아래 파일에서 keytab 정보를 알맞게 수정해 주십시오.

    <workflow-app name="exampleWorkflowJob" xmlns="uri:oozie:workflow:0.5">
    	<start to="exampleShellAction"/>
    
    	<action name="exampleShellAction">
    		<shell xmlns="uri:oozie:shell-action:0.1">
    			<job-tracker>${jobTracker}</job-tracker>
    			<name-node>${nameNode}</name-node>
    
    			<exec>./action.sh</exec>
          <argument>${class}</argument>
    			<argument>${sparkJar}</argument>
    			<argument>${queueName}</argument>
    
    			<file>${workflowDir}/${shellActionScript}#action.sh</file>
    			<file>${workflowDir}/${sparkJar}</file>
          		<file>${homeDir}/{enter your keytab}</file>
    			<archive>${homeDir}/hadoop_conf.tar.gz</archive>
    			<archive>${homeDir}/spark_conf.tar.gz</archive>
    			<archive>${homeDir}/spark2.tar.gz</archive>
    
    			<capture-output/>
    		</shell>
    		<ok to="end"/>
    		<error to="fail"/>
    	</action>
    
    	<kill name="fail">
    		<message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    	</kill>
    	<end name="end"/>
    </workflow-app>
    

    coordinator.xml는 워크플로를 스케줄링할 코디네이터의 명세 파일입니다. 하루에 한 번씩 실행되도록 설정했습니다. 워크플로와 마찬가지로 xml 형식입니다. 시작 시각은 Oozie CLI를 실행할 때 옵션으로 줍니다.

    <coordinator-app name="exampleCoordinatorJob" frequency="${coord:days(1)}" start="${start}" end="9999-12-31T23:59+0900" timezone="Asia/Seoul"
    		xmlns="uri:oozie:coordinator:0.4">
    	<controls>
    		<timeout>10</timeout>
    		<concurrency>1</concurrency>
    	</controls>
    	<action>
    		<workflow>
    			<app-path>${workflowDir}</app-path>
    		</workflow>
    	</action>
    </coordinator-app>
    

    3. 디렉터리 구성 및 배포

    1. 다음과 같이 디렉터리를 구성해 주십시오. (예시)
      hdfs://koya/user/example/myproject/oozie    # 사용자의 oozie 작업 디렉토리
      ├── workflow
      │   ├── spark_submit_action.sh  # workflow shell action으로 사용될 bash 스크립트
      │   ├── sample-analyzer-1-assembly-0.1.jar  # spark-submit에서 실행할 jar
      │   └── workflow.xml
      ├── coordinator
      │   └── coordinator.xml 
      ├── spark2.tar.gz   # spark 실행 jar 아카이브
      ├── hadoop_conf.tar.gz  # hadoop configuration 아카이브
      ├── spark_conf.tar.gz   # spark configuration 아카이브
      └── df.test01.keytab   # 계정의 커버로스 키탭   
      
    2. Oozie 프로젝트 홈으로 사용할 디렉터리를 생성해 주십시오.
      $ hadoop fs -mkdir -p /user/example/myproject/oozie/workflow
      $ hadoop fs -mkdir -p /user/example/myproject/oozie/coordinator
      
    3. Spark 패키지를 아카이빙해 주십시오.
      $ tar cvfz spark2.tar.gz -C /usr/hdp/3.1.0.0-78/ spark2
      
    4. Spark, Hadoop의 configuration을 아카이빙해 주십시오. 기본값 구성을 수정해야 합니다.
      # 사용자가 직접 /etc/hadoop/conf, /etc/spark2/conf 아래 파일을 수정할 수 없습니다.
      # 파일을 복사해와서 수정하도록 합니다.
      $ mkdir hadoop_conf
      $ cp -R /etc/hadoop/conf ./hadoop_conf
      $ mkdir spark_conf
      $ cp -R /etc/spark2/conf ./spark_conf
      
    5. ./spark_conf/conf/spark-env.sh 에서 다음 줄을 주석으로 처리해 주십시오.
      HADOOP_CONF_DIR은 분산 캐시 경로여야 하므로 아래 정보가 들어가면 파일을 찾지 못할 수 있습니다.
      # export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/usr/hdp/3.1.0.0-78/hadoop/conf}
      
    6. 수정이 완료되면 configruation 파일도 아카이빙해 주십시오.
      $ tar cvfz hadoop_conf.tar.gz -C ./hadoop_conf conf
      $ tar cvfz spark_conf.tar.gz -C ./spark_conf conf
      
    7. 아카이빙한 패키지와 워크플로를 실행하는데 필요한 파일을 모두 HDFS에 업로드해 주십시오.
      $ hadoop fs -copyFromLocal -f spark2.tar.gz hadoop_conf.tar.gz \
      spark_conf.tar.gz df.test01.keytab /user/example/myproject/oozie
      
      $ hadoop fs -copyFromLocal -f workflow.xml spark_submit_action.sh sample-analyzer-1-assembly-0.1.jar \
       /user/example/myproject/oozie/workflow
      
       $ hadoop fs -copyFromLocal -f  coordinator.xml  /user/example/myproject/oozie/coordinator
      

    4. 워크플로 실행

    Dev 앱에는 이미 OOZIE_URL 환경변수가 설정되어 있습니다.

    $ oozie job -oozie $OOZIE_URL -config job.properties -Dstart=`TZ="Asia/Seoul" date "+%Y-%m-%dT%H:00"`+"0900" -run
    

    브라우저로 OOZIE_URL에 접속하여 방금 실행한 워크플로와 코디네이터를 확인할 수 있습니다. Resource Manager에 접속하면 워크플로에 정의한 spark-submit 셸 액션으로부터 Spark 앱이 실행 중인 것을 확인할 수 있습니다.

    df-usercase1_06_vpc_ko

    df-usercase1_07_vpc_ko

    Spark 앱이 종료되면 History Server 에서 해당 앱의 실행 이력을 조회 할 수 있습니다.
    df-usercase1_08_vpc_ko

    Step 4. Kibana 앱에서 데이터 확인

    Kibana 앱에서 'ecomm_data.order.1d.${날짜}'의 형태를 가진 인덱스를 찾을 수 있습니다.
    df-usercase1_09_vpc_ko


    이 문서가 도움이 되었습니까?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.