본문 바로가기

IT/Spark12

Spark - Spark SQL 이전에도 알아보았지만 구조화된 데이터는 비구조화, 반구조화 데이터보다 확실히 데이터를 분석, 처리하기에 좀 더 효율적이다. 때문에 RDB와 같은 관계형 데이터베이스를 많이 선택하는 편이다. 그렇다면 Spark는?? 일반적인 방법은 Spark pipeline에서 직접 데이터베이스에 Connection을 맺고 사용하는 것이다. 그러나 매우 비효율적이다. (데이터베이스 Connection 관리를 추가적으로 해야하는 등 배보다 배꼽이 커질수도..)Spark Stack근데 다행하게(?) Spark에서는 Spark Stack 중 Spark SQL을 지원한다. Spark에서 SQL을 도입한 이유는 여러가지가 있겠지만 SQL를 컴포넌트의 하나로 구성하면서 사용자가 얻을 수 있는 장점은 아래와 같다.1) RDB 와 같은.. 2020. 2. 8.
Spark - Structured Data 위의 그림에서 언급하고 있는 스펙트럼을 보면, Structured, Semi-Structured, Unstructured를 차이를 대략 알 수 있다. 한국말로 풀이해보면 구조화, 반구조화, 비구조화로 구분할 수 있는데 왜 갑자기 이와 같은 것을 언급하는 것일까? 이제까지 다룬 RDD는 구조화된 데이터가 아니다. 구조화된 데이터라면 작업이 될 때, 데이터 구조가 어떤 식으로 변하는지 혹은 데이터가 어떻게 변경되었는지 알 수 있어야하는데 이미 알다시피 RDD의 작업은 결과를 알기 전까지 내부를 알 수가 없다. 물론, RDD[클래스 이름]과 같이 사용하면서 대략적으로 데이터 구조는 파악 할 수 있지만, 역시나 내부 데이터를 알 수가 없다.(일반 자료형을 사용하는 RDD는 Regular RDD, 클래스를 사용하.. 2020. 2. 6.
Spark - RDD Dependency RDD의 내부 구성을 잠깐 생각해보자. RDD는 Spark에서 추상화 데이터 모델이다. 때문에 분산 처리된 데이터의 집합이기도 하다.그러므로 위와 같이 표현될 수 있다. 즉, RDD는 각 노드의 파티션에 분산되어 있다. (예를 들어, groupByKey 메소드의 결과는 Shuffling된 Pair RDD가 될 것이며, Pair RDD는 각 노드의 파티션에 골고루 분산되어 있다.) 여기서 Lineage에서 처럼 A -> B의 관계를 RDD -> RDD로 위의 그림을 좀 더 확장하면, 아래와 같다.사전에 작업된 RDD를 부모 RDD, 이를 바탕으로 작업된 RDD를 자식 RDD로 정의하며 자식 RDD를 만들게한 map 메소드를 Dependency라 한다.개념적으로 이제 짚고 넘어가는 것이긴한데, 그 동안 사용.. 2020. 2. 5.
Spark - Partitioning Spark에서 파티셔닝(Partitioning)은 RDD의 데이터를 여러개의 파티션에 나누는 것이다. 파티셔닝에 이해를 위해 간단한 예를 들어보자.val purchasesPerCost = purchasesRdd .map(p => (p.customerId, p.price)) .groupByKey()map에서 Pair RDD가 만들어진 후, groupByKey에 의해 RDD는 shuffling 된다.그런데 shuffling된 RDD는 어떤 노드에 전달될지 어떻게 결정하는 것일까?바로, p = k.hashCode() % numPartitions에 의해 p를 호스팅하는 노드에 전달된다. (Hash Partitioning 기법을 사용할 때) 이렇듯 파티셔닝을 통해 각 데이터들이 어떤 노드에 저장될지 결정된다.Sp.. 2020. 2. 4.