계산 뒤 확인할 세 가지
- 누락: 빠진 주문이 없는가?
- 재실행: 다시 실행해도 같은 기준으로 계산하는가?
- 복구: 중단 후 처리를 재개할 수 있는가?
CHAPTER 01 · DATA ENGINEERING
주문표를 예로 데이터 처리 흐름, Spark의 역할, 결과 검증 방법을 배웁니다.
처음부터 읽기 교수님 강의자료
이 수업에서는 데이터를 처리하는 시스템을 만들고, 결과가 맞는지 직접 확인합니다.
주문 10건은 손으로 더할 수 있습니다. 주문이 계속 쌓이고 매일 마감 시각까지 계산해야 한다면, 저장 공간·메모리·처리 시간을 함께 고려해야 합니다.
책 1,000권의 오탈자를 조원에게 나눠 찾으면 빨라질 수 있지만, 배분과 연락에도 시간이 듭니다. 분산 처리에도 통신과 작업 조정 비용이 있습니다.
| 단어 | 처음 읽는 설명 | 이 수업에서의 예 |
|---|---|---|
| 프로세스 | 컴퓨터에서 현재 실행 중인 프로그램의 단위 | 데이터 계산을 수행하는 Spark 프로그램 |
| 서버 | 다른 프로그램의 요청을 받아 기능을 제공하는 프로그램 또는 컴퓨터 | 작업 자원을 관리하는 Spark Master |
| 클러스터 | 공동 작업을 위해 연결한 여러 실행 자원의 묶음 | Master와 두 Worker가 협력하는 실습 환경 |
| 분산 처리 | 데이터와 작업을 여러 실행 단위에 나누어 처리하는 방식 | 주문표를 나누어 부분 합계를 계산한 뒤 합치기 |
실습에서는 내 PC 안에 실행 환경을 분리하는 컨테이너를 여러 개 실행합니다. 컨테이너 간 통신을 관찰할 수 있지만, PC의 CPU·메모리 자체가 늘어나지는 않습니다.
컴퓨터를 늘려도 전체 속도를 제한하는 구간인 병목이 남을 수 있습니다. 실습에서는 작업을 나누어 실행하고, 어느 구간에서 느려지는지 관찰합니다.
아닙니다. 나눌 수 없는 작업, 데이터 전송 시간, 한쪽에 몰린 작업 때문에 기대만큼 빨라지지 않을 수 있습니다.
근거: 1장 슬라이드 1–2, 5 (파일 순서 기준). 기본 용어 설명과 조별 과제 비유는 학습용 보충입니다.
데이터 엔지니어링(Data Engineering, DE)은 데이터를 분석과 인공지능(AI)에 쓸 수 있도록 처리 흐름을 설계·구현·검증하는 일입니다.
“오늘 매출은 얼마인가?”에 답하려면 처음 생성된 기록인 원천 데이터를 가져와 정리하고 계산해야 합니다. 이렇게 연결된 처리 흐름이 데이터 파이프라인입니다.
각 단계를 선택해 역할을 확인하세요. 시각화는 학습용 모형입니다.
| 주문 번호 | 금액 | 기록 상태 |
|---|---|---|
| A001 | 10,000원 | 정상 |
| A002 | 20,000원 | 정상 |
| A002 | 20,000원 | 같은 주문의 재전송 |
쇼핑몰의 주문 기록 3행을 받습니다.
실제 업무에서도 중복 판단 기준을 먼저 정해야 합니다.
원본과 정리한 결과를 구분해 보관합니다. 오류가 생기면 원본으로 다시 계산할 수 있습니다.
날짜별 매출표를 분석가나 서비스에 전달합니다. 어떤 주문을 포함했는지도 설명할 수 있어야 합니다.
이 절의 내용을 합성 주문 5행 정리 실습에서 확인할 수 있습니다. 입력 CSV, Python 전체 코드, 예상 결과로 중복·충돌·재실행을 확인합니다. Python 표준 라이브러리만 사용합니다.
근거: 1장 슬라이드 2–3. 주문표와 계산 결과는 학습용 예제이며 실제 실행 결과가 아닙니다.
무엇을 계산하는지, 어디에서 실행되는지, 데이터가 늘어도 처리할 수 있는지 확인합니다.
함께 요리할 때는 조리뿐 아니라 역할 배분·품질 유지·완성품 확인도 필요합니다. 데이터 시스템에서도 아래 네 역량을 함께 익힙니다.
“어떤 입력으로 어떤 출력을 만들까?”를 코드로 표현합니다.
계산이 어느 실행 자원에서 수행되는지 확인합니다.
코드 한 줄이 여러 실행 자원에 나뉘어 처리될 수 있습니다.
주문이 100배 늘어도 처리할 수 있는지, 다시 실행해도 요구한 결과가 나오는지 확인합니다.
AI가 만든 코드도 개발자가 검증하고 채택 이유를 설명해야 합니다.
| 단어 | 실제 역할 | 조별 계산에 빗대면 |
|---|---|---|
| Driver | 애플리케이션의 실행을 조정하는 프로세스 | 계산 계획을 세우고 결과를 받는 조장 |
| Executor | 데이터 처리 작업을 수행하는 프로세스 | 배정된 계산을 수행하는 조원 |
| Partition | 나누어 처리할 데이터 조각 | 각자 맡은 문제 묶음 |
| Shuffle | 다음 계산에 필요한 기준으로 데이터를 실행 자원 사이에 재분배하는 과정 | 담당 기준이 바뀌어 문제지를 다시 나누기 |
두 역할의 관계는 2장에서 실습합니다.
explain()으로 계획을 살펴볼 수 있습니다.관련 기술로 Hadoop·HDFS·MapReduce가 있습니다.
이 절에서는 각 기술의 역할만 소개합니다.
아닙니다. Partition은 데이터 조각입니다. 하나의 실행 자원이 여러 조각을 차례로 처리할 수 있으므로, 데이터 조각 수와 컴퓨터 수는 다를 수 있습니다.
근거: 1장 슬라이드 4–5, 10. 용어 설명과 비유는 학습용 보충입니다.
학기 학습 순서는 Spark 실행 이해 → 저장·실시간 처리 연결 → 전체 파이프라인 검증입니다. 주차별 강의 범위는 아래 표와 같습니다.
가게에서 주문을 정리한 뒤 창고·배송을 연결하고, 주문이 제대로 전달되는지 확인하는 과정과 비슷합니다.
| 주차 | 강의 범위 | 처음 배우는 학생의 질문 |
|---|---|---|
| 1–7주 | Spark 실행과 성능: 실습환경, DataFrame, SQL, Parquet, Shuffle, Spark UI, 성능 조정 | 표를 어떻게 처리하고, 어디에서 느려지는지 어떻게 알까? |
| 8주 | 중간시험 | 배운 계산과 실행 구조를 내 말로 설명할 수 있을까? |
| 9–13주 | Lakehouse와 Streaming: Iceberg, Kafka, Structured Streaming, Window | 데이터를 관리하면서 계속 들어오는 기록을 어떻게 처리할까? |
| 14주 | 통합 Data Engineering: 전체 파이프라인, 데이터 품질, 장애 복구, AI를 활용한 구현 | 처음부터 끝까지 이어지는 시스템을 어떻게 검증할까? |
| 15주 | 기말시험 | 설계·구현·검증의 선택을 설명할 수 있을까? |
Docker 환경에서 분산 실행을 확인하고, DataFrame과 SQL로 주문 데이터를 정제·집계합니다. Lakehouse와 Streaming은 그다음에 연결할 주제입니다.
| 이름 | 우선 알아둘 뜻 |
|---|---|
| CSV | 쉼표 등 구분자로 열을 나눈 텍스트 파일 형식 |
| Parquet | 열을 중심으로 데이터를 저장하는 분석용 파일 형식 |
| Lakehouse | 데이터 레이크에 분석용 테이블 관리 기능을 결합하는 접근 |
| Iceberg | 데이터 파일을 분석용 테이블로 관리하는 테이블 형식 |
| REST Catalog | 웹 요청 방식의 인터페이스로 테이블의 위치와 관리 정보를 제공하는 서비스 |
| MinIO | 데이터 파일을 객체 단위로 보관하는 저장 서비스 |
| Kafka | 계속 발생하는 이벤트 기록을 받아 보관하고 전달하는 플랫폼 |
| Structured Streaming | Spark에서 계속 들어오는 데이터를 표 기반 연산으로 처리하는 기능 |
| Window | 예를 들어 “5분 동안”처럼 기록을 묶어 계산하는 구간 |
강의 계획의 CSV → Parquet → Iceberg → Kafka/Streaming은 학습 범위를 넓혀 가는 순서를 나타냅니다. CSV·Parquet은 파일 형식, Iceberg는 테이블 형식, Kafka는 이벤트 플랫폼입니다.
아닙니다. 학기 전반은 Compose로 Spark Master·Worker·Client를 구성합니다. Kafka와 Iceberg 관련 서비스는 강의 계획에서 학기 후반에 추가하는 범위입니다.
근거: 1장 슬라이드 6–7.
친구의 PC에서는 되는데 내 PC에서는 안 된다면, 코드를 보기 전에 실행 환경이 같은지 확인해야 합니다.
재현 가능한 환경은 같은 설정으로 다시 실행할 수 있게 구성한 환경입니다.
수업에서는 Windows PC의 Docker Desktop과 WSL2로 실습 환경을 구성합니다.
실험 재료와 조립 설명서를 맞추듯, 이미지와 설정 파일로 시작 조건을 맞춥니다. PC 자원·네트워크는 다를 수 있어 실행 결과는 별도로 확인해야 합니다.
| 용어 | 의미 | 우리 실습에서의 역할 |
|---|---|---|
| Image · 이미지 | 프로그램과 필요한 실행 파일을 담은 환경의 틀 | 정해진 Spark 버전으로 시작 |
| Container · 컨테이너 | 이미지를 바탕으로 만든 실행 환경 | Master, Worker 2개, Client를 별도로 실행 |
| Volume · 볼륨 / 파일 연결 | 컨테이너 밖의 데이터를 안에서 사용할 수 있게 연결하는 저장 장치·경로 설정 | 배포 실습은 PC의 apps 폴더를 컨테이너 경로에 연결하는 바인드 마운트 사용 |
| Network · 네트워크 | 프로그램들이 서로 통신할 수 있는 연결 | 컨테이너끼리 서비스 이름으로 통신 |
| Port · 포트 | 한 주소에서 특정 서비스로 연결하기 위한 번호 | PC 브라우저에서 Spark 관리 화면에 접속 |
| Compose | 여러 서비스의 실행 설정을 파일로 정의하고 함께 관리하는 도구 | compose.yaml로 실습 전체 구성 |
이미지의 버전·구성을 가리키는 이름이 태그입니다. 2장 배포 파일의 값은 spark:4.1.3-scala2.13-java21-python3-ubuntu이며, 실습 때 이 값을 기준으로 맞춥니다.
up: 구성에 따라 컨테이너를 생성하고 시작합니다.ps: 상태를 확인합니다.logs: 실행 기록을 확인합니다.exec: 실행 중인 컨테이너 안에서 명령을 수행합니다.stop: 기존 컨테이너를 정지합니다.start: 정지한 기존 컨테이너를 다시 시작합니다.down: Compose가 만든 컨테이너와 네트워크를 정리합니다.실제 명령 순서와 실행 위치는 2장에서 안내합니다.
이미지와 서비스 상태를 확인한 뒤, 통신과 작은 계산이 정상적으로 수행되는지 확인합니다.
근거: 1장 슬라이드 7–8, 16. 이미지와 파일 연결은 배포 compose.yaml 설정을 따르며, 16번 슬라이드의 설치·실행 방법은 2장에서 다룹니다.
AI는 코드·테스트 초안과 오류 분석을 돕습니다. 정확성·확장성·성능을 확인하고 선택의 이유를 설명하는 일은 개발자의 책임입니다.
계산기에 중복 주문을 입력하면 계산은 맞아도 매출은 틀립니다. AI 코드도 입력과 계산 기준이 맞는지 사람이 검산해야 합니다.
“1부터 100까지의 정수를 각각 한 번 더한다. 입력 열은 정수형 id, 기대 결과는 5,050이다.”처럼 입력과 결과를 구체화합니다.
범위의 끝값이 포함되는지, 모든 데이터를 한곳에 모으는지, 잘못된 입력을 어떻게 처리하는지 확인합니다.
작은 입력의 정답과 비교하고, Spark UI와 실행계획에서 실제 실행을 봅니다. 작은 예제 성공이 100배 규모의 성능을 보장하지는 않습니다.
spark가 준비된 PySpark 환경. PowerShell용 명령이 아닙니다.spark라는 이름을 사용합니다.df = spark.range(1, 101, 1, 4)
rows = df.collect()
total = sum(row["id"] for row in rows)
print(total)range(1, 101, 1, 4): 1부터 100까지 1씩 증가하는 값을 4개 Partition으로 구성합니다. 끝값 101은 포함하지 않습니다.collect(): 모든 행을 Driver로 가져옵니다.sum: 가져온 값을 Driver의 Python에서 더합니다.확인할 점: 원본이 커지면 모든 행이 Driver 메모리에 모이는 구조가 문제가 될 수 있습니다.
from pyspark.sql import functions as F
df = spark.range(1, 101, 1, 4)
result = df.agg(F.sum("id").alias("total"))
row = result.first()
print(row["total"])agg: 집계 연산을 표현합니다.F.sum("id"): id 열을 합산합니다.alias("total"): 결과 열 이름을 total로 붙입니다.first(): 결과의 첫 행을 Driver로 가져옵니다. 이 예제는 그룹 없이 전체 합계를 계산하므로 결과가 한 행입니다.확인할 점: Driver는 합계 한 행을 받습니다. 집계 단계와 데이터 이동은 실행계획에서 확인합니다.
두 코드의 예상값은 100 × 101 ÷ 2 = 5,050입니다. 손계산한 예상값이며 실제 Spark 실행 결과가 아닙니다.
agg는 집계를 표현합니다.first()는 결과를 요청하며, A의 collect()도 Action입니다.Spark 코드에서 연산을 정의하는 시점과 실제 계산이 실행되는 시점을 구분해야 합니다.
작은 결과를 의도적으로 가져올 때는 사용할 수 있습니다. 기준은 “몇 행, 몇 바이트가 Driver에 모이는가?”입니다.
toPandas()도 데이터를 Driver의 pandas 표로 가져옵니다.근거: 1장 슬라이드 9–10, 14. 코드 비교는 학습용 보충 예제이며, 제공 실습의 1–100 합계 예제는 first_app.py에서 확인할 수 있습니다.
파이프라인의 설계 이유와 결과를 확인한 방법을 설명할 수 있어야 합니다.
강의의 채용 자료에는 Python·SQL, 대용량 처리, 저장 구조, 운영·협업 역량이 나옵니다. 수업에서는 파이프라인을 구현하고 오류의 원인을 찾아 설명하는 연습을 합니다.
수리에는 고장 찾기 → 공구 선택 → 수리 → 작동 확인이 필요합니다. 데이터 처리 도구도 해결할 문제에 맞춰 선택하고 결과를 확인합니다.
슬라이드 11은 2026년 9월 기준 채용공고 분석, 12–13은 수요·임금 참고 자료, 14는 AI 생산성 조사입니다. 강의 당시의 참고 자료이며, 국내 임금은 추정값으로 표시되어 있습니다.
통계를 읽을 때는 조사 시점과 표본을 확인해야 합니다.
2장에서는 PC → Docker 컨테이너 → Spark 역할의 관계를 배우고, 제공 실습을 실행해 상태·통신·계산 결과를 확인합니다.
근거: 1장 슬라이드 11–15 및 슬라이드 2의 강의 목표.