Hello

06 Spark Cluster

|

1. Spark Cluster 환경

  • 여러 대의 서버로 구성된 환경
  • 클러스터 환경에서는 여러 서버를 하나의 서버인 것처럼 다뤄야 하기 때문에 이를 도와주는 분산 작업 관리 기능이 필요
  • 분산 작업 관리를 해주는 역할을 하는것을 클러스터 매니저라고 하며 Standalone, Yarn, Mesos 3가지종류의 클러스터 매니저가 있음
  • 스파크에서는 클러스터 매니저를 일관되게 관리할수 있도록 추상화된 클러스터 모델을 제공

2. Spark Cluster 구조

Alt text

  1. Driver Program : 스파크 프로그램. 여러 개의 병렬적 작업으로 나눠져 Worker Node에 있는 Executor에서 실행
  2. SparkCotext : 메인 시작 지점. 스파크API를 활용하기 위해 필요하다. 클러스터의 연결을 보여주고 RDD를 만드는데 사용
  3. Cluster Manager : Standalone, YARN. Mesos 등 클러스터 자원 관리자
  4. Worker Node : 하드웨어 서버. 하나의 물리적 장치에 여러 개도 가능
  5. Executor : 프로세스. 하나의 워커 노드에 여러 개 가능

3. 클러스터 모드를 위한 일반적인 시스템 구성

Alt text

  • 클러스터 모드 시스템 구성
    1. 로컬 개발 서버
      • 개발환경을 의미
      • 스파크를 설치 하지 않고 간단히 IDE상에서 라이브러리처럼 불러와서 스파크 애플리케이션을 테스트 해볼 수도 있음
      • spark-submit, spark-shell등을 이용해 스파크 애플리케이션을 테스트 해봐야 하기 때문에 spark를 설치하는 편이 좋음
    2. 애플리케이션 실행 서버
      • spark-submit, spark-shell등의 스크립트를 이용해 스파크 애플리케이션을 맨 처음 실행하는 서버
      • 배치 서버라고도 불림
      • 스파크, 클러스터 매니저와의 접속을 위한 환경변수나 라이브러리 필요
    3. 클러스터 서버
      • 실제 데이터를 처리하고 필요에 따라 저장하는 워커 노드의 역할을 수행하는 서버
      • 클러스터 매니저에 따라 설치해야할 프로그램이나 환경정보가 상이하다.
  • 클러스터 모드 시스템 프로세스
    1. 배포 : 개발한 스파크 드라이버 프로그램을 배치 서버에 배포
    2. 작업 제출 / 실행 : 배포된 애플리케이션 수행(우지, 젠킨스)
    3. 결과 취합 / 처리 :
    4. 분석 결과 전송 / 저장 : 스프링 배치같은 별도의 애플리케이션을 통해 분석된 결과를 DB 혹은 외부시스템에 저장 및 전송
  • 드라이버 프로그램과 디플로이 모드
    1. 클라이언트 디플로이 모드
      • 애플리케이션을 실행한 프로세스 내부에서 드라이버 프로그램을 구동
    2. 클러스터 디플로이 모드
      • 애플리케이션을 실행한 프로세스는 클로스터에게 작업 실행만 요청하고, 드라이버 프로그램은 클러스터 내부에서 구동
      • 성능상의 이점이 있으나 디버깅이 어려움

4. 클러스터 매니저

4.1. Standalone

4.2. YARN

4.3. MESOS

References

  • 빅데이터 분석을위한 스파크2 프로그래밍(백성민, 위키북스, 2017)

05 Spark RDD

|

1. RDD에 관한 배경 지식

1.1. 스파크 클러스터

  • 클러스터 : 여러대의 서버가 한대의 서버처럼 동작하는 것
  • 클러스터 환경에서 동작하는 프로그램의 데이터는 여러 서버에 나눠져 병렬로 처리

1.2. 분산 데이터로서의 RDD

  • RDD는 회복력을 가진 분산 데이터 집합

