📚 SQL Struct: 데이터베이스가 책장처럼 생각하는 법을 배울 때

SQL Struct: 데이터베이스가 책장처럼 생각하는 법을 배울 때 데이터베이스를 거대한 도서관이라고 생각해보자. 지금까지 수십 년 동안, 우리는 전통적인 도서관 목록 시스템처럼 데이터를 정리해왔다. 모든 책의 정보를 각각 다른 카드에 적어서 별도의 서랍에 보관하는 방식 말이다. 제목 카드는 여기, 저자 카드는 저기, 출판연도는 또 다른 곳에. 이게 바로 데이터베이스에서 말하는 **정규화(normalization)**다. 그런데 만약 도서관이 책의 모든 정보를 하나의 똑똑한 봉투에 담을 수 있다면 어떨까? 제목, 저자, 출판 정보, 심지어 리뷰까지 모두 깔끔하게 한 곳에 모아둘 수 있다면? 이게 바로 현대 SQL 데이터베이스에서 struct가 해주는 일이다. ...

6월 17, 2025

Spark → Kafka → Postgres 파이프라인에서 UUID가 터트린 지뢰

Kafka와 Spark Structured Streaming을 이용해서 데이터 파이프라인을 구축하고 있었습니다. 완전히 컨테이너화된 시스템. 스택 구성은 이렇습니다: Kafka → 거래 데이터를 스트리밍으로 전송 Spark Structured Streaming → 실시간 처리 및 이상 거래 탐지 Postgres → 데이터 웨어하우스 모든 게 순조로웠습니다. 그런데 갑자기 등장한 한 놈. UUID 필드. 맞습니다 — UUID. 이제 어떤 일이 벌어졌는지 정확히 보여드릴게요. ✅ 원래 설계 Postgres 테이블을 이렇게 설계했죠: CREATE TABLE fact_transaction ( transaction_id UUID PRIMARY KEY, customer_id UUID REFERENCES dim_customer(customer_id), merchant_id UUID REFERENCES dim_merchant(merchant_id), ... ); Kafka는 UUID를 문자열로 직렬화해서 이벤트를 잘 뿌려주고 있었습니다 (JSON은 원래 UUID 타입이 없으니까요). ...

6월 7, 2025

🛡️ Spark Docker 스트리밍에서 Kerberos 사용자 인증 문제 해결

Spark, Kafka, Docker를 사용하여 실시간 스트리밍 파이프라인을 구축하던 중, Kerberos를 사용하지도 않았는데 Kerberos 인증과 관련된 Spark 오류가 발생했습니다. org.apache.hadoop.security.KerberosAuthException: failure to login: javax.security.auth.login.LoginException: java.lang.NullPointerException: invalid null input: name ❓ 문제가 발생한 원인은? 공식 apache/spark:3.5.0 Docker 이미지를 사용하고 있었습니다. Docker 내부의 Spark가 Hadoop의 기본 인증 메커니즘을 해결하려고 시도했습니다. Hadoop은 다음을 통해 현재 OS 사용자를 검색하려고 했습니다: UnixPrincipal(name) Docker 컨테이너 내부에서 앱이 적절한 사용자명 매핑이 없는 UID/GID로 실행되고 있었습니다. 이로 인해 다음과 같은 오류가 발생했습니다: invalid null input: name UnixPrincipal()이 null을 받았기 때문입니다. ...

6월 7, 2025

🫙 Spark Streaming의 마지막 장애물: 왜 --jars 만으로 Kafka가 안 될까

데이터 엔지니어로서 복잡한 분산 시스템을 구축하면서 마지막 장애물을 넘었을 때 느끼는 성취감은 정말 특별합니다. 오늘은 Apache Spark Structured Streaming + Kafka를 사용할 때 굉장히 답답한 문제를 공유하려고 합니다: 👉 바로 악명 높은 Failed to find data source: kafka 에러입니다. 🧨 문제: 모든 게 정상인데 Kafka만 안 된다 상황을 떠올려봅시다: Spark 클러스터 정상 구동 Postgres 연결도 문제 없음 Kafka에서 이벤트도 잘 발행됨 코드에서 .readStream.format("kafka") 호출 그런데 갑자기 다음과 같은 에러가 발생: ...

6월 7, 2025

🚀 핀테크 배치 데이터 파이프라인 구축기: AWS, Airflow, Spark

✨ 프로젝트 개요 핀테크 회사를 가정해, 카드사 데이터를 자동으로 집계 → 정제 → 분석하는 배치 파이프라인을 구축해보았다. 실제 데이터를 사용할 수는 없었기에 Faker를 활용해 가상의 거래 데이터를 생성했지만, 전체적인 데이터 흐름과 구조를 설계하는 데에는 충분하다고 생각된다. 🎯 목표 “Airflow를 활용해 현실적인 금융 데이터를 Spark로 처리하고, 저장 및 분석까지 가능한 자동화된 파이프라인을 만들어보자.” 단계 설명 작업 데이터 생성 원시 데이터 준비 Faker로 신용카드 거래 데이터 생성 데이터 수집 저장 위치로 이동 S3에 업로드 (raw) 데이터 처리 정제, 집계 PySpark로 지역별 거래금액 집계 데이터 저장 가공 후 저장 S3에 Parquet 저장 (processed) 데이터 분석 쿼리용 구조 구성 Athena로 테이블 생성 및 SQL 가능 자동화 반복 처리 가능하게 설정 Airflow로 DAG 작성 🔧 기술 스택 오케스트레이션: Apache Airflow 가상 데이터 생성: Python, Faker 데이터 처리: Apache Spark (PySpark) 데이터 저장: AWS S3 데이터 쿼리: AWS Athena 인프라: Docker, Terraform 🧩 아키텍처 구성 가상 데이터 생성 → S3 업로드 → Spark 변환 → S3 저장 → Athena로 쿼리 Python의 Faker 라이브러리로 가상의 신용카드 거래 데이터 CSV 생성 ...

5월 1, 2025