데이터 엔지니어 분들의 이야기를 보면 회사마다 각기 다른 엔진, 서비스로 플랫폼을 구축하여 운영하고 어떤 제품이 가장 적합한지 PoC를 통해 도입하는 것 같다. 예전에 스타트업에서 인턴을 했을 때에도 Avo라는 로깅 + 모니터링 툴에 대해 데이터 엔지니어링 팀원분들과 PoC를 진행하고 실제로 도입했던 경험이 있다. 여러가지 데이터 인프라 구성요소 중에서 가장 흔하게 사용되고, 내가 현재 회사에서 사용하는 Databricks 플랫폼과 관련된 엔진들에 대해 정리해보았다.
Spark vs Hadoop
먼저 빅데이터를 관리하고 처리하는데 사용되는 오픈소스 프레임워크로 Spark와 Hadoop이 있다. 현재는 주로 Hadoop에서 Spark로 넘어온 패러다임이라고 한다.
Hadoop
Map Reduce 연산
Hadoop 은 대용량 데이터를 분산처리하기 위한 오픈소스 프레임워크이다. Hadoop 에서는 대용량 데이터를 처리하기 위해 Map Reduce라는 모델을 바탕으로 여러대의 노드들이 HDFS에 파일을 저장하고 데이터를 처리하도록 설계되었다.
Map Reduce 모델은, 말그대로 Map과 Reduce 연산이 두가지로 이루어진 간단한 구조이다. Map Reduce 작업이 시작되면 HDFS에서 파일을 읽어 들여오는 Disk I/O 연산이 일어난다. Map 과정에서 데이터를 Key-Value 형태로 매핑을 하고, 값을 반환한다. Shuffling 과정에서 연관된 데이터끼리 모은 후, 정렬연산이 일어난다. Reduce 과정에서는 앞에서 처리한 데이터에서 중복한 key 값을 가지는 데이터를 제거하고 추출한다. Map Reduce 작업이 모두 끝나면 HDFS에 파일이 쓰이는 write 작업이 수행된다.
간단한 연산 구조로 동작하지만, Hadoop 에서는 데이터를 처리하는 과정에서 HDFS에서 Disk I/O작업이 일어나야 하므로 성능 저하를 일으키게 된다. Disk I/O 의 성능 저하를 극복하기 위해 데이터를 In Memory 에 캐싱하는 방식의 Spark 가 등장했고, In Memory 에서 데이터를 캐싱하기 때문에 Hadoop 보다 10~100배 빠르게 데이터를 처리할 수 있다.
HDFS (Hadoop Distributed File System)
Block 과 Replication
HDFS(Hadoop Distributed File System)는 하둡 분산 파일 시스템으로, Hadoop 에서는 파일(데이터) 를 Block 단위로 관리하게 된다. 하나의 파일을 여러개의 Block으로 쪼개고 이 Block들을 여러 nodes 들에 분산하여 저장한다. default 값으로 하나의 Block은 128MB 사이즈를 가지게 된다.
HDFS에서 Block은 크기가 같아서 각 disk에 몇개가 존재하는지 파악하기 쉽다는 장점을 가진다. 또한 fault-tolerance를 위하여 Block 단위로 replication 를 구현하고 관리하는데 적절하다.
Namenode 와 Datanode
- Namenode : HDFS 파일시스템의 tree에 포함된 모든 파일과 디렉터리에 대한 메타데이터를 유지한다.
- Datanode : 파일 시스템에서 실제로 데이터를 저장하는 노드이다 블록에 대한 정보를 Name node에 report 한다.
Spark
Spark 의 핵심, RDD의 등장
Hadoop 의 Map Reduce 모델은 대용량 데이터 분석을 쉽게 만들어주었지만, 아쉬운점들이 있다는 것이다. ML이나 Graph 와 같은 복잡한 처리에 부족하고 HDFS에 데이터를 읽고 쓰는 연산을 반복해야 하므로 반복 작업을 하는 경우 성능 저하가 일어난다는 단점이 있다.
따라서 Disk 대신 가격이 저렴해지고 빠른 RAM을 사용하여 데이터를 처리해보자는 아이디어가 등장하게 되었는데, RAM은 '휘발성'이라는 특징때문에 장애가 일어나게 된다면 데이터가 유실될 것이라는 점이 있었다. 이러한 RAM의 특성에 최적화하여 fault-tolerant 하고 효율적인 방식으로 데이터를 처리하기 위해, RAM을 read-only 방식으로 사용하기 위해 등장한 것이 바로 RDD이다.
RDD란 Resilient Distributed Dataset 으로, 여기서 Resilient 라는 의미는 금방 쉽게 복원되는, 탄력적, 회복력있다라는 의미이다. RDD는 read-only 라는 특성을 가지고 있다. read-only 라는 특성을 가지고 있다는 의미는, 한번 'RDD 1' 가 생성되면 이 'RDD 1' 을 수정했을 때 'RDD 1 수정버전' 이 아니라 'RDD 2' 가 생성된다는 것이다.
또한 RDD 1 -> RDD2 이런식으로 생성되는 형태를 RDD Lineage, 즉 계보가 생긴다고 하며 이는 DAG (Directed Acyclic Graph)자료 구조로 생성된다.
Spark API 의 역사
RDD > DataFrame > DataSet 순서로 등장했으며, 초기에는 RDD와 같은 저수준 API 가 많이 사용되었지만 최신 버전에서는 DataFrame, DataSet과 같은 고수준 API 가 많이 사용되며 실제로 권장된다. Spark 가 지원하는 Scala, Java, Python 등의 언어에서 Spark API 를 호출하면, Spark Session들이 사용자의 코드를 Spark 코드로 변환해주어 실행된다.
Spark 와 HDFS의 연동
Standalone 는 하나의 노드에서 스파크를 운영하는 방식이다. YARN 리소스 매니저를 사용한 방식은 여러 노드, 즉 클러스터 구조에서 task 를 처리하게 된다. Spark In MR (SIMR)방식은 YARN 리소스 매니저를 아직 도입하지 않은 사용자들한테 적절하며, spark job 을 MapReduce 내부에서 처리하게 한다.
Hive
Hive는 배치 쿼리 엔진이다. 하둡 HDFS 위에서 데이터를 query 하기 위한 엔진이다. Hive는 'SQL Job'이 'Map Reduce Job' 으로 변환되서 실행되어 하둡에 있는 데이터를 읽어와서 처리하게 된다.
Hive의 가장 큰 장점은 MetaStore이다. Hive와 JDBC, ODBC 등으로 연결되어 있는 데이터베이스의 MetaData를 저장한다. 어떤 데이터를 가지고 있는지, 테이블과 파티셔닝에 대한 정보를 가지고 있다. 그리고 이 MetaStore를 Spark 에 연동하여 실제 작업은 Spark 엔진으로 처리하게 하여, 더 빠른 분산처리를 할 수 있다.
Hive Managed Table
Managed Table을 생성하면 파일이 default 위치에 저장된다. External Table 과는 다르게 관리 테이블 또는 파티션이 삭제되면 해당 테이블 또는 파티션과 연관된 데이터 및 메타 데이터가 삭제된다. /user/hive/warehouse/databasename.db/tablename/ 라는 HDFS의 hive warehouse 기본 위치에 테이블이 저장된다. Managed Table이 삭제되면 해당 테이블 또는 파티션과 연관된 실제 데이터 와 메타 데이터가 모두 삭제된다.
Hive External Table
이미 HDFS에 존재하는 원본 데이터를 기반으로 테이블을 만들기 때문에 스키마만 정해주면 된다.따라서 파일과 스키마를 따로 관리할 수 있다는 장점이 있다. External Table은 테이블이 삭제 되더라도 스키마만 삭제되며, 물리적으로 파일은 남아 있다.
참고한 자료
'Data Engineering' 카테고리의 다른 글
[TIL/240520] Data Engineering on Databricks (1) | 2024.05.20 |
---|---|
[LLM] OpenSearch 로 챗봇의 RAG 개발하기 (0) | 2023.12.10 |
[Apache Airflow] Airflow 설치하기 (0) | 2023.10.22 |
[Colab] 코랩 런타임 연결 끊김 방지하기 (0) | 2023.07.23 |
빅데이터로 성공하기 (서가명강 조성준 교수님 강의) 요약 (0) | 2023.04.02 |