1.3. RDD의 불변성

  • 한번 만들어진 RDD는 그 내용이 변경되지 않음

1.4. 파티션

  • RDD 데이터는 클러스터를 구성하는 여러 서버에 나누어 저장
  • 분할된 데이터를 파티션이라는 단위로 관리
  • 파티션의 크기 조정이 애플리케이션 성능에 큰 영향을 줌

1.5. HDFS(Hadoop Distributed File System)

1.6. Job과 Executor

  • 스파크 프로그램을 실행하는 것을 스파크 잡(Job)을 실행한다고 한다.
  • Job이 클러스터에서 처리될때 Executor라는 프로세스가 생성

1.7. 드라이버 프로그램

  • Driver Program : Job을 실행하는 프로그램. 즉, 메인함수를 가지고 있는 프로그램
  • 드라이버 프로그램은 자신을 실행한 서버에서 동작하면서 스파크 컨텍스트를 생성해 클러스터의 각 워커 노드들에게 작업을 지시하고 결과를 취합하는 역할 수행

1.8. Transformation과 Action

  • RDD Opertaion
    • Transformation : RDD의 형태를 변형하는 연산
    • Action : RDD가 아닌 다른 타입의 결과를 반환하는 연산

1.9. 지연(lazy)동작과 최적화

  • 다른 Action 연산이 호출되기 전까지는 Transformation연산은 실제로 수행되지 않음

1.10. 함수의 전달

  • 함수를 다른 함수의 파라미터로 전달하는 방식 사용(Javascript처럼)

1.11. 데이터 타입에 따른 RDD 연산

  • PairRDDFunctions : Key-Value 구성된 테이블에 대한 연산을 제공
  • OrderedRDDFunctions : Key-Value 구성된 테이블 대상으로 정렬 연산 제공
  • DoubleRDDFunctions : double 타입의 데이터를 위한 것으로 sum(), mean()등의 연산 제공
  • SequenceFileRDDFunctions : 하둡의 시퀀스 파일을 다루기 위한 연산 제공
  1. RDD Process AltText

2. Spark Context 생성 방법

// Spark Context 설정정보
val conf = new SparkConf()
  .setMaster("local[*]")   // [필수]마스터 정보  
  .setAppName("Exam01")    // [필수]애플리케이션 이름

// Spark Context 생성
val sc = new SparkContext(conf)

3. RDD 생성 방법

  • 기본 RDD 생성
val rdd1 = sc.parallelize(List("a", "b","c","d","e"))
  • 외부데이터를 읽어서 RDD 생성
val rdd1 = sc.textFile("<spark_home_dir>/README.md")

