Icednut's Note

스파크 강의 노트 Day 1

2017-05-25

Scala 훑어보기 실습 (SparkIntro/0. Scala Programming)

  • zeppelin을 통해 스칼라 코드를 간단하게 실행해보자. (스칼라 관련 예제 notebook을 import 하여 실행해봄)
    • Tip. 실행 후 소스코드를 더블클릭 해보면 수정이 가능함

Spark Overview

  • MapReduce 오버뷰, Spark와 MapReduce를 비교하여 뭐가 좋은지
  • Spark로 할 수 있는게 뭐가 있을까? ETL, Crawling, Statistics
  • Spark로 할 수 없는건? 시각화, 데이터 수집
  • 결국 Spark를 쓰는 목적은 데이터를 저장소에서 읽어서 가공 후 저장하는 것을 분산처리 방식으로 프레임워크화 된 기술을 쓰기위해서 쓰는 것

Spark 실행 환경 구축하기

  • Spark를 하려면 로컬 머신에서 개발용으로 할 것인지, 여러 머신에서 Clustering해서 분산 처리할 것인지에 따라 다르다.
  • Local Machine 개발용으로 Spark 환경 구축하기
    • 크게 두 가지로 나뉘는데, Zeppelin만 설치하거나 Spark-submit을 사용하면 되는데 Zeppelin을 설치하면 Spark & UI, HDFS가 포함되어 있기 때문에 따로 설치할 필요가 없는 반면, Spark-submit을 쓰려면 저장소인 hdfs나 분산처리 매니징 기술인 YARN, 그리고 Spark 실행 모니터링을 하기 위한 Spark UI를 직접 설치해줘야 한다.
    1. Zeppelin 설치
      • Zeppelin 공식 사이트에서 제플린 다운로드
      • zeppelin을 로컬에서 실행하기 위한 설정 진행 (아래 설정파일 참고)
      • $ZEPPELIN_HOME/bin/zeppelin.sh 실행
        $ZEPPELIN_HOME/conf/zeppelin-env.sh
        1
        2
        3
        4
        5
        6
        7
        8
        #!/bin/bash
        ...
        export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
        export HADOOP_HOME=/Users/1002371/Dev/hadoop-2.8.0
        export SPARK_HOME=/Users/1002371/Dev/spark-2.1.1-bin-hadoop2.7
        export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
    2. Hadoop(YARN) 설치
      • Hadoop 공식 사이트에서 하둡 다운로드
      • $HADOOP_HOME/etc/haddop/hdfs-site.xml 등등 설정파일에 HDFS 관련 설정 진행하기 (아래 설정 예시 참고)
      • $HADOOP_HOME/bin/start-all.sh 실행 (YARN과 HDFS 실행됨)
        $HADDOP_HOME/etc/hadoop/core-site.xml
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        <configuration>
        <property>
        <name>fs.defaultFS</name>
        <value>hdfs://127.0.0.1:8020/</value>
        <description>NameNode URI</description>
        </property>
        <property>
        <name>hadoop.proxyuser.teamsk.groups</name>
        <value>*</value>
        </property>
        <property>
        <name>hadoop.proxyuser.teamsk.hosts</name>
        <value>*</value>
        </property>
        </configuration>
        $HADDOP_HOME/etc/hadoop/hdfs-site.xml
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        <?xml version="1.0" encoding="UTF-8"?>
        <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
        <!--
        Licensed under the Apache License, Version 2.0 (the "License");
        you may not use this file except in compliance with the License.
        You may obtain a copy of the License at
        http://www.apache.org/licenses/LICENSE-2.0
        Unless required by applicable law or agreed to in writing, software
        distributed under the License is distributed on an "AS IS" BASIS,
        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        See the License for the specific language governing permissions and
        limitations under the License. See accompanying LICENSE file.
        -->
        <!-- Put site-specific property overrides in this file. -->
        <configuration>
        <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///home/teamsk/Sparklab/hadoop-2.8.0/data/datanode</value>
        <description>Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks</description>
        </property>
        <property>
        <name>dfs.replication</name>
        <value>1</value>
        <description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.</description>
        </property>
        <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///home/teamsk/Sparklab/hadoop-2.8.0/data/namenode</value>
        <description>Path on the local filesystem where the NameNode stores the namespace and transaction logs persistently.</description>
        </property>
        <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
        </property>
        </configuration>
    3. Spark 설치
      • Spark 공식 사이트에서 스파크 다운로드
      • Spark App 코드 작성 후 jar로 묶기
      • $SPARK_HOME/bin에서 spark-submit.sh 실행하는데 실행 파라미터로 앞에서 만든 JAR 파일 입력하면 스파크 구동됨
        $SPARK_HOME/conf/spark-env.sh
        1
        2
        3
        4
        #!/usr/bin/env bash
        ...
        export HADOOP_CONF_DIR=/Users/1002371/Dev/hadoop-2.8.0/etc/hadoop

