실습파일 다운 및 세팅

  1. 실습파일을 다운로드
    weare@DESKTOP-BE1I4GE:~$ git clone https://github.com/learndataeng/learn-airflow.git
    Cloning into 'learn-airflow'...
    remote: Enumerating objects: 219, done.
    remote: Counting objects: 100% (95/95), done.
    remote: Compressing objects: 100% (93/93), done.
    remote: Total 219 (delta 31), reused 2 (delta 0), pack-reused 124
    Receiving objects: 100% (219/219), 71.07 KiB | 6.46 MiB/s, done.
    Resolving deltas: 100% (106/106), done.

  2. 다운 받은 파일로 이동
    weare@DESKTOP-BE1I4GE:~$ cd learn-airflow

  3. docker-compose.yaml 파일 다운
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.5.1/docker-compose.yaml'
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 10493  100 10493    0     0  31703      0 --:--:-- --:--:-- --:--:-- 31796

  4. 필요한 폴더 만듦
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ mkdir -p ./dags ./logs ./plugins

  5. .env 파일을 생성하고, 그 내용으로 AIRFLOW_UID와 AIRFLOW_GID 변수를 설정
    weare@DESKTOP-BE1I4GE:~/learn-airflow$  echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env
  6. docker-compose.yaml 파일 수정
    5가지를 수정해야하고, 수정내용은 아래와 같다.

    1) environment 에 Airflow에서 사용하는 데이터 디렉토리를 /opt/airflow/data로 설정
     AIRFLOW_VAR_DATA_DIR: /opt/airflow/data


    2) 처음 설치 모듈들 추가 
    _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- yfinance pandas numpy oauth2client gspread}

    3) 볼륨 설정. 호스트의 ${AIRFLOW_PROJ_DIR:-.}/data 경로를 컨테이너 내부의 /opt/airflow/data 경로로 마운트
    - ${AIRFLOW_PROJ_DIR:-.}/data:/opt/airflow/data

    4) mkdir~ :  /sources/data 폴더 추가

    5) chown~: AIRFLOW_UID에 지정된 사용자 ID를 소유자로 설정하고, 0은 그룹을 root 그룹으로 설정.
    data 폴더에 대해 명령어를 수행

  7. 컨테이너 실행, 맨뒤에 -d 넣으면 서버 실행돼서 우분투 하나더 실행 안해도 됨
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker-compose up -d

  8. docker 데스크탑으로 확인하면 잘 실행됨
  9. http://localhost:8080/ 페이지 가서 variable에 가보면 저장한 변수가 표면적으로 나와있지 않음(보안상 이점)
  10. variable 저장된 data_dir이 저장된 위치 확인.
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker ps
    CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                      PORTS                    NAMES
    73c2ebf8ecec   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (healthy)     8080/tcp                 learn-airflow_airflow-triggerer_1
    90cb7b11d245   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (unhealthy)   8080/tcp                 learn-airflow_airflow-scheduler_1
    a5bacafc0519   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (healthy)     8080/tcp                 learn-airflow_airflow-worker_1
    065f9ee9e619   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (healthy)     0.0.0.0:8080->8080/tcp   learn-airflow_airflow-webserver_1
    cd5a97a54a1c   redis:latest           "docker-entrypoint.s…"   29 minutes ago   Up 12 minutes (healthy)     6379/tcp                 learn-airflow_redis_1
    73ed8fe8f6d1   postgres:13            "docker-entrypoint.s…"   29 minutes ago   Up 12 minutes (healthy)     5432/tcp                 learn-airflow_postgres_1

  11. 웹에서는 안보이지만 variable이 존재함을 확인
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker exec -it 90cb7b11d245 airflow variables get DATA_DIR
    /home/airflow/.local/lib/python3.7/site-packages/airflow/models/base.py:49 MovedIn20Warning: [31mDeprecated API features detected! These feature(s) are not compatible with SQLAlchemy 2.0. [32mTo prevent incompatible upgrades prior to updating applications, ensure requirements files are pinned to "sqlalchemy<2.0". [36mSet environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings.  Set environment variable SQLALCHEMY_SILENCE_UBER_WARNING=1 to silence this message.[0m (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9)
    /opt/airflow/data

 

실습파일 다운 및 세팅

  1. 실습파일을 다운로드
    weare@DESKTOP-BE1I4GE:~$ git clone https://github.com/learndataeng/learn-airflow.git
    Cloning into 'learn-airflow'...
    remote: Enumerating objects: 219, done.
    remote: Counting objects: 100% (95/95), done.
    remote: Compressing objects: 100% (93/93), done.
    remote: Total 219 (delta 31), reused 2 (delta 0), pack-reused 124
    Receiving objects: 100% (219/219), 71.07 KiB | 6.46 MiB/s, done.
    Resolving deltas: 100% (106/106), done.

  2. 다운 받은 파일로 이동
    weare@DESKTOP-BE1I4GE:~$ cd learn-airflow

  3. docker-compose.yaml 파일 다운
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.5.1/docker-compose.yaml'
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 10493  100 10493    0     0  31703      0 --:--:-- --:--:-- --:--:-- 31796

  4. 필요한 폴더 만듦
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ mkdir -p ./dags ./logs ./plugins

  5. .env 파일을 생성하고, 그 내용으로 AIRFLOW_UID와 AIRFLOW_GID 변수를 설정
    weare@DESKTOP-BE1I4GE:~/learn-airflow$  echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env
  6. docker-compose.yaml 파일 수정
    5가지를 수정해야하고, 수정내용은 아래와 같다.

    1) environment 에 Airflow에서 사용하는 데이터 디렉토리를 /opt/airflow/data로 설정
     AIRFLOW_VAR_DATA_DIR: /opt/airflow/data


    2) 처음 설치 모듈들 추가 
    _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- yfinance pandas numpy oauth2client gspread}

    3) 볼륨 설정. 호스트의 ${AIRFLOW_PROJ_DIR:-.}/data 경로를 컨테이너 내부의 /opt/airflow/data 경로로 마운트
    - ${AIRFLOW_PROJ_DIR:-.}/data:/opt/airflow/data

    4) mkdir~ :  /sources/data 폴더 추가

    5) chown~: AIRFLOW_UID에 지정된 사용자 ID를 소유자로 설정하고, 0은 그룹을 root 그룹으로 설정.
    data 폴더에 대해 명령어를 수행

  7. 컨테이너 실행, 맨뒤에 -d 넣으면 서버 실행돼서 우분투 하나더 실행 안해도 됨
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker-compose up -d

  8. docker 데스크탑으로 확인하면 잘 실행됨
  9. 저장된 data_dir이 저장된 위치 확인.
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker ps
    CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                      PORTS                    NAMES
    73c2ebf8ecec   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (healthy)     8080/tcp                 learn-airflow_airflow-triggerer_1
    90cb7b11d245   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (unhealthy)   8080/tcp                 learn-airflow_airflow-scheduler_1
    a5bacafc0519   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (healthy)     8080/tcp                 learn-airflow_airflow-worker_1
    065f9ee9e619   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (healthy)     0.0.0.0:8080->8080/tcp   learn-airflow_airflow-webserver_1
    cd5a97a54a1c   redis:latest           "docker-entrypoint.s…"   29 minutes ago   Up 12 minutes (healthy)     6379/tcp                 learn-airflow_redis_1
    73ed8fe8f6d1   postgres:13            "docker-entrypoint.s…"   29 minutes ago   Up 12 minutes (healthy)     5432/tcp                 learn-airflow_postgres_1

    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker exec -it 90cb7b11d245 airflow variables get DATA_DIR
    /home/airflow/.local/lib/python3.7/site-packages/airflow/models/base.py:49 MovedIn20Warning: [31mDeprecated API features detected! These feature(s) are not compatible with SQLAlchemy 2.0. [32mTo prevent incompatible upgrades prior to updating applications, ensure requirements files are pinned to "sqlalchemy<2.0". [36mSet environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings.  Set environment variable SQLALCHEMY_SILENCE_UBER_WARNING=1 to silence this message.[0m (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9)
    /opt/airflow/data

airflow 실행환경 관리

  • 기타 환경설정값들(variables, connections 등) 어떻게 관리/배포할까?
    보통 docker-compose.yml 파일에서 관리
  • 어디까지 airflow 이미지로 관리하고 뭘 docker-compose.yml에서 관리할까?

  • 두가지 실행환경 : 에어플로우(Apache Airflow) 이미지, Docker Compose

    1. **에어플로우 이미지:**
       - **개념:** 에어플로우 이미지는 에어플로우 및 관련 의존성, DAGs, 설정 파일 등이 미리 패키징된 Docker 이미지입니다. 이 이미지는 에어플로우를 실행하는 데 필요한 모든 것을 포함합니다.
       - **용도:** 이미지는 여러 환경 (개발, 테스트, 프로덕션)에서 일관된 에어플로우 환경을 유지하고, 배포를 단순화하는 데 사용됩니다.

    2. **Docker Compose:**
       - **개념:** Docker Compose는 여러 컨테이너를 정의하고 관리하는 도구로, YAML 파일에 컨테이너 설정을 기술합니다. 이를 사용하여 여러 서비스를 하나의 프로젝트로 정의하고 실행할 수 있습니다.
       - **용도:** `docker-compose.yml` 파일은 여러 컨테이너를 동시에 실행하고, 서비스 간의 의존성, 네트워킹, 볼륨 마운트 등을 설정하는 데 사용됩니다. 즉, 여러 서비스를 함께 실행하고 관리하는 데 도움이 됩니다.

    **차이점:**
    - **에어플로우 이미지:** 에어플로우와 관련된 모든 것을 패키징한 이미지. 에어플로우 자체, DAGs, 설정 파일, 의존성 등이 이미지에 포함됨.
    - **Docker Compose:** 여러 컨테이너를 정의하고 관리하는 도구. 여러 서비스를 정의하고 이를 함께 실행할 때 사용. 컨테이너의 구성, 네트워킹, 데이터 볼륨 등을 관리.

    일반적으로, 에어플로우 이미지는 에어플로우 환경을 패키징하고, Docker Compose는 여러 서비스를 함께 실행하고 이를 관리하는 데 사용됩니다. `docker-compose.yml` 파일에서는 에어플로우 이미지를 어떻게 사용할지, 각 컨테이너 간의 상호작용을 어떻게 설정할지 등을 정의합니다.

  • 조심할점 : airfow의 dag 스캔패턴의 특성상 dags_folder가 가리키는 폴더를 서브폴더들까지 다 스캔함. dag모듈이 포함된 모든 파이썬 스크립트를 실행해서 사고로 이어진다. 

    해결방법 : .airflowignore로 무시해야할 dag_folder의 폴더나 파일을 지정

    실제예
    1. `project_a`: 이 패턴은 단순히 `project_a`라는 파일 또는 디렉토리를 무시하는 패턴입니다.

    2. `tenant_[\d]`: 이 패턴은 `tenant_` 다음에 숫자(`[\d]`는 숫자를 나타냄)가 따라오는 경우를 의미합니다. 이것은 `tenant_0`, `tenant_1`, `tenant_2` 등과 같은 패턴을 무시하는 데 사용될 수 있습니다.

 

 

 

 

 

AB 테스트란?

  • 유래 : 신약을 테스트 할때 기준을 정하고(혈압, 혈당 등) 신약,구약 후보군을 둘로 나눠서 효능 테스트함. AB 후보군의 혈당, 혈압의 차이가 통계적 의미를 가지는 정도 인지를 본다. 이를 코드 개발에도 적용하게됨. A와 B 페이지를 동시에 구성해서 A페이지 B페이지의 고객 행동의 차이가 있는지 관찰가능.
    +가설 : 이 약을 먹으면 혈압이 증가할 것이다.
  • AB 테스트는 새로운 기능이나 변경이 생겼을때,  가설을 실험하고 검증할 때 쓰인다.
    예) 상품 추천 알고리즘을 머신러닝으로 하면 매출이 늘어날 것이다. -> AB 테스트 검증 -> 사실
    예) 상품 스텝을 줄이면 결제가 올라갈것이다. -> AB 테스트 검증 -> 비싼 상품은 신뢰도가 더 중요

AB테스트 장단점

  • 장점:
    1. 성능 최적화:
       - A/B 테스트를 통해 여러 버전을 동시에 평가하므로 어떤 기능 또는 디자인이 사용자에게 가장 긍정적인 영향을 미치는지 확인할 수 있습니다.
       - 이를 통해 성능을 최적화하고 사용자 만족도를 높일 수 있습니다.

    2. 데이터 기반 의사결정:
       - A/B 테스트는 데이터 기반의 의사결정을 가능하게 합니다. 통계적으로 유의미한 결과를 얻어, 개선 사항을 신뢰성 있게 판단할 수 있습니다.

    3. 배우기 쉬움:
       - A/B 테스트는 비교적 간단한 개념으로, 초기 단계에서 적용하기 쉽습니다.
       - 실험과 통계 분석에 대한 지식을 키우는 데 도움이 됩니다.

    4. 비즈니스 목표 달성:
       - 비즈니스 목표를 달성하기 위한 최적의 전략을 찾아내는 데 도움이 됩니다.
       - 기능이나 디자인 변경이 실제로 비즈니스 성과에 어떤 영향을 미치는지 확인할 수 있습니다.

    5. 위험부담 감소
        - 잘못돼도 절반의 위험

  • 단점:
    1. 시간과 비용 소모:
       - A/B 테스트를 실시하기 위해서는 시간과 자원이 소모됩니다. 두 가지 이상의 버전을 개발하고, 테스트를 실행하며, 결과를 분석하는 데에 시간과 비용이 듭니다. (airbnb의 경우 70% 데이터 사용)

    2. 리소스 낭비:
       - 실패한 변형에 할당된 리소스는 낭비될 수 있습니다. 실험 결과가 예상치 못하게 나오면 투자한 노력과 비용이 낭비될 수 있습니다.

    3. 테스트 설계의 어려움:
       - 적절한 실험 설계를 수립하는 것이 어려울 수 있습니다. 변수의 올바른 설정, 샘플 크기 결정 등이 중요하며, 실수할 경우 결과의 신뢰도가 감소할 수 있습니다.

    4. 유의미한 결과 부족:
       - 가끔은 테스트 결과가 유의미한 차이를 보이지 않을 수 있습니다. 이는 사용자 행동의 복잡성이나 다양성 때문일 수 있습니다.

AB테스트 사용하면 안되는 경우

  • 가설에 근거가 없거나 구체적이지 않은 아이디어
  • 버그 수정을 위한 AB 테스트(둘중에 더 좋은걸 판단하는게 AB테스트, 버그는 그냥 빨리 고쳐!)
  • 비교 대상이 하나가 아닌경우
  • 트래픽이 별로없는 서비스의 경우, 어짜피 분석해봤자 유의미한 결과가 나오기 힘들다.
  • 어떤 결정(가격)은 데이터로만 판단할수 없음 : 거시적 경제상황, 경쟁사의 가격정책도 고려
  • 분석에 필요한 데이터 품질이 낮은경우
  • 특정팀이나 개인의 의견만이 반영되는 환경
  • 리뷰 리딩하는 사람이 주니어라 No라는 말을 잘 못하는 경우 -> 시니어급으로 할것

AB테스트 실제 예 

  • 가격 인상 전에도 AB테스트를 해봄. 인상군 비인상군 비교-> 큰차이가 안남 ->  큰차이가 안나서 가격을 일괄올림 -> 판매량 급감

AB 테스트는 agile 해야함

  • 주요한 Agile 원칙은 "개발자와 비즈니스 담당자 간의 긴밀한 협력",
  • "작동하는 소프트웨어를 우선으로",
  • "변화에 대응하는 유연한 계획",
  • "자주 배포"

AB테스트 과정

  • 실행전 AB테스트 제안
  • 성공기준 정함
  • 실행중 AB테스트 결과 리뷰

AB테스트 실제과정

  1. 0~1% smoke test : B가 버그가 있는지 확인하는 정도
  2. 5~10% initial ramp : 가설 확인
  3. 25~50% intermediate ramp : 가설과 별도로 매출의 영향을 봄
  4. 100% Final ramp-up : 최종 판단 후 결정

AB 테스트 분석을 위해 필요한 정보

  1. 사용자별 AB 버킷 정보(사용자중 누가 A들어갔고, B에 들어갔는지)
  2. 사용자별 행동 정보(본거,클릭, 구매)
    -> 1,2 join 해서 그룹간 통계 정보 계산
  3.  

초록색 : 통계적으로 높다/ 빨간색 : 통계적으로 낮다.

AB테스트 시스템 구성

  • 작은 회사는 SaaS 를 사용
  • 런타임 시스템(버킷 결정로직 중요) + 분석시스템 2개로 나뉜다.

 

  • 전체과정

 

 

AA테스트

  • AA 테스트는 기본적으로 A/B 테스트에서 A와 A로 구성된 실험입니다. 즉, 두 그룹이 동일한 조건에서 같은 변종을 보는 실험입니다. 이는 주로 실험 환경의 안정성을 확인하거나 테스트 시스템의 정확성을 검증하기 위해 사용됩니다.

 

userid vs deviceid 

  • userid : 등록사용자
  • deviceid : 로그인 상관없이 서비스 방문자에게 부여되는 id, 브라우저 쿠키로 만들어짐
  • 나누는 방법들 

 

 

 

outlier가 A/B 테스트에 미치는 영향

  • 큰손들의 구매
  • 특정 이슈로 인한 과 트래픽 발생

'데이터 기초' 카테고리의 다른 글

ETL 기초 실습  (0) 2023.12.31
테스트 코드 구조 소개  (1) 2023.12.25
워드클라우드 이용 데이터 시각화  (0) 2023.10.27
셀레니엄 이용한 자동화 웹 스크래핑  (0) 2023.10.26

+ Recent posts