4. RDD Transformation

  • RDD를 가공해서 RDD로 반환
    1. Map Operation(map 관련 연산)
    • map
      • 함수를 파라미터로 전달받아 내부 모든 요소에 함수를 적용 시킨 새로운 RDD 생성
    • flatmap
      • map과 비슷하지만 처리 결과값의 타입이 다양할 경우 지정해준 타입으로만 RDD를 생성
    • mapPartitions
      • RDD의 파티션 단위로 map과 같이 처리
    • mapPartitionsWithIndex
      • RDD의 파티션 단위로 map과 같이 처리, 파티션의 index를 파라미터로 받아서 index별로 다른 처리를 할 수 있음
    • mapValues
      • RDD의 요소가 Key, Value쌍으로 이루고 있을 경우 Value에 map()연산을 적용한것과 같음
    • flatMapValues
      • RDD의 요소가 Key, Value쌍으로 이루고 있을 경우 Value에 flatmap()연산을 적용한것과 같음
        1. Group Operation(그룹 관련 연산)
    • zip
      • 두 개의 서로 다른 RDD를 각 요소의 인덱스에 따라 하나의 (Key, Value) 쌍으로 묶어줌
      • 두 RDD는 같은 개수의 파티션, 요소의 개수를 가져야 함
    • zipPartitions
      • 파티션 단위로 zip()연산을 수행하고, 병합 과정에서 특정 함수를 적용해 새로운 RDD생성 가능
      • 파이썬에서는 사용 불가
    • groupBy
      • 요소를 일정 기준에 따라 여러 개의 그룹으로 나누어진 RDD 생성
      • 그룹의 Key와 그 안에 Value Sequence로 구성
    • groupByKey
      • 키를 기준으로 같은 Key를 가진 요소들로 그룹을 만들어 RDD 생성
      • RDD의 구성요소가 Key-Value 쌍으로 이뤄진 경우 사용가능
    • cogroup
      • 여러 RDD에서 같은 Key를 갖는 Value 요소를 찾아와 Key와 그 Key에 속하는 Value Sequence로 구성
      • RDD의 구성요소가 Key-Value 쌍으로 이뤄진 경우 사용가 능
        1. Set Opertaion(집합 관련 연산)
    • distinct
      • RDD의 요소에서 중복을 제외한 요소로만 구성된 새로운 RDD를 생성
    • cartesian(곱집합)
      • 두 RDD 요소의 카테시안곱을 구하고 그 결과를 요소로 하는 새로운 RDD를 생성
      • [1, 2, 3] X [a, b] = [{1,a}, {1,b}, {2,a}, {2,b}, {3,a}, {3,b}]
    • subtract(차집합)
      • 두 RDD중 한쪽 RDD에는 속하고 다른쪽 RDD에는 속하지 않는 요소로 구성된 새로운 RDD 생성
    • union(합집합)
      • 두 RDD중 하나라도 속하는 요소들로 구성된 새로운 RDD 생성
    • intersection(교집합)
      • 두 RDD에 모두 속하는 요소들로 구성된 새로운 RDD 생성
      • 중복값은 제거
    • join
      • RDD의 구성요소가 KV 쌍으로 구성된 경우, 두 RDD에서 서로 같은 키를 가지고 있는 요소만을 모아 그룹을 형성하는 새로운 RDD 생성
      • 같은키가 없는 요소들은 제외
    • leftOuterJoin, rightOuterJoin
      • RDD의 구성요소가 KV 쌍으로 구성된 경우, 두 RDD에서 한쪽에 외부 조인을 수행한 결과를 새로운 RDD로 생성
      • 같은키가 없는 요소들도 포함
    • subtractByKey
      • RDD의 구성요소가 KV 쌍으로 구성된 경우, 두 RDD에서 서로 같은 키를 가지고 있는 요소를 제외한 나머지로 구성된 새로운 RDD생성
        1. [HARD] Compile Opertaion(집계 관련 연산)
    • reduceByKey
      • RDD의 구성요소가 KV쌍으로 구성된 경우, 키를 가진 값을 하나로 병합해 KV쌍으로 구성된 새로운 RDD 생성
    • foldByKey
      • RDD의 구성요소가 KV쌍으로 구성된 경우, 키를 가진 값을 하나로 병합해 KV쌍으로 구성된 새로운 RDD 생성
      • 병합 연산의 초기값을 메서드의 인자로 전달해서 병합 시 사용 할수 있음
    • combineByKey
      • RDD의 구성요소가 KV쌍으로 구성된 경우, 키를 가진 값을 하나로 병합해 KV쌍으로 구성된 새로운 RDD 생성
      • 병합을 수행하는 과정에서 값의 타입이 바뀔 수 있음
      • createCombiner
      • mergeValue
      • mergeCombiners
    • aggregateByKey
      • RDD의 구성요소가 KV쌍으로 구성된 경우, 키를 가진 값을 하나로 병합해 KV쌍으로 구성된 새로운 RDD 생성
  1. Pipe & Partition Operation
    • pipe
      • 데이터 처리 과정에서 외부 프로세스 활용 가능
    • coalesce
      • RDD의 파티션 개수를 줄일때, 성능이 repartition보다 좋음
    • repartition
      • RDD의 파티션 개수를 조정할때, 성능이 coalesce보다 나쁨
    • repartitionAndSortWithinPartitions
      • 데이터를 특정 기준에 따라 여러 개의 파티션으로 분리하고 각 파티션 단위로 정렬을 수행한 뒤 이결과로 새로운 RDD를 생성해 주는 메서드
    • partitionBy
      • KV쌍으로 구성된 RDD를 해당 인스턴스 인자에 따라 파티션으로 나누어진 RDD 생성
      • HashPartitioner
      • RangePartitioner
  2. Filter & Sort Opertaion
    • filter
      • 원하는 요소만 걸러내는 메소드
    • sortByKey
      • Key값을 기준으로 정렬하는 메소드
    • keys
      • RDD에서 Key값을 요소로 하는 RDD를 만드는 메소드
    • values
      • RDD에서 Value값을 요소로 하는 RDD를 만드는 메소드
    • sample
      • RDD에서 샘플을 추출하게 해주는 메소드
      • withReplacement : 복원/비복원 추출 여부
      • fraction :
      • seed : 반복 시행시 일정한 결과값을 나오도록 제어하는 인자