Spark 실습 (SparkIntro/1. RDD Programming)

  • SparkContext를 활용하여 word counting 등 간단한 실습
  • Spark’s Fault Tolerance: 파티션이 날라가면 계보를 따라 복구 후 다시 해당 파티션만 실행
  • deterministically recomputable operations -> Lazy Evaluation 개념 (이게 되어야지 fault tolerance가 됨)

Spark Architecture

Review

  • Two Types of Operations - transformation and action
  • Transaformations are lazy
  • Transformations are executed when an action is run.
  • Persist and cache

동작 방식 (ETL 기반, 읽고 처리하고 저장)

  • hdfs 읽기 -> 필터링 -> 파티션 조정 -> 저장
  • coalesce(2) // 원하는 데이터만 뽑아낸 뒤 파티션을 정리할 때 사용
  • 늘릴땐 repartition
  • 메모리 이슈가 발생할 땐 job이 죽음 -> 파티션 조정이 필요

Spark Job

  • Job: RDD로 계산하는 가장 최소 단위
  • Stage: 코드가 실행된 파이프라인된 RDD 단위
  • Task: 스테이지에서 RDD 파티션에 따른 실행 단위
  • Shuffle
  • Executor: 분산해서 실행시키는 주체

Spark Runtime Architecture

  • 교육에서는 Spark Shell을 쓸 수도 있지만 Zeppelin을 쓴다.
  • Zeppelin을 설치하면 스파크 관련 리소스가 생성됨
  • Spark Shell을 쓰면 SparkContext를 직접 생성해줘야 함
  • Spark을 클러스터링 하려면 Mesos, YARN을 써야됨
  • Driver Program, Cluster Manager, Worker
  • Spark Context를 생성하면서 클러스터를 지정?

Spark Deployment

  • 분산환경에 Deploy할 때는 Mesos, Apahce YARN을 고려해야 됨
  • Cluster Manager: 자원을 할당하거나 작업실행을 관리
  • Spark-repl: spark shell을 띄우지 않아도 spark 코드를 실행시킬 수 있는 환경
  • Spark Shell 로컬에서 띄우기: 간단한걸 테스트할 때 로컬에서 실행시키는게 좋음
  • Spark 코드 작성 -> Jar로 묶기 -> 클러스터에 배포 (배포할 때 쓰는게 spark-submit)
    • Spark 실행 관련 설정은 conf 파일로 쓰거나 spark-submit의 옵션, 코드로 new SparkConf()에 셋팅할 수 있다.
  • StandAlone 모드: Master가 죽으면 안되기 때문에 Zookeeper를 사용하여 backup master가 실행할 수 있도록 해준다. (Mesos, YARN을 사용하여 클러스터링 할 때는 상관 없음)
  • Yarn Mode: Resource Manager, Node Manager의 개념으로 동작
    • YARN Client Mode: 얀 밖에서 실행할 때 사용 (자원이 많지 않을 때 즉 Driver에서 많은 작업을 할 때 사용, Driver에서 많은 결과물을 전달해야 된다거나 등등..)
    • YARN Cluster Mode: 클러스터 내에서 리소스 매니저를 지정
  • Dynamic Resource Allocation on YARN: Application의 Work node에 따라서 서버가 조정. ETL을 밤에 띄울 때 서버가 많이 필요할 시 서버를 동적으로 늘려서 실행하고 싶을 때 사용
    • RDD를 날리지 않고 재사용하기 위해 external shuffle plugin을 설치해야됨
    • executor의 min, max 갯수를 지정하면 work node 내에서 실행되는 스레드 갯수 지정?
  • Mesos Mode: Mesos는 하둡진영 뿐 아니라 일반 어플리케이션 진영까지 자원관리 가능
  • Job Server: SparkContext를 Spark 어플리케이션을 실행할 때마다 생성하는게 아니라 Job Server에 SparkContext를 생성해서 공유해서 사용 (Production 환경에서 사용)
  • Hardware sizing
    • Storage: HDFS(추천) or local
    • Local disk: raid 구성 안함, 한 노드당 디스크를 25TB 4-8개를 붙여서 씀?
    • CPU: 객체 직렬화, 역직렬화 때문에 CPU를 많이 잡아먹음. 한 노드당 8-16 core를 추천
    • Network: 셔플링이 많을 경우 네트워크 고민 필요. 10GB
    • Memory: 8GB to hundreds of gigabytes, allocating only at most 75% of the memory.

Spark on cloud

  • AWS 사용 사례 소개
Tags: Spark