[Apache Spark] 아파치 스파크 요약

1. Apache Spark

- Big Data 분석 엔진이다.
- 메모리에서 수행 혹은 Disk에서 수행이 가능하다.
  - 기존 Map Reduce 보다 100배 빠르다.
  - 디스크보다 10배 더 빠르다.
- 배치프로세스 지원, 반복적인 분석이 가능하다.
- Python, Scala, Java 등 다양한 API를 지원한다.
- HDFS 프렌들리한 인터페이스
- Real-Time 프로세싱 지원(스톰과 유사하다)
- Graph Analytics, Machine Learning, SQL지원
- 형식화된 툴셋 지원
- 파이프라인 기반의 처리 지원

2. 스파크 구조

3. RDD (Resilient Distributed Dataset)

3.1 RDD란 ? 

- 스파크에 핵심 코어 데이터 셋
- 스파크에서 RDD를 위한 인터페이스 제공
- 2개의 RDD타입이 있음
  - Transformations
  - Actions
그림 설명 :
- 파티션된 객체의 참조를 가지고 있음
- 각 파티션 객체는 데이터의 subset을 참조한다.
- 파티션들은 클러스터 상의 각 노드에 할당되어 있다.
- 각 파티션은 기본적으로 RAM에 분리되어 존재하게 된다.

3.2 RDD의 활용

- Lineage (Required)
  - 각 HDFS블록당 파티션들의 셋이다. 
  - dependencies의 리스트이다. 
  - 각 파티션의 함수를 수행한다. 이는 HDFS 블록으로 부터 읽어들인 데이터이다. 

- Execution optimizations (Optional)
  - 파티셔너 (해시, 범위 등등..) 을 통해서 파티션을 수행함
  - NameNode로 부터 HDFS블록 위치가 선택이 되어 파티셔닝된다. 

3.3 파티션된 데이터셋의 처리과정

- 데이터셋은 파티션으로 분리된다. 
- 이 파티션들은 각 워커의 메모리에 저장이 된다. 

4. RDD 생성방법 

hdfsData = sc.textFile("hdfs://data.txt")

5. Spark에서 I/O 지원

- HDFS
- CSV, Tab-delimited, TXT
- JSON
- SequenceFile
- Hive
- JDBC
- HBase, S3, Cassandra

6. RDD Transformation

  - RDD의 서브셋을 의미한다. 
  - 새로운 RDD의 포인터를 반환한다. 



6.1 Single RDD Transformation

6.1.1 Filter 
  male1, male2, female1 --> female1
6.1.2 map :
2, 5, 6 --> 4, 25, 36
6.1.3 flatMap :
my name is ray --> my, name, is ray
6.1.4 distinct : 
apple, apple, banana --> apple, banana
6.1.5 sample :
apple, banana, guava --> banana, apple

6.2 Multiple RDD Transformation

Sample : 
A Set :
  apple, orange, banana
B Set :
  guava, banana, pear

6.2.1 Union :
  apple, orange, banana, guava, banana, pear
6.2.2 Intersection : 
banana
6.2.3 substract (A - B)
apple, orange
6.2.4 cartesian
(apple, guava), (apple, banana), ...
6.3 Pair RDD Transformation Example
Sample : myRDD
name : age
joe     : 12
sara   : 31
sara   : 40
juan   : 85
Example : groupBykey()
myRDD.groupByKey()
joe     : [12]
sara   : [31, 40]
juan   : [85]
6.3.1 pair RDD의 종류
6.3.1.1 reduceByKey
6.3.1.2 groupByKey
6.3.1.3 combineByKey
6.3.1.4 mapValues
6.3.1.5 flatMapValues
6.3.1.6 keys
6.3.1.7 values
6.3.1.8 substractByKey
6.3.1.9 join
6.3.1.10 rightOuterJoin
6.3.1.11 leftOuterJoin
6.3.1.12 cogroup
6.3.1.13 sortByKey

7. Laziness Concept

  - Lazy 실행 프레임워크를 지원하여 효과적으로 프로세스를 처리한다. 
  - 21세 이상되는 남자수를 카운트 하라고 하는 경우 스파크는 매우 스마트하게 동작한다. 
    모든 male 취합하고 21세 이상을 걸러낼 필요 없이 결과를 도출한다. 

8. RDD Actions

  - 계산식을 말한다. 
  - 결과를 다시  HDFS로 보내거나 드라이버로 보낼 수 있다. 


8.1 Common RDD Action
8.1.1 count
8.1.2 countByValue
8.1.3 collect
8.1.4 take(n)
8.1.5 reduce(func)
8.1.6 foreach(func)
8.1.7 saveAsTextFile

8.2 Common "Pair" RDD Action
8.2.1 countByKey
8.2.2 collectAsMap
8.2.3 lookup(key)