5. RDD Action

  • RDD를 가공해서 RDD가 아닌 다른 값을 반환
  • lazy evaluation
  • RDD에 Action을 할때 Transform도 한꺼번에 발생하기 때문에, 반복되는 Action의 경우 성능향상을 위해 적절한 Caching이 필요
    1. 출력과 관련된 연산
    • first
      • RDD의 첫번째 요소 하나 반환
    • take
      • RDD의 첫번째 요소로부터 매개변수 개수 만큼 collection(Array, List)으로 반환
    • takeSample
      • RDD에서 지정된 크기의 샘플을 추출
      • sample과는 달리 샘플의 크기를 지정할 수 있고, 반환 타입이 컬렉션 타입
    • collect
      • RDD의 모든 요소를 컬렉션 타입으로 반환
      • 메모리를 많이 사용하기 때문에 적당한 크기의 RDD를 대상으로만 사용해야 함
    • count
      • RDD에 있는 모든 요소의 개수를 반환
    • countByValue
      • RDD에 속하는 각 Value값들이 나타나는 횟수를 구해서 맵 형태로 반환
    • reduce
      • RDD에 포함된 임의값 두개를 하나로 합치는 함수를 인자로 받아서 RDD에 포함된 모든 요소를 하나의 값으로 병합하고 그 결과값을 반환
    • reduceByKey
      • reduce와 비슷하지만 합산이 key별로 진행됨
    • fold
      • RDD 내의 모든 요소를 대상으로 교환법칙과 결합법칙이 성립되는 바이너리 함수를 순차 적용해 최종 결과를 구하는 메서드
      • reduce와 비슷하지만 병합연산의 초기값을 지정해 줄 수 있다.
    • aggregate
      • 타입 제약 사항떄문에 입력과 출력의 타입이 다른경우
      • 인자 : zeroValue(기본값), seqOp(함수), combOp(함수)
    • sum
      • RDD 내의 모든 요소가 숫자 타입일 경우에만 사용 가능하며 전체 요소의 합을 구해줌
    • foreach
      • RDD의 모든 요소에 특정 함수를 적용하는 메서드
    • foreachPartition
      • foreach를 파티션 단위로 적용
    • toDebugString
      • RDD의 세부정보를 알고 싶을때 사용
      • RDD의 파티션 개수, 의존성 정보등을 알 수 있음
    • cache
      • 반복되는 RDD 트랜스포메이션 연산이 비효율 적일때, 트랜스포메이션한 RDD를 메모리에 저장하여 사용 하게 해주는 메서드
      • 메모리가 부족하면 가용 메모리 만큼만 저장
    • persist
      • cache와 비슷하지만 StorageLevel이라는 옵션을 이용해 저장 위치(메모리, 디스크), 저장 방식(직렬화 여부) 지정 가능
      • 저장위치를 MEMORY_AND_DISK_SER로 설정하면 메모리에 저장하다가 부족하면 DISK를 사용하되 직렬화된 포맷을 이용해 저장
    • unpersist
      • 저장중인 데이터가 필요 없을때 캐시 설정을 취소하는 메서드
    • partitions
      • RDD의 파티션 정보가 담긴 배열을 반환
    • getNumPartitions
      • RDD의 파티션 수를 반환

