그림 발췌

https://blogs.msdn.microsoft.com/bigdatasupport/2015/09/14/understanding-sparks-sparkconf-sparkcontext-sqlcontext-and-hivecontext/ 

http://bigdatafindings.blogspot.kr/2015/08/some-key-points-about-spark-suffle.html


SparkContext?

- 스파크에서는 아래 그림과 같이 Driver ProgramWorker Node Executor 간의 통신이 발생한다. DriverExecutor에게 Task를 할당하게 된다. Executor에서는 Task를 수행하고 종료 시 Driver에게 결과 값을 주게 된다.

스파크를 실행하면SparkContext생성으로부터 시작이 된다앞선 예제들을 확인하면 알 수 있듯이, SC를 사용하여 RDD생성을 하였다.

(다만 앞선 예제에서는 로컬 내 실행 되었기 때문에위의 그림처럼 노드들에게 Task를 분산으로 나누지는 않았다..)


기본적인 SC 시작 방법

- SC(Spark Context) 초기화

- Local: 한 개의 스레드나 단일의 로컬머신에서 동작할 때따로 접속할 필요가 없음을 알려주는 값

- My App: Cluster에 접속할 경우, Cluster UI에서 My App이란 이름으로 어플리케이션을 구분할 수 있음

SparkContext(conf = conf): 최종 SparkContext를 sc변수로 할당



Reduce By Key vs Group By Key

- Reduce By Key: The reduce operation happens for each partition, and then the results will be shuffled.

- 같은 Node의 같은 Key값을 기준으로 값들을 미리 병합하여, 최종적으로 셔플링할, 부하를 줄여줌

- Group By Key: 모든 Pair 데이터들이 Key를 기준으로 셔플링이 이루어지는데, 이는 많은 부하가 발생할 수 있음


밑에 그림을 보면 이해하기 쉬운데,  RBK의 경우 미리 노드에서 같은Key들에 대해 값을 미리 병합한 것을 확인할 수 있음






'기타 > 분산 컴퓨팅' 카테고리의 다른 글

Spark Accumulator  (0) 2017.04.07
Spark Data 불러오기/저장하기  (0) 2017.04.07
Spark Pair RDD 개념  (0) 2017.04.07
Spark RDD 개념 및 예제  (0) 2017.04.07
Apache Spark 설치  (0) 2017.04.07

본 내용은 러닝스파크 책에서 긁어옴


Pair RDD

- Sparkkey/value 쌍을 가지는 RDD에 의해 특수한 연산을 제공. RDDPair RDD라 부름

- Pair RDD들은 각 key에 대해 병렬로 처리하거나 Re Grouping할 때 유용


Pair RDD Transformation

- {(1,2),(3,4),(3,6)}


두 Pair RDD Transformation

- rdd1: (1,2),(3,4),(3,6)} rdd2: {(3,9)}


Pair RDD Actions

- {(1,2),(3,4),(3,6)}




'기타 > 분산 컴퓨팅' 카테고리의 다른 글

Spark Data 불러오기/저장하기  (0) 2017.04.07
SparkContext, Reduce/Group By Key  (0) 2017.04.07
Spark RDD 개념 및 예제  (0) 2017.04.07
Apache Spark 설치  (0) 2017.04.07
Apache Spark란 무엇인가?  (0) 2017.04.07
본 내용은 러닝스파크 책을 참고하였음.


RDD 개념

- RDD(Resilient Distributed Dataset)

- Resilient: Memory 내 데이터 손실 시, 다시 생성할 수 있음. , 유실된  파티션을 재연산해 복구 (탄력적)

- Distributed: Cluster를 통해 메모리에 분산되어 저장 (분산)

- Dataset: 파일을 통해 가져올 수 있음

- RDD는 스파크에서 기본적인 데이터 단위라고 볼 수 있다스파크에서의 모든 작업은 새로운 RDD를 만들거나, 존재하는 RDD를 변형하거나, 결과 계산을 위해 RDD에서 연산을 호출하는 것 중의 하나로 표현됨

- RDDLazy Execution!

- Action 함수의 실행 전까지는, 실제로 이벤트가 발생하지 않음

쉽게 말해서, RDD가 새로운 RDD를 만들었다고 가정했을 때(Transformation), 값들은 없는 빈 껍데기만 생성이 된다사슬처럼 RDD가 생성이 된다고 해도, 값은 없다.

Action 함수인 count를 했을 때, 비로소 RDD에 값이 들어가는 느긋한 실행?(ㅠㅠ) 방식으로 되어 있다.

그런데 이는 메모리에 값을 쓰고 있지 않기 때문에 성능면에서 상당히 좋은 방법이다.

만약 모든 라인을 로드해서 저장하면 얼마나 낭비겠는가!


RDD Function 종류

- Transformations: 존재하는 RDD에서 새로운 RDD 생성



- RDD의 데이터는 바꿀 수 없음

- map(function): RDD의 각 행별로 기능 수행(ex: 각 행의 abc가 포함되는 단어 Count하기)

- flatmap(function): RDD의 각 라인별 요소 단위로 매핑

(ex: 각 행들을 하나의 리스트로 통합 된다고 보면 쉬움(1,2,3-> 1행으로 통합))

- filter(function): 조건에 맞는 RDD의 행을 새로운 RDD로 생성(ex: 행의 길이가 x이상일 때 생성

- distinct(function): 중복 제거(ex:  행에 중복 문자열이 있을 경우 제거)

- {1,2,3,3} 의 값을 가진 RDD Transformation

- {1,2,3},{3,4,5} 두 RDD를 가진 Transformation



- Actions: 실제 수행하는 함수로, 값을 받아옴. 또는 외부 스토리지에 저장



(ex: reduce(RDD 값들을 병렬로 병합 연산), count, take(n) (n개의 리스트 반환) , collect(모든 데이터 반환)등)


- {1,2,3,3} RDD Actions



RDD 예제 (Local 에서 사용)


- RDD 예제 (Line 수 세기)

- 실제 104 라인으로 구성되어 있는 것을 확인할 수 있다

(spark 실행을 bin파일 내에서 실행하였기 때문에 상위 경로의 path 사용)

>>>lines = sc.textFile(“../README.md”)

lines이라는 RDD를 생성하면 연산이 즉시 수행되는 것이 아닌, 메타데이터에 요청이 들어왔다는 것만 기록해둠


그런데 때때로 동일한 RDD를 여러 번 사용하고 싶을 때도 있지 않을까

-> persist(), cache()있음. [차이점은 cache()persist()에서 저장 옵션을 MEMORY_ONLY로 한 옵션과 동일)

(저장 옵션: https://spark.apache.org/docs/latest/programming-guide.html#rd-persistence  참고)


>>>lines.count()

count() 라는 Action을 수행하면 비로소 아래와 같이 각 라인에 데이터가 채워지고 (Lazy Execution), 라인 수를

카운트 하게 된다.

 


앞서 설명한, take(5)의 경우 5라인까지만 출력되는 것을 확인할 수 있다.  


- RDD 예제 (필터링)


- RDD 예제 (RDD 제곱)


-RDD 예제(Word Count)

'기타 > 분산 컴퓨팅' 카테고리의 다른 글

SparkContext, Reduce/Group By Key  (0) 2017.04.07
Spark Pair RDD 개념  (0) 2017.04.07
Apache Spark 설치  (0) 2017.04.07
Apache Spark란 무엇인가?  (0) 2017.04.07
아파치 하둡 맵리듀스  (0) 2017.04.01

+ Recent posts