관리해야 하는 DAG의 수가 100개를 넘어간다면?
- 데이터 품질이나 데이터 리니지 이슈 이외에도 다양한 이슈들이 발생
- 주로 발생할 수 있는 이슈
- 라이브러리 충돌
- 라이브러리/모듈의 충돌 이슈가 발생하기 시작함
- DAG에 따라 실행에 필요한 라이브러리/모듈이 달라지기 시작 (ex. python 버전)
- 이로 인해 DAG 혹은 Task 별로 별도의 독립공간을 만들어주는 것이 필요
- Docker to the rescue
- Dag 혹은 Task 코드를 Docker Image로 만들고 이를 독립된 공간(Docker Container)안에서 실행
- Worker의 부족
- 해결책
- scale up (언젠가 한계가 있음)
- scale out
- 클라우드 서비스 사용
- K8s와 같은 컨테이너 기술 사용
- 필요한대로 서버 요청
- 해결책
- Worker 서버들의 관리와 활용도 이슈
- airflow 전용 하드웨어를 지정했는데 서버들이 항상 바쁘지 않다면?
- 서비스별로 전용 서버를 할당하는 것은 여러가지로 이슈를 만들어냄
- 서비스별로 capacity 관리를 해야 함
- 각 서비스에 속한 서버들은 보면 utilization이 낮은 이슈 발생
- 이 역시 K8s와 같은 컨테이너 기술의 도입으로 해결 가능
- 라이브러리 충돌
* docker image: 해당 소프트웨어를 실행하기 위한 모든 것들이 하나로 패키지가 된 것 (독립적으로 완전하게 만들어진 패키지)
* docker container: 작게 분리된 이 소프트웨어만을 위한 컴퓨터(분리된 공간?), docker image를 독립된 환경에서 실행한 것
* k8s: 언제든지 다양한 용도로 사용될 수 있는 공용 클러스터
airflow executor
- executor는 task들을 관리하고 실행하는 역할을 수행
- 병렬 혹은 일렬 실행이나 어느 worker에서 실행할지 등등
- 다양한 수의 executor 타입이 존재
- sequential executor: 디폴트로 설치되며 sqlite와 같은 싱글 스레드 db에서만 사용가능
- local executor: task들을 airflow 마스터 노드 안에서 실행
- celery executor: 다수의 worker 노드가 있는 경우 사용되며 celery 큐를 사용해 task들을 worker 노드로 분산하여 실행
Docker의 목표
- 소프트웨어를 일관되게 빌드하고 실행하고 배포
- docker file: 지금 내가 만든 프로그램에 대해 어떤 소프트웨어에 대해 어떤 환경변수가 세팅되어야 하는지 적혀 있음
- 이를 빌드하면 docker 이미지 생성
- 이를 그대로 실행하고자 한다면 container 형태로 docker command를 이용해 실행 가능
- docker registry에 업로드하면 다른 사람들도 접근 가능
Docker Container
- 소프트웨어를 실행하기 위한 독립적이고 분리된 공간
- 자체 파일 시스템을 갖고 있음 (Volume 이라고 부름)
Docker container의 장단점
- 장점
- 소프트웨어를 실행하기 위한 독럽적이고 분리된 공간을 제공
- 다수의 소프트웨어를 각 컨테이너 단에서 독립적으로 실행 가능
- 자원 소비가 적음
- 몇 십개에서 몇 백개의 container를 실행 가능
- 호스트 OS를 사용 (별도 비용 없음)
- 따라서 빠르게 실행됨
- 소프트웨어를 실행하기 위한 독럽적이고 분리된 공간을 제공
- 단점
- 많은 수의 docker container를 관리하는 것은 쉽지 않음
- Host OS를 사용하기에 Cross-platform compatibility를 항상 지원하지 않음
- GUI 소프트웨어 개발에 적합하지 않음 (command line으로 진행하기 때문에)
하이레벨 docker 사용 프로세스
- 대상 소프트웨어 선택
- 다수의 컴포넌트로 구성되는 소프트웨어라면 각각 docker Image로 만들어져야 할 수 있음
- 이를 Docker Image로 빌드(dockerization)
- Dockerfile에 텍스트 파일로 세부 정보를 기술
- 해당 소프트웨어를 이미지로 바꾸기 위한 docker에게 주는 명령들을 포함
- https://nomad-programmer.tistory.com/307 참고
- Docker Image: 하나의 Docker Container안에서 실행됨
- dockerfile을 기준으로 만들어지며 소프트웨어를 실행하기 위해 필요한 모든 것을 포함
- docker Image의 구성 요소
- 기본 OS와 같은 소프트웨어의 실행환경
- 소프트웨어 자체 (코드)
- 소프트웨어가 필요로 하는 라이브러리
- 파일 시스템 스냅샷
- 환경 설정 변수(설치할 때, 소프웨어가 실제로 실행될 때): env, arg 존재
- 메타 데이터: 이미지 자체에 대한 정보 (버전, 작성자, 설명 등등)
- 위 정보와 설치 관련 실행 순서 등이 dockerfile에 기술됨
- docker Image는 다수의 파일로 구성
- Dockerfile에 텍스트 파일로 세부 정보를 기술
1. Docker Image의 실행
- Container를 통해 Docker Image안의 소프트웨어 실행
- container는 자체 파일 시스템을 가진 특수한 프로세스로 이미지 파일 시스템이 로딩됨
- Image를 container 안에서 실행
2. Docker Image의 등록: Docker Hub
- Docker Registry: Docker Image들의 보관소
- On-prem registry와 Cloud registry가 존재
- docker hub이 가장 유명함..
- registry에 등록하면 회사 내 혹은 퍼블릭하게 이미지를 공유 가능
- github와 연동하여 github으로 코드 관리하고 docker hub에 배포하는 것이 일반적
--- 작성중 ---
반응형