Hadoop 5. Spark

skh951225·2023년 4월 11일

Hadoop 입문

목록 보기

Spark 개요

What is Spark?

  • "A fast and general engine for large-scale data processing"
  • Python, Java, Scala로 프로그래밍 가능한 유연한 기술
  • Spark 위에 다양한 기술이 존재(MLlib, SparkSQL, GraphX, SparkStreaming)
  • cluster manager로 YARN, MESOS을 쓸수도 있고 it's own cluster manager를 쓸 수도 있다.
    • Hadoop위에서 돌수도 있고 아닐수도있다.
    • 하지만 어떤 cluster manager를 쓰던간에 전체 cluster에 job을 뿌려서 분산처리함
  • 가장 큰 장점은 처리 속도이다
    • disk based solution이 아니라 in-memory solution
    • DAG Engine 이 job plan을 최적화함
    • MapReduce보다 훨씬 빠름
  • Bulit around one main concept : RDD(Resilient Distrbuted Data)
    • data set을 나타내는 하나의 객체
    • RDD object는 다양한 함수를 지원한다.

Components of Spark

  • Spark streaming
    • instead of just doing batch processing of data you can actually input data in real time.
    • 대량의 log 데이터가 ingested되면 SparkStreaming으로 실시간 처리하고 목적지에 저장
  • SparkSQL
    • Spark의 많은 최적화 작업이 SparkSQL 인터페이스에 초점을 맞추고 있다.(data sets)
  • MLlib
    • library of machine learning and data mining tools
  • GraphX

Spark by Using Python

  • using Spark in production in the real world Python is OK to start with and prototype
  • But you're probably gonna want to move to Scala as a programming language
  • Scala is what Spark itself is written in
  • Scala gives you much faster, reliable and uses less resources
  • it's not very hard to move from Python to Scala


What is RDD?

  • Resilient Distrbuted Data
  • Spark 내부에서 일어나는 일을 추상화 한것
  • Spark는 job을 cluster내부에 고루 분산시키고, failure를 resilient manner로 해결
  • 내부에 일어나는 일은 추상화되어 사용자에게는 just looks like a data set


  • Created by your driver program
  • RDD가 작동하는 환경이면서 RDD creator
  • Spark shell은 "SC" 라는 오브젝트를 만듦

Creating RDD's

  • nums = sc.parallelize([1, 2, 3, 4])
  • textfile
    • sc.textFile("file://~" or "s3n://~" or "hdfs://~")
  • Hive context
    • hiveCtx = HiveContext(sc)
  • Can also create from
    • any databases connected to JDBC
      • Cassandra, HBase, Elastisearch
    • actual structure data files
      • JSON or CSV your sequence files or object files and all the different compressed formats

Transforming RDD

  • map : used when you have a one to one relationship
    • rdd = sc.parallelize([1, 2, 3, 4])
    • squaredRDD = rdd.map(lambda x: x*x)
    • map 함수에는 lamda function 말고 사용자가 정의한 함수를 넣어도 됨
  • flatmap : one to one이 아닐때
    • a different number of rows in the output
    • to discard some of the input lines
  • filter : rows 를 function으로 filtering
  • distinct : gives you back the distinct unique values in an RDD
  • sample : sample rows randomly
  • union, intersection, subtract, cartesian

RDD actions

  • collect : 분산되어 있는 RDD를 모아 Python object로 반환, 크기가 작을때만 사용
  • count : count rows
  • countByValue : RDD에 각각의 unique value가 얼마나 있는지 count
  • take(N) : top N개를 take (debugging)
  • top : top few rows of RDD (debugging)
  • reduce : 관련된 값을 combine해서 function 적용

Lazy evaluation

  • Nothing actually happens in your driver program until an action is called!
  • Action이 실행되기전에는 building up this graph this chain of dependencies within your driver script
  • When action is called, Does it actually figure out the quickest path through those dependencies


실습 코드(WorstMovie.py)

  • Hortworks sandbox 가 설치된 VM에 접속해서 spark-submit WorstMovie.py 해줘야함
  • spark-submit shell을 사용하면 spark 환경을 구성하고 코드를 클러스터 전체에 걸쳐 실행해줌

DataFrame & DataSet


  • DataFrame은 RDD를 더 구체화/구조화한 Object
  • DataFrame의 row object 들은 구조화된 데이터를 저장
  • DataFrame에는 name, type을 가지는 column을 가지고 있어 SQL 쿼리를 실행할 수 있다.
  • 즉 schmea를 통해 데이터를 더 효율적으로 저장/전송할 수 있고 SQL을 최적화해서 Spark를 더 빠르고 효율적으로 만들 수 있다.
  • 구조화된 데이터 양식(JSON, Hive database, Parquet files ...)을 읽거나 쓸 수 있다.
  • JDBC/ODBC 로 다른 데이터베이스, Tableau와 같은 다른 시스템과 소통할 수 있다.


  • Spark 2.0 부터 DataSet이라는 개념이 도입되었다.
  • DataFrame은 DataSet에 속하는 하나의 개념이며 그중 Row object이다.
  • Python은 동적 타입 언어이기 dataframe, dataset의 경계가 모호할 수 있다. (Python에서는 dataset을 사용할 수 없음)
  • dataset은 row object 외의 어떠한 종류의 정보도 담을 수 있다.
  • dataset을 사용하면 compile time에 error를 조기에 발견할 수 있다.
  • encourages you to use SQL queries within your scripts that actually allow further optimizations.(Catalyst Optimizer)
  • 그래서 Java, Scala 에서는 dataset이라는 개념이 중요하게 여겨진다.
  • Spark 2.0의 MLlib, SparkStreaming 등은 dataset based API를 사용한다.


  • You can create user defined functions that plug into a SQL
  • You can use within your SQL queries
  • that is the power of data frames and data sets in Spark 2.0 and SparkSQL

0개의 댓글