6. RDD 데이터 불러오기, 저장하기

  • 파일 : 텍스트, JSON, 하둡의 시퀀스파일, csv
  • 파일시스템 : 로컬 파일시스템, HDFS, AWS S3, 오픈스택의 Swift
  • RDBMS : MySQL
  • NoSQL : HBase, 카산드라, Hive
  • 경로는 모든 클러스터에서 동일하게 접근이 가능해야 한다.
  • RDD는 Data Set혹은 Data Frame과는 달리 데이터를 저장할 때 기존에 생성되있는 파일이 존재하면 오류를 발생시킨다.
  1. 텍스트 파일(Text File)
    • textFile : 불러오기
    • saveAsTextFile : 저장하기
    • 저장할때 압축 코덱을 사용할거면 두번째 인자로 압축코덱의 클래스 경로를 넣으면 됨
  2. 오브젝트 파일(Object File)
    • objectFile : 불러오기
    • saveAsObjectFile : 저장하기
  3. 시퀀스 파일(Sequence File)
    • sequenceFile : 불러오기
    • saveAsSequenceFile : 저장하기

7. 클러스터 공유변수

  1. 브로드캐스트 변수(Broadcast Variables)
    • 스파크 잡이 실행되는 동안 클러스터 내의 모든 서버에서 공유할 수 있는 읽기전용 자원을 설정할 수 있는 변수
    • 브로드캐스트 변수 설정 방법
      1. 공유하고자 하는 데이터를 포함한 오브젝트 생성
      2. 생성된 오브젝트를 broadcast() 메서드의 인자로 지정해 실행
      3. 생성된 broadcast 변수는 value() 메서드를 통해 접근 가능
        val broadcastUsers = sc.broadcast(Set("u1", "u2"))
        val rdd = sc.parallelize(List("u1", "u3", "u3", "u4", "u5", "u6"), 3)
        val result = rdd.filter(broadcastUsers.value.contains(_))
      
    • 동일한 스테이지 내에서 실행되는 테스크 간에는 동작에 필요한 변수를 자동으로 브로드캐스트 변수를 이용해 전달
  2. 어큐뮬레이터(Accumulators)
    • 브로드캐스트 변수와는 반대로 Accumulator는 쓰기 동작을 위한 것
    • 주로 에러 정보같은 로그를 한곳에 모아서 디버깅 하기 위해 사용
    • 기본 제공 Accumulator 종류
      1. longAccumulator
      2. DoubleAccumulator
      3. CollectionAccumulator
    • Accumulator 사용 방법
     val acc1 = sc.longAccumlatior("invalidFormat")
     val acc2 = sc.collectionAccumlator[String]("invalidFormat2")
     va data = List("U1:Addr1", "U2:Addr2", "U3", "U4:Addr4", "U5;Addr5", "U6:Addr6", "U7::Addr7")
     sc.parallelize(data, 3).foreach { v =>
         if (v.split(":").length != 2) {
             acc1.add(1L)
             acc2.add(v)
         }
     }
     println("잘못된 데이터 수 : " + acc1.value)
     println("잘못된 데이터 : " + acc2.value)
    
    • 사용자 정의 Accumulator ```scala import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.util.AccumulatorV2

    class RecordAccumulator extends AccumulatorV2[Record, Long] {

    private var _record = Record(0)

    // 초깃값 여부
    def isZero: Boolean = _record.amount == 0 && _record.number == 1

    // 동일한 값을 가진 새로운 어큐뮬레이터 생성 def copy(): AccumulatorV2[Record, Long] = { val newAcc = new RecordAccumulator newAcc._record = Record(_record.amount, _record.number) newAcc }

    // 어큐뮬레이터에 포함된 데이터의 값을 초기화 def reset(): Unit = { _record.amount = 0L _record.number = 1L }

    // 다른 데이터 병합 def add(other: Record): Unit = { _record.add(other) }

    // 다른 어큐뮬레이터 병합 def merge(other: AccumulatorV2[Record, Long]): Unit = other match { case o: RecordAccumulator => _record.add(o._record); case _ => throw new RuntimeException }

    // 최종 결과(AccumulatorV2의 출력 타입과 같아야 함) def value: Long = { _record.amount } } ```

