dev-writeup-2024 / september

개발 1주 1글 스터디
3 stars 0 forks source link

[09-11] Spark? 그거 쉐보레에서 나오는 차 이름 아니냐? #3

Open k-young-passionate opened 2 months ago

k-young-passionate commented 2 months ago

제가 자주 사용하는 Spark 라는 Framework를 소개해보았습니다. 이전 글들과는 다르게 사용해보시지 않으셨으면 조금 어려울 수도 있는 내용이 많습니다. 혹시나 관심있어서 들어오셨는데, 내용이 부실하여 이해가 잘 안되신다면 편하게 코멘트 부탁드립니다~ 피드백은 언제나 환영입니다. 👋

쉐보레 스파크 ~이거 아닙니다~ 출처: wikipedia

Spark란?

공식 정의

Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.

공식 사이트에서 설명한 내용입니다. 즉 cluster 환경에서 (single node도 지원) DE, DS, ML을 지원하기 위한 엔진으로 다양한 언어를 지원한다고 합니다.

분산 컴퓨팅 (혹은 멀티코어 컴퓨팅 등 다양한 무언가...) 을 경험해보신 분들은 얼마나 어려운 지 아실 겁니다. 병렬로 돌릴 수 있는 연산과 sync 후 처리해야하는 연산을 나누고, 이를 잘 배치하고, 또한 중간에 연산 실패 시 처리를 해야하고... 모든 연산을 병렬로 돌릴 수 있는 것이 아니기 때문에 속도 향상 보장도 어렵고, 알고리즘을 잘못 쓰면 single computing 과 큰 차이가 나지 않는 속도를 얻게 됩니다.

image 병렬 컴퓨팅에서의 성능 향상을 설명한 암달의 법칙 그래프 (출처: researchgate)

Spark는 병렬 컴퓨팅을 쉽게 해줍니다. (심지어 대강 짜도 optimization까지... 짱짱 🌟🌟🌟)

2024년 9월 기준 공식 지원하는 언어는 Java, Python, Scala, R, SQL 5가지인 것으로 보입니다.

image

지원하는 라이브러리

공식 사이트에서 Library 탭을 확인해보면 다음과 같은 것들을 지원한다고 합니다.

각각에 대해 간단히 소개해보겠습니다.

SQL and DataFrames

Spark는 DataFrame을 통해 여러 data 형태에 대한 동일한 접근 방식(API) 제공합니다. Data는 text, csv, tsv, orc, parquet(spark 지원 기본) 등 다양한 형태의 파일를 직접 읽는 방식부터, jdbc/odbc, hive, 등 여러 형태의 database 조회 library 를 통해 읽어올 수 있습니다. 이를 DataFrame 이라는 일관된 형태 (Java에서는 Dataset<Row>)로 제공하게 됩니다. 특히나 jdbc/obdc, hive 등 db를 조회하는 형태일 때는 sql을 통해 읽을 수 있습니다.

이렇게 읽은 data를 DataFrame 이 제공하는 함수들을 통해 가공할 수 있습니다. Hadoop의 MapReduce가 단순히 Map과 Reduce를 지원하는 것과 달리, spark는 조금 더 고차원의 함수를 만들어서 사용할 수 있습니다.

image 출처: devops.dev medium

Spark Connect

Spark 서버를 띄워놓고, Client가 해당 Spark 서버를 호출하여 원하는 api 를 호출하고, 이를 연산한 결과를 Client에게 돌려줍니다.

image 출처: Spark 공식 페이지

기존에 Hadoop Cluster 환경 기준에서 Spark 작업을 동작시킬 때에는, spark-submit을 통해 hdfs 정보, hive metastore 정보, driver / executor 관련 값, yarn 과 같은 Resource Manager (이하 RM)정보 등의 옵션을 일일이 설정하여, RM 에게 resource를 할당받아 동작시킵니다. (옵션 세팅 너무너무나 복잡합니다 ㅜㅜㅜ 하나라도 틀리면... 저도 알고싶지 않았습니다...) Spark Connect를 사용한다면 이러한 설정 지옥에서 벗어나 Spark 를 통한 동작만 정의하면 되니 편할 것으로 보입니다. 또한 더 다양한 언어를 사용할 수 있어 Spark 사용 시, 언어에 구애받지 않을 수 있다는 장점이 있습니다.

Spark Streaming

Spark Structured Streaming 이라고도 합니다. (과거에는 DStream이 있었으나 deprecated 되었습니다.) Spark 를 batch 성이 아닌, kafka 등 message broker와 연결하여 실시간으로 들어오는 데이터를 처리할 수 있도록 지원하는 library 입니다. 기존 Spark 와 동일한 API (DataFrame 등) 를 지원하여 Spark 에 익숙하다면 어렵지 않게 실시간 데이터 처리도 가능합니다.

image 출처: Databricks

Pandas on Spark

아무래도 Data 분석을 자주 하시던 분들이라면 Python에서 pandas를 자주 이용하실텐데요, Spark에서 Dataframe으로 읽어온 데이터를 pandas와 같은 형태로 사용할 수 있도록 지원해줍니다.

