분산 데이터 아키텍쳐
- MPP(Massive Parallel Processing)
- 초기의 분산 데이터 아키텍쳐
- 여러대의 머신에 DB를 두어 데이터를 분산처리하고자 함
- 결국에는 데이터를 중앙에서 취합해야하고 Join과 같은 연산을 수행하게되면 머신끼리 네트워킹을 해야해서 비쌈
- Teradata, GP, Exadata
- HDFS(Hadoop File System)
- GFS을 바탕으로 만들어진 시스템
- MapReduce를 통해 대량의 데이터를 처리
- MapReduce는 굉장히 단순하기때문에 복잡한 비지니스에 쓰기에 부적합함
- Hive를 통해 SQL 쿼리를 MapReduce로 변환해서 처리하는 것이 가능해짐
- Spark
- In-memory 기반 데이터 처리 툴
- disk I/O가 발생하는 MapReduce에 비해 빠르다.
- DAG 기반의 실행 최적화(RDBMS의 실행최적화와 유사)
- RDD, DF, SQL 기반의 데이터 처리 추상화
- S/W 라이센스 비용 없이 데이터 처리를 할 수 있는 가성비가 뛰어난 솔루션
- 10TB 이상의 시스템은 Spark을 고려해볼만함
Spark에 대한 오해
1. Spark은 In-memory 특화 기능을 가지고 있다?
- Spark의 in-memory처리는 SimD, DB에서의 join최적화와 같은 레벨이 아닌 caching에 가깝다.
2. Spark은 Hadoop보다 100배 빠르다?
- Spark은 Lazy operation이나 in-memory 저장기능을 통해 Hadoop보다 특정 상황에서는 100배 빠를 수 있음.
- 하지만 DAG 기반의 실행 최적화가 필요하지 않은 단순한 작업이나 모든 데이터가 in-memory에 담기지 못하는 상황에서는 빠르기는 하지만 그렇게까지 빠르지는 않다.
3. Spark은 데이터 프로세싱에 있어서 혁신적인 기술이다?
- Spark은 MPP를 계승하고자 하는 부분이 큼
Spark
Architecture
- Cluster Manager: job을 균등하게 Worker Node에 뿌려줌
- Worker Node: 일반적으로 하드웨어 단위이며 보통 core수만큼의 Executor를 가짐
- Executor: Job을 다시 Task단위로 세부적으로 쪼개서 실행
Data
- RDD(Resilient Distributed Dataset)
- Spark의 저수준의 데이터 추상화
- 한번 생성되면 변경되지 않는(Immutable) 분산 데이터 집합
- DataFrame
- 행과 열로 구성된 2차원 데이터 구조
- SQL과 호환을 염두해둔 데이터구조(Hive의 영향을 많이 받음)
- Pandas의 DataFrame과는 생김새만 비슷하지 내부 구성은 완전히 다름
- RDD보다 훨씬 편리하며 내부적으로 실행계획을 최적화해줌
- RDD를 사용하게되면 Scala를 사용하는 것이 성능에 많은 영향을 줌. 하지만 DataFrame을 사용하게되면 Scala를 사용하지 않아도 성능상에 큰 차이가 없음
- SQL 대비 DataFrame의 장점
- Spark Component들과의 interface제공
- Loop 기반에서 보다 쉬운 데이터 처리
- 보다 쉬운 컬럼명/값 변경
- 사용자 정의 함수의 손쉬운 실행
Pandas vs Spark (DataFrame)
- Pandas
numpy 의 ndarray를 기반
으로 2차원 Tabular 데이터 분석에 용이함
- numpy 의 API와 높은 호환성을 가짐
- numpy의 SimD 프로세싱으로 매우빠른 처리
- SimD(Single Instruction Multiple Data)
- 하나의 명령어로 여러개의 값을 동시에 계산하는 방식
- 벡터프로세싱에 많이 사용되며 게임, CG, HPC 등 다양한 분야에서 활용
- 인텔 CPU에서는 4, 8, 16 등의 단위 벡터 기반의 SIMD 연산 수행
- 병렬 CPU 처리가 안되고 단일 서버 메모리 용량 이상 데이터를 처리할 수 없음
- Spark
Java Object
로 만들어진 RDD기반
- SQL과 유사한 연산을 지원하는 API 구성
- 병렬 CPU 처리 및 분산 서버 데이터 처리 가능
- 분산 서버 처리가 가능하므로 서버를 Scale out 하여 대용량 데이터의 메모리 처리 가능
- Spark DataFrame API 주요 특징
- SQL연산과 비슷한 연산자 제공
- Spark DF의 연산은 새로은 DF를 반환하는 형태. inplace 옵션이 존재하지 않음(Immutable)
- Spark DF는
[]
대신 withColumns()
를 통해 컬럼의 값을 가져옴
- Spark DF는 여러 컬럼에 접근할때
[]
를 사용하지 않음
- pandas_df.drop(['컬럼1', '컬럼2'])
- spark_df.drop('컬럼1', '컬럼2')
좋은 글 감사합니다.