References

04 Spark 개발 프로세스

|

1. 공통 개발 프로세스

  1. SparkContext생성
    • 애플리케이션과 스파크클러스터와의 연결을 담당하는 객체
    • 스파크 애플리케이션을 수행하는데 필요한 각종 설정 정보를 담는 SparkConf를 SparkContext 생성자으 인자로 전달해야함
  2. RDD 생성
    • 데이터를 처리하기 위한 클래스
    • 생성 방법
      1. 외부 데이터 소스
      2. 기존 RDD
  3. RDD 처리
  4. 결과 파일 처리
    • 처리 결과 저장
  5. SparkContext종료

2. 언어별 프로세스

Scala

  • 프로세스
    1. 공통 개발 프로세스에 따른 코드 작성
    2. 단위 테스트
      • JUnit 단위 테스트(TDD)
      • FlatSpec(시나리오 명세, BDD)
    3. 소스코드 실행
      • Jar 파일 형태로 빌드한 뒤 실행(Maven)
      • SBT를 이용한 빌드
  • 스칼라의 경우 Shell에서 PERL방식의 개발환경 제공 : 간단한 분석 처리를 위한 용도

Python

  • 프로세스
    1. 공통 개발 프로세스에 따른 코드 작성
    2. 단위 테스트
      • Python unit-test
    3. 소스코드 실행
      • 소스코드 실행

Java

  • 프로세스
    1. 공통 개발 프로세스에 따른 코드 작성
    2. 단위 테스트
      • JUnit 단위테스트
    3. 소스코드 실행
      • Jar 파일 형태로 빌드한 뒤 실행(Maven)

# 3. 실행 스크립트 spark-submit

  • 애플리케이션을 실제 스파크 클러스터에서 쉽게 실행할 수 있게 스파크에서 기본적으로 제공하는 스크립트
  • –class : 실행할 클래스의 경로를 지정하는 매개변수
  • local[*] : 애플리케이션에 전달되는 인자
  • 실행 스크립트 예 :
 > spark-submit --class [실행할 클래스 경로] [실행할 JAR파일 경로] local[스레드 개수] [실행할 클래스에 들어가는 매개변수1] [실행할 클래스에 들어가는 매개변수2] ... 

# 4. spark-shell 에서 실행

References

03 Spark Shell

|

1. 스파크 셸이란?

- 정의

2. 셸 실행

# cd ${SPARK_HOME}
# spark-shell
  • Spark shell application UI
  • 셸을 실행시킨 상태로 브라우져로 4040포트로 접속하면 Spark shell application UI에 접속 가능

3. 로그 설정 변경

  • 보다 상세한 로그 확인을 위해 로그레벨을 WARN에서 INFO로 변경
# cd ${SPARK_HOME}/conf
# cp ./log4j.properties.template log4j.properties
# vim log4j.properties

"log4j.logger.org.apache.spark.repl.Main=WARN" 을
"log4j.logger.org.apache.spark.repl.Main=INFO" 로변경

4. 스파크 셸에서 스파크 컨텍스트 확인

# spark-shell
scala> sc
res0: org.apache.spark.SparkContext ...

5. 단어 수 세기 예제를 스파크 셸을 이용해 실행

# spark-shell

scala> val file = sc.textFile("file:///usr/local/src/spark-2.2.0-bin-hadoop2.7/README.md")
scala> val words = file.flatMap(_.split(" "))
scala> val result = words.countByValue
scala> result.get("For").get

