🛡️ 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

🧚 왜 dbt를 Airflow Docker 컨테이너 안에서 실행하는가

데이터 엔지니어링 파이프라인에서 dbt와 Airflow는 종종 함께 사용된다. 여기서 자주 마주하는 설계 결정이 있다: dbt를 Airflow와 어떻게 함께 실행할 것인가? dbt를 별도의 컨테이너에서 실행하고 API나 CLI 호출로 오케스트레이션할 것인가? 아니면 dbt를 Airflow의 Docker 컨테이너 안에서 직접 실행할 것인가? 둘 다 실험해본 결과, dbt를 Airflow 컨테이너 안에서 실행하는 방식을 선호한다. 이유는 다음과 같다. ✅ 하나의 컨테이너 = 하나의 환경 Airflow DAG가 동일한 컨테이너 안에서 dbt 명령어를 직접 실행한다. 이를 통해 다음이 보장된다: 동일한 Python 버전 동일한 dbt 버전 동일한 의존성 버전 (dbt 패키지, 어댑터) 컨테이너 간 네트워킹 이슈 없음 별도의 컨테이너로 분리할 경우 다음을 관리해야 한다: ...

6월 4, 2025

🐳 GitHub Pages용 Jekyll 블로그를 Docker로 세팅하기 — 삽질 끝에 완성한 깔끔한 구성

😩 문제 Jekyll을 Docker로 세팅하는 건 쉬워 보였지만, 실제로는 여러 문제를 겪었습니다: 플랫폼 이슈 (arm64 vs amd64) - Apple Silicon Macbook (M1)을 사용중 bundle install에서 발생하는 오류들 개인 GitHub Pages 사이트용으로 만들고 있었기 때문에, GitHub Pages에서 사용하는 gem 버전과 호환되면서도 로컬에서 개발하기 쉽게 유지해야 했습니다. 🛠 나의 깔끔한 해결책 결국 이 Docker 세팅을 만들게 되었습니다. 저에게는 잘 작동합니다. ✅ Key Features Apple Silicon (M1/M2)와 Intel 모두에서 동작 깔끔하게 다시 빌드 가능한 이미지 볼륨 마운트를 통한 안정적인 파일 동기화 GitHub Pages의 Jekyll 버전과 호환 (선택 사항) livereload 지원 🐳 The Dockerfile FROM ruby:3.2.3-slim RUN apt-get update -qq && \ apt-get install -y build-essential libpq-dev nodejs npm RUN gem install bundler -v 2.6.9 WORKDIR /srv/jekyll COPY Gemfile* ./ RUN bundle install COPY . . EXPOSE 4000 CMD ["bundle", "exec", "jekyll", "serve", "--host", "0.0.0.0", "--force_polling", "--livereload"] 🐳 docker-compose.yml services: site: image: my-jekyll platform: linux/arm64 command: bundle exec jekyll serve --host 0.0.0.0 --force_polling --livereload ports: - "4000:4000" - "35729:35729" volumes: - .:/srv/jekyll - ./vendor/bundle:/usr/local/bundle working_dir: /srv/jekyll environment: - JEKYLL_ENV=development 💎 Gemfile source "https://rubygems.org" gem "jekyll", "~> 4.3.3" gem "csv", "~> 3.3.5" gem "base64", "~> 0.2.0" gem "logger", "~> 1.6.0" group :jekyll_plugins do gem "jekyll-feed", "~> 0.17.0" gem "jekyll-seo-tag", "~> 2.8.0" end # Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem # and associated library. platforms :mingw, :x64_mingw, :mswin, :jruby do gem "tzinfo", ">= 1", "< 3" gem "tzinfo-data" end # Performance-booster for watching directories on Windows gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] # Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem # do not have a Java counterpart. gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby] # Add webrick as it's no longer bundled with Ruby gem "webrick", "~> 1.8" Gemfile.lock도 레포에 포함되어 있습니다. ...

6월 3, 2025

🔧 Airflow Docker 스타트 문제 해결

Airflow를 Docker로 운영하면서 자주 마주치는 이슈를 정리 ❗ 문제 1 — .env 파일이 Airflow 컨테이너 안에서 안 보인다 🔍 증상 요약 .env 파일은 프로젝트 루트에 존재. 하지만 Airflow 컨테이너 안에서는 load_dotenv()가 읽지 못함. 이유: Docker는 .env 파일을 환경변수로 변환해 넘기긴 하지만, 파일 자체를 컨테이너 내부로 복사하거나 mount하지 않는다. 결국 load_dotenv()가 찾을 파일이 없음. ✅ 해결법 1️⃣ docker-compose.yml에 volume mount 추가 services: airflow: ... volumes: - ./dags:/opt/airflow/dags - ./.env:/opt/airflow/dags/.env # ✅ 이 줄 추가 이렇게 하면 .env 파일이 Airflow 컨테이너 안의 /opt/airflow/dags/.env 경로로 복사된다. ...

5월 30, 2025

🔧 ARM Mac + Docker + dbt 시작 트러블 슈팅

Airflow + dbt 프로젝트를 Docker로 세팅하던 중 발생하는 에러 메시지와 해결법. 🔍 문제1 : 플랫폼 아키텍처 mismatch 에러 메시지: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) 내 Mac은 ARM (Apple Silicon - M1/M2/M3) dbt 공식 도커 이미지는 기본적으로 amd64 (x86 기반) 결국 도커가 내부적으로 qemu 에뮬레이션을 돌리다가 Python 경로 꼬임까지 발생 → dbt dbt --version 오류로 드러남. 이건 단순 dbt 오류가 아니라 플랫폼 mismatch가 근본 원인입니다. ...

5월 30, 2025