분석하고싶은코코

PySpark - Session&Context&RDD 본문

Python/PySpark

PySpark - Session&Context&RDD

코코로코코 2023. 11. 9. 21:17
반응형

PySpark에 대해서 공부하다보니 생각보다 앞선 글에서 작성한 PySpark기본에서 너무 가볍게 다뤘다는 생각이 들었습니다. 그래서 좀 더 PySpark에 대해서 자세히 다뤄보고 정리해보기 위해서 PySpark에 대한 페이지를 만들고 Spark에 대한 내용들을 하나씩 포스팅 해보려 합니다.

 


PySpark를 왜 사용할까?

RDD에 대해서 자세히 다뤄보기 이전에 왜 Spark를 사용할까에 대한 부분을 다시 짚고 넘어가보겠습니다. 이 부분은 이전에 작성했던 포스팅에서 언급한 Apache Spark의 등장배경이랑 비슷합니다. 그런데 이번의 핵심은 기존의 하둡 시스템의 한계점을 극복하기 위한 아파치의 등장이 아닌 기존의 Python의 처리방식과 Apache Spark의 처리방식에 차이가 있고 데이터가 커질수록 Python에서는 처리하기 난감한 큰 용량의 데이터를 Spark를 통해 100배 그 이상으로 빠르게 처리가 가능하다는 데 있습니다.

 

SparkContext?

Spark2.0이전에는 SparkContext는 Spark에서 사용하는 Context의 집합점입니다. Session이 등장하기 전에 SparkContext를 통해 클러스터 및 모든 스파크 기능을 사용해야만 했습니다. SparkContext는 JVM하나당 하나만 할당이 가능합니다. 그래서 다른 SparkContext를 사용하고 싶다면 stop()메서드를 호출하여 Context를 멈추고 새로운 Context를 만들어 주어야만 합니다.

SparkSession?

SparkSession은 Spark를 사용하기 도구(?)입니다. 사용자가 직접 컨트롤하여 Spark를 작동시키기 위한 도구라고 생각하시면 될 것 같습니다. Python에서 SQL을 연결하여 사용할때 sql-connector랑 같은 느낌입니다. 그런데 SQL커넥터보다 더 많은 기능을 갖고 있고 사용할 수 있습니다. Session을 통해 RDD나 Spark DataFrame을 생성하는등 SparkSession은 스파크 응용 프로그램의 통합 진입점으로 스파크의 기능들과 구조들이 상호방식하는 방식을 제공하는 도구입니다.

 

 

SparkContext가 있는데 Session가 탄생한 이유는 다음과 같습니다.

  • 여러 컨텍스트들을 통합
  • 개발자가 다른 컨텍스트들을 생성하는 것에 대한 걱정을 피하기 위해서
  • 동일한 사용자가 같은 SparkContext를 사용하는 문제를 해결하기 위해서
    Spark2.0 이전에는 사용자당 스파크 컨텍스트를 생성 -> 비용 발생(context당 jvm이 하나)

PySpark RDD(Resilient Distributed Dataset)?

RDD는 PySaprk에서 데이터를 사용할떄의 근본이되는 데이터(fundamental building block) 형태(?) 입니다. RDD는 내결함성과 불변성을 가진 object입니다. 불변성이란 한 번 정의된 RDD는 수정이 불가능합니다. RDD의 데이터는 분산처리를 위해 클러스가 관리하는 각 노드들에서 병렬처리될 수 있는 형태로 분리되어 있습니다. RDD의 형태는 Python의 List와 비슷한 형태를 갖고 있다고 합니다. 가장 큰 차이점은 Python에서는 하나의 프로세스로 처리되지만 PySpark의 RDD는 클러스터가 관리하는 각 노드에 분산되어 있기 때문에 병렬적 처리가 가능하다는데 있습니다. 즉, RDD는 PySpark에서 처리하는 병렬 처리 방식을 위해 만들어진 분산형 데이터셋이라고 생각하시면 됩니다. 이러한 RDD의 이점은 다음과 같습니다.

  • In-Memory_Processing
    PySaprk는 데이터 메모리에서 처리하고 이를 메모리에 저장해두는데 이것이 Map-Reduce(I/O)처리 방식으로 캐시를 사용하여 이전에 계산했던 값을 다시 사용하는 것이 가장 큰 차이점이라 합니다. 
  • Immutability
    한번 생성한 RDD는 불변합니다. 따라서 생선된 RDD로 무언가를 작업한다면 새로운 RDD를 생성하는 것과 같습니다.
  • Fault-Tolerance
    RDD의 내결함성으로 인해 작업이 멈추거나 실패하더라도 다른 파티션에서 데이터를 reload하여 작업을 진행할 수 있습니다.
  • Lazy Evolution
    RDD에 대한 변형이 일어날때 평가 바로 평가하지 않고 무언가 문제가 발생(DAG)하거나 RDD에 대한 작업을 시작할때 모든 변환에 대한 평가를 진행합니다.(이 부분이 잘 이해가지 않았지만 아마 RDD를 변환시키는 작업을 진행할때 그 순간 평가하는게 아니라 첫 동작을 실행할때 모든 변환과정에 대한 검사를 진행하는 것으로 보입니다.)
  • Partitioning
    RDD를 생성할때 클러스터는 사용할 수 있는 코어수 만큼 데이터를 분할하여 관리합니다.

 

RDD를 알아야하는 이유는 Spark에서 DataFrame형태로 데이터를 처리할 수는 있지만 Spark에서 함수나 여러가지 기능들에 대한 처리는 DataFrame형태로 처리되지 않고 RDD로 변환하여 적용하고 다시 DataFrame으로 변환하는 작업들을 하게 됩니다. 그래서 RDD에 대한 개념을 알고 가는 것이 중요합니다. 예시로는 Python에서 apply 및 lambda를 이용해 DataFrame을 컨트롤 할 수 있었습니다. 그런데 Spark에서는 DataFrame이 Pandas와 다릅니다. 그래서 apply, lambda 기능을 사용할 수 없고 RDD를 통해 작업을 진행하고 .toDF를 통해 Spark의 DataFrame으로 변환시켜주는 작업을 하게 됩니다. 이 과정은 다음 포스팅에서 Context,  Session, RDD, Spark-DataFrame을 직접 핸들링해보겠습니다.


아래 두 사이트에서 제공해주는 PySpark 튜토리얼, 사용법에 대한 내용을 바탕으로 진행하였습니다.

https://spark.apache.org/

https://sparkbyexamples.com/ 

반응형

'Python > PySpark' 카테고리의 다른 글

PySpark - 빅데이터 분산 시스템  (0) 2023.11.07