res1: Long = 3

6. 스파크 셸 실행 옵션

  1. 스파크 셸이 동작할 떄 필요한 클래스와 라이브러리에 관한 옵션
  2. 애플리케이션 실행과 관련된 옵션
  3. 클러스터 동작과 관련된 옵션
    • 실행옵션을 통해 로컬/클러스터 등으로 선택해 구동 가능

References

02 Spark 설치

|

1. 실행환경

  • OS : UNIX-like systems(Linux, Mac OS), Windows
  • 언어 : Java8+, Python 2.7+/3.4+, Scala 2.11.x

2. 실행환경 설치

Linux (Ubuntu 16.04 LTS)

  1. 설치과정에서 필요한 공통 소프트웨어 설치[필수]

     # apt-get update
     # apt-get install software-properties-common
    
  2. JAVA 설치[필수]

     # add-apt-repository ppa:webupd8team/java
     # apt-get update
     # apt-get install oracle-java8-installer
     # java -version
     # javac -version
    
  3. Spark 설치[필수]

     # cd /usr/local/src/
     # wget https://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz
     # tar xvf spark-2.2.0-bin-hadoop2.7.tgz
     # cd spark-2.2.0-bin-hadoop2.7
    
  4. Spark 환경변수 설정[필수]
    • 환경변수 설정파일 열기
     # vim ~/.bashrc
    
    • 문서 하단에 추가 후 저장
     export SPARK_HOME=/usr/local/src/spark-2.2.0-bin-hadoop2.7
     export PATH=$SPARK_HOME/bin:$PATH
    
    • 추가된 환경변수 적용
     # source ~/.bashrc
    
  5. Hadoop 환경 설정

Windows 10

  • [필수]Java 설치
    1. Java 설치
    2. 환경변수 설정
  • [선택]Scala 설치
    1. Scala 다운로드 및 설치
      • 다운로드
    2. 환경변수 설정

       SCALA_HOME  :
       Path        : %SCALA_HOME%\bin
      
  • [선택]Python 설치
    1. Python 2.7 / 3.5+ 설치
      • 다운로드
    2. 환경변수 설정
      • 환경변수 설정
  • [필수]스파크 설치
    1. 스파크 다운로드
      • https://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz
    2. 스파크 설치
      • C:\spark 경로에 다운받은 파일 스파크 파일 복사
      • 압축풀기 tgz -> tar -> 폴더이름으로 압축 풀기
      • C:\spark\spark-2.2.0-bin-hadoop2.7 경로에 압축이 풀렸는지 확인
    3. 환경변수 설정

       SPARK_HOME  : C:\spark\spark-2.2.0-bin-hadoop2.7
       Path        : %SPARK_HOME%\bin
      
  • [필수]Hadoop Windows Utilities 설치
    1. 다운로드
      • Hadoop Winutilities : https://github.com/steveloughran/winutils/raw/master/hadoop-2.7.1/bin/winutils.exe
      • Hadoop Binary :
    2. 다운받은 Hadoop 유틸 파일 복사
      • C:\spark\spark-2.2.0-bin-hadoop2.7\bin 경로에 복사
    3. Hadoop 환경변수 설정

       HADOOP_HOME : C:\spark\spark-2.2.0-bin-hadoop2.7
       Path        : %HADOOP_HOME%\bin
      
    4. tmp/hive 폴더 권한 설정[권한 오류 발생시]

       > %SPARK_HOME%\bin\winutils.exe chmod 777 \tmp\hive
      

Mac OS

3. 개발 환경 설치

  • 선행조건 : 실행환경 설치

Windows 10

  • Scala
    1. Scala-IDE 설치
    2. SBT 설치
  • Python
    1. PyCharm 설치
  • Java
    1. Eclipse 설치
    2. Maven 설치

Linux

MacOS

4. 실행 확인

# spark-shell
  • 오류 로그없이 실행되면 정상 실행된 것임

References