image 출처: boardinfinity

개인적인 생각으로는 spark 에서 지원하는 dataframe과 pandas가 지원하는 dataframe이 유사하여 가능하지 않나 싶기도 합니다.

아무래도 Spark 를 사용하는 환경이라면 경향상, 거대한 데이터를 읽기 때문에 매우 큰 메모리가 필요합니다. Pandas는 Single core만을 사용하기 때문에 연산도 느리고, memory 문제가 발생할 수 있는데요, Spark에서 지원하는 pandas에서는 병렬 컴퓨팅을 통해 연산을 하기 때문에 훨씬 많은 데이터를 빠르게 처리 가능합니다. 다만 100% 호환되는 것은 아니기 때문에 불편한 측면이 있을 수도 있다고 합니다.

DataFrame에서 toPandas() 라는 함수가 있는데요, 충분히 데이터 양을 적게 가공한 뒤, 이를 통해 pandas로 전환한 뒤에 사용하실 수도 있습니다.

MLlib

Spark는 Data Engineering 만을 위한 framework가 아닙니다. 분산 cluster 환경에서 Machine Learning을 위한 Library를 제공합니다. 대량의 데이터를 읽어서 가공 후 ML 을 하나의 Framework를 통해 돌릴 수 있습니다.

다양한 Cluster 환경에서 (Hadoop, K8S, PM, ...) 지원이 되며, 공식 문서상으로 다음과 같은 함수들이 지원이 된다고 합니다.

알고리즘

workflow

기타 유틸리티 함수들

GraphX

그래프 형태의 데이터를 처리하기 위한 Library 라고 합니다. 다음과 같은 알고리즘을 쉽게 실행시킬 수 있다고 합니다.

하둡 MapReduce와의 차이

하둡 MapReduce 또한 분산 클러스터 환경에서 큰 데이터를 읽고 처리하기 위해 만든 framework입니다. 기존의 MapReduce를 사용해보신 분들은 Spark가 MapReduce와 어떻게 다를지 궁금해 하실 것 같아 준비했습니다. 다음과 같은 차이가 있습니다.

항목 MapReduce Spark
연산 중간결과 처리 disk에 save 및 load memory 에서 연산 -> 빠름
지원 함수 Map, Reduce Map, Reduce, 그 외 다양한 함수들(dataframe 관련 함수들, sql, ...), custom 함수 제작 가능 (User-Defined Function)

정리 & 소회

Spark 가 무엇인지 소개하고, 어떠한 Library를 지원하는지, 그리고 Hadoop 의 MapReduce와 어떤 차이가 있는지 설명하였습니다. 소회로는 1. 예상 독자를 정하지 못하였고 2. Spark에서 어떤 내용을 소개할지 체계적으로 정하지 못하였고 3. Spark Library 중 생소한 Library 들이 있었기 때문에 글이 깔끔하지 못한 것 같아 아쉬운 점이 남습니다.

snaag commented 2 months ago

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 오늘 제목도 GPT가 만들어준건가여? 상당하군여 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ image

Hadoop, Spark 를 묶어서 같이 들어본 적이 있는 것 같았는데요, Hadoop 을 기반으로 Spark 를 사용하는 경우가 많은 것 이었군요!

Spark 에서 읽어 온 데이터를 Pandas 에서 바로 읽을 수 있는 것은 신기하군요!! 역시 데이터를 다루는 쪽이라 그런걸까요~

아직 질문을 드릴정도의 내공이 아니라 질문을 못드려서 아쉽습니다만... 글 보면서 찾아보면서 이것저것 알게되었습니다. 오늘도 좋은글 감사합니다! 👍🏻👍🏻

k-young-passionate commented 2 months ago

@snaag

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 오늘 제목도 GPT가 만들어준건가여? 상당하군여 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

이번엔 gpt 작명소 맘에 안들어서 제가 지었습니다 ㅎㅎ...

Hadoop, Spark 를 묶어서 같이 들어본 적이 있는 것 같았는데요, Hadoop 을 기반으로 Spark 를 사용하는 경우가 많은 것 이었군요!

네네, Spark가 다양한 곳에서 돌아가지만 hadoop 위에서 돌아가는 경우도 많습니다!

snaag commented 2 months ago

@k-young-passionate ㅋㅋㅋㅋㅋㅋ GPT 의 한계군여 ㅋㅋㅋㅋㅋ 그러고보니 Spark 가 Hadoop 외에도 다양한 환경에서 돌아간다는 내용을 오늘 공부했습니다 *_*

mingnuj commented 2 months ago

스파크는 다 좋은데 자바 기반이라 초기 실행이 좀 느린게 걸리더라고요.. 개인적으로 이런 류의 DB 중에는 PostgreSQL, DuckDB를 선호합니다. 잘 만들었어요.

k-young-passionate commented 2 months ago

@mingnuj 맞아요... 초기에 기다리는시간이 진짜 🙃🙃🙃 그래서 사실 배치잡 돌릴 때 빼곤 저는 trino 쓰게 되는거 같아요.

DuckDB는 새로들어봤네요...! 같이 봐보겠습니다 👍