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
RDD
What is RDD?
- Resilient Distrbuted Data
- Spark 내부에서 일어나는 일을 추상화 한것
- Spark는 job을 cluster내부에 고루 분산시키고, failure를 resilient manner로 해결
- 내부에 일어나는 일은 추상화되어 사용자에게는 just looks like a data set
SparkContext
- 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
- 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
- DataFrame은 RDD를 더 구체화/구조화한 Object
- DataFrame의 row object 들은 구조화된 데이터를 저장
- DataFrame에는 name, type을 가지는 column을 가지고 있어 SQL 쿼리를 실행할 수 있다.
- 즉 schmea를 통해 데이터를 더 효율적으로 저장/전송할 수 있고 SQL을 최적화해서 Spark를 더 빠르고 효율적으로 만들 수 있다.
- 구조화된 데이터 양식(JSON, Hive database, Parquet files ...)을 읽거나 쓸 수 있다.
- JDBC/ODBC 로 다른 데이터베이스, Tableau와 같은 다른 시스템과 소통할 수 있다.
Datasets
- 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를 사용한다.
UDF
- 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