9. Persistence

  - 기본적으로 스파크는 액션이 호출되는 매번 RDD를 재 계산한다. (persist(), cache() 메소드를 호출하면 RDD를 메모리로 저장한다.)
  - RDD가 메모리에 캐시된 상태로 존재하거나 디스크에 저장 할 수 있다. 캐시된 RDD는 파티션 되어 있다. 
  - 정말 대단한 것은 동일한 RDD를 많이 계속해서 수행할 수 있다.

10. The Lineage Concept (혈통, 계보)

- RDD 장애에 대한 처리를 위한 대응 시스템이다. 
-  최종 ShuffledRDD는 2갈래 계보를 따라 생성된 것을 확인할 수 있다. 

11. Accumulator

-  MapReduce의 Counter와 유사하다.
- 글로벌 변수는 스파크 프로그램을 디버깅을 위해서 트래킹 할 수 있다. 
- Executors는 각각 커뮤니케이션 할 수 없기 때문에 이러한 Accumulator가 필요하다. 
- 즉, 글로벌 값을 말한다. 

12. Broadcast Variables

- MapReduce의 Distributed Cache와 유사하다. 
- 이는 워커 노드에게 읽기 전용의 변수값을 전달한다. 
- 룩업테이블, 딕셔너리 등을 위해 사용한다. 
- 즉, 다양한 노드들이 이 설정값 등을 읽을 수 있으면 이를 참조해서 계산에 이용될 수 있다. 

13. StatsCounter(통계 카운터)

- 프로세스를 마치고 나면 통계 카운터가 생성이 된다. 
13.1 count
13.2 mean
13.3 sum
13.4 min, max
13.5 variance
13.6 stddev

14. DataFrames

- 2015년 2월 부터 릴리즈된 API이다. 
- MySQL의 테이블과 유사함, R에서 DataFrame임
- 파이썬의 DataFrame는 Python RDD에 비해서 5배나 빠르다. 
- Hive, HDFS, MySQL, PostgreSQL, JSON, S3, Parquet, OpenStack...

15. YARN-based Architecture



16. Tuning with SparkConf

- Configures를 위한 클래스와 스파크 잡을 튜닝할 수 있는 클래스
- 키/밸류 쌍을 가진다.
- 드라이버 내에서 코드로 존재하거나 커맨드 라인으로 튜닝 가능

16.1 튜닝 예제 : 
cons = new SparkConf()
conf.set(“spark.executor.memory”, “1g”)
sc = SparkContext(conf)

17. MLib를 이용한 Machine Learning

- Native Machine Learning Framework
- Classification, Regression, Clustering
- Chi-Square, Correlation, Summary Stats
- Automatic Algorithm Parallelization
- Pipeline API (train --> test --> eval)

17.1 MLib Example
model = LinearRegressionWithSGC.train(data, iterations = 100, intercept = True)

18. Spark SQL

- Native SQL Interface to Spark
- Hive, DataFrame, JSON, RDD
- JDBC Server(B.I Interface)
- UDF(User Define Function)s (Spark SQL and Hive)
- Columnar storage, Predicated Pushdown, Tuning options

18.1 Spark SQL Example
hiveCtx = HiveContext(sc)
allData = hiveCtx.jsonFile(filein)
allData.registerTempTable(“customers”)
query1 = hiveCtx.sql(“SELECT last, first FROM customers ORDER BY last LIMIT 50”)

19. GraphX Example (PageRank)

- Native Graph Processing Framework
- Pregel, Giraph, GraphLab와 유사
- 네트워크 기반의 분석을 위해 설계됨
  - 트위터 Analysis
  - PageRank
- Spark보다 16배 빠름
- MapReduce보다 60배 빠름
- 표준 스파크의 RDD Transforms를 이요함

19.1 GraphX Example (PageRank)
graph = GraphLoader.edgeListFile(sc, “followers.txt”)
ranks = graph.pageRank(precision).vertices

20. Spark Streaming

- RealTime 분석 (Apache Storm과 유사)
- Shopping Cart추천 (아마존)
- Micro-Batch 아키텍쳐
- Windowing
- Fault tolerance를 위한 체크포인트

20.1 Spark Streaming Word Count예
lines = sac.socketTextStream(host, port)
words = lines.flatMap(lambda line: line.split(“ “))
pairs = words.map(lambda word: (word, 1))
wc = pairs.reduceByKey(lambada x, y: x + y)
wc.pprint()
ssc.start()
ssc.awaitTermination()

출처 : 
-- https://www.youtube.com/watch?v=rvDpBTV89AM

앞으로 공부해야할 사이트 :
-- http://backtobazics.com/big-data/spark/apache-spark-reducebykey-example/




Share this

Related Posts

Previous
Next Post »