일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 개체명 인식
- LDA
- 데이터넥스트레벨챌린지
- NLP
- 포아송분포
- 블루 아카이브
- 데이터리안
- 자연어 모델
- Optimizer
- 블루아카이브 토픽모델링
- geocoding
- 트위치
- 문맥을 반영한 토픽모델링
- 원신
- CTM
- 토픽 모델링
- 피파온라인 API
- 옵티마이저
- Roberta
- 클래스 분류
- 데벨챌
- 구글 스토어 리뷰
- KeyBert
- 붕괴 스타레일
- 코사인 유사도
- 다항분포
- SBERT
- Tableu
- 조축회
- BERTopic
- Today
- Total
분석하고싶은코코
PySpark - 빅데이터 분산 시스템 본문
최근 과제를 진행하면서 로컬에서 처리할 수 없는 큰 용량의 데이터를 처리하게 되는 경험을 하면서 Pysaprk에 대해서 알아 보게 되었습니다. 어떤 데이터를 다뤘는지는 이야기할 수 없지만 제가 문제에 부딪혔던 데이터의 형태는 대충 12만*9000의 행렬을 만들다 보니 메모리에 100GB가 넘는 데이터를 들고 있어야하는 상황이 발생하였습니다. ( 120,000 * 9000 / 8 / 1024 / 1024 = 약 128?)
사실 이렇게 큰 용량을 메모리상에 들고 있어야하는 분석을 진행해본적이 없었기 때문에 굉장히 당황했었습니다. Python과 데이터 분석을 공부하면서 Pyspark의 존재해 대해서 알고 있었지만 사실 대용량 데이터를 처리하는 모듈? API?라고만 존재에 대해서만 알고 있었기 때문에 이번 과제에서는 사용할 수 없었습니다. 그래서 이번 포스팅에서는 빅데이터 분산 시스템? 모듈? API? 서비스?로 알려진 PySpark에 대해서 알아보려 합니다.
PySpark?
PySpark를 알기에 앞서서 Apache Spark를 이해할 필요가 있습니다. 그런데 사실 Apache Spark를 이해하는게 PySaprk를 이해하는것과 다름이 없습니다. 왜냐하면 PySaprk는 Apache Spark를 사용하는 툴중에 하나가 Python이고 이를 PySaprk라고 하기 때문입니다.
Apcahe Spark는 빅데이터가 등장하면서부터 있던 개념은 아닙니다. 빅데이터가 등장하면서 분산 처리 시스템으로 가장 유명했던것은 하둡(Hadoop)입니다. 하둡은 HDFS(Hadoop Distributed File System)라고 불리는 분산형 파일 시스템을 기반으로 만들어졌습니다. 데이터 처리 시 , HDFS와 맵리듀스(Map-Reduce)의 대형 데이터셋 병렬 처리 방식에 의해 동작하였습니다.
그런데 이러한 하둡이 한계점에 부딪히는 상황들이 많이 발생했는데 그 상황은 빅데이터가 생각했던것보다 더욱 방대해지고 그로인해 실시간성이 확보할 수 없는 상황들이 발생했던 것입니다. 이러한 현상과 동시에 컴퓨터의 하드웨어들의 성능이 빠르게 상승하고 가격은 저렴해지는 상황이 발생하면서 고성능의 컴퓨터를 구축할 수 있는 상황이 갖춰진것입니다. 이 것이 Apcahe Spark의 등장 배경입니다.
그런데 Apcahe Spark는 하둡과 경쟁하지 않고 협력하는 구조가 되었고 하둡의 YARN 위에 Spark를 올려 사용하는 형태가 되어 실시간성이 중요한 데이터의 경우 Spark로 처리하는 구조가 되었다고 합니다. 아래 그림을 통해 보시면 알 수 있듯 Spark는 Scala, Python, Java, R 다양한 프로그래밍 툴에서 사용할 수 있습니다. 즉 Spark의 Core API중에서 Python을 통해 Spark를 작동시키는 것이 Pyspark입니다.
Spark의 작동 방식은?
앞서 Spark의 등장배경을 알아봤습니다. 그 중에서 핵심은 고성능의 컴퓨팅 자원의 등장과 가격인하로 인해 이러한 고성능 컴퓨터를 마련하는데 접근성이 크게 증가했다는 것입니다. 이것은 로컬(사용자 PC)에서 처리할 수 없는 큰 Task를 고성능 PC에게 보내서 처리하고 결과값만 로컬에 가져오는 방식이 Spark의 핵심작동원리입니다. 또한 Spark는 클러스터(서버)로 설정된 컴퓨터의 자원을 최대한 활용하는 방식으로 주어진 Task를 분산 처리를 진행합니다. 그래서 빅데이터를 빠르게 처리할 수 있는 것입니다.
멀티프로세싱(MultiProcessing)과 차이점은?
멀티프로세싱은 사용자가 로컬 자원을 활용해 작업을 병렬 처리하는 방식입니다. 예를들어서 Python에서 100만번의 반복 작업을 해야한다고 가정해보겠습니다. 이러한 작업을 단순하게 for문을 통해서 실행하게 되면 100만번을 하나씩 처리하게 됩니다. 그런데 멀티프로세싱을 사용한다면 가용할 수 있는 CPU의 코어를 설정해 동시에 처리할 수 있게 해줍니다. 대신 해당 데이터를 처리하는데 필요한 메모리가 확보가 되어야만 합니다. 즉 사용자의 코어가 8개일때 멀티프로세싱을 통해 코어 4개를 할당하고 작업을 진행시키면 25만번의 작업을 1개의 코어에게 작업으로 주게 되고 병렬적 처리를 하게 됩니다. 만약 하나의 작업을 진행하는데 3G의 메모리를 사용한다면 4개의 코어가 동시에 진행하기 위해서는 12G이상의 메모리가 확보되어야만합니다. 결국 Python의 내장 모듈인 멀티프로세싱만으로는 대용량 데이터를 처리, 분석하는데 한계점이 있을 수 밖에 없습니다.
Spark에서도 자원에 대한 문제가 발생할 수 있지만 해결이 가능한 문제입니다. Spark의 클러스터로 로컬로 지정하게 되면 큰 용량의 데이터를 처리하지 못하고 작은 혹은 전체 데이터중 일부의 데이터에 테스트가 가능합니다. 이후 로컬 세션의 연결을 종료하고 서버(고사양 PC)의 세션을 잡아 클러스터로 지정해 Task를 실행하면 되는 것입니다. 이런 부분에서 Python에서 기본적으로 제공해주는 멀티프로세싱(MultiProcessing)과 다른점이라고 할 수 있습니다.
반드시 PySpark를 사용해야할까?
솔직히 반드시는 아니지만 데이터를 다루다 보면 대용량 데이터를 마주하여 PySpark의 처리 방식이 혹은 실시간성이 필요한 순간이 많아질 것 같습니다. 하지만 어떤 데이터를 다루느냐에 따라서 PySpark의 처리방식이 필요할 수 있고 혹은 필요하지 않을 수 있습니다. 그래서 반드시라고 이야기하기는 조금 어렵긴하지만 데이터를 다룬다면 적어도 어떻게 사용하는지는 알고 있어야할 필요는 있다고 생각됩니다. 갑자기 대용량 데이터를 처리해야하는 상황이 생겼다고 비싼 돈을주고 컴퓨팅 자원을 업그레이드하는것도 쉽지 않고 컴퓨팅 자원의 한계로 못하겠습니다라고 말하는 것도 무책임하니까요.
Pyspark를 통해 처리할 수 있는건 데이터 분석, 처리 뿐만 아니라 머신러닝도 구현이 가능합니다. MLlib이라는 라이브러리를 지원해주고 있지만 Tensorflow/Pytorch를 통해 구현한 딥러닝 모델만큼 정교한 모델을 구현하기는 어렵습니다. 즉 머신러닝 수준에서는 충분히 구현히 가능하지만 딥러닝과 같은 복잡한 구조의 모델을 설계하는데는 아직 한계점이 존재합니다. 그래서 PySpark로 데이터 분석, 모델 설계를 전부 할 수는 없습니다. 그럼에도 PySpark를 사용해야하는 이유는 존재합니다. 딥러닝 모델에 들어가기 위한 데이터를 가공할때 대용량 데이터를 처리해야하고 혹은 실시간으로 들어오는 데이터를 모델에 넣어야하는 상황이 생긴다면 PySpark를 통해 모델의 Input데이터를 만들어내고 모델에 통과시켜 결과값을 받아낸다면 실시간성을 확보가 가능할 것입니다.
다음 포스팅에서는 PySpark를 통해 데이터를 다루는 과정을 다뤄보겠습니다. 물론 대용량은 아니고 그냥 일반적인 데이터로.... 내 맥북은 그렇게 좋지 않기 떄문에 흑....ㅠ
'Python > PySpark' 카테고리의 다른 글
PySpark - Session&Context&RDD (1) | 2023.11.09 |
---|