SlideShare une entreprise Scribd logo
1  sur  33
Airflow를 이용한
데이터 Workflow 관리
About me
dba.kim@gmail.com
Airflow
Workflow 관리를 위한 플랫폼
airbnb에서 개발
현재 아파치 incubating project
왜 Airflow 인가?
데이터 처리를 위한 복잡한 단계를 flow
diagram 형태로 한눈에 볼 수 있다.
왜 Airflow 인가?
Python 기반으로 비교적 쉽게 각 task를
작성할 수 있다.
t1= PythonOperator(
task_id='get_report_data',
python_callable=get_report_data,
provide_context=True,
op_kwargs={'target_day':target_day},
dag=dag
)
def get_report_data(**kwargs):
target_day=kwargs['target_day']
stmt= """SELECT ~~~~""" %(target_day)
a_cursor.execute(stmt)
dags/task1.py scripts/task1_lib.py
왜 Airflow 인가?
각 task의 실행 시간을 한눈에 볼 수 있다.
왜 Airflow 인가?
각 task의 실행 이력을 한눈에 볼 수 있고
필요한 경우 특정 task만 실행할 수 있다.
왜 Airflow 인가?
쉬운 job 스케줄 관리 및 전체 job의 실행
상황을 볼 수 있다.
왜 Airflow 인가?
각 task를 병렬로 실행할 수 있다.
Airflow 기본 아키텍처
Worker
Web Server
Dags
Scheduler
Airflow 설치
#pip install apache-airflow
#airflow initdb
#airflow webserver –p 8080
웹 브라우저에서 접속 :http://localhost:8080
Dags 작성
DAG : Directed Acyclic Graph
Task들의 집합
여러개의 Task들이 순서와
Dependency를 갖는다
~/airflow/dags 디렉토리에 저장
Dags 작성
Python Operator
t1= PythonOperator(
task_id='get_report_data',
python_callable=get_report_data,
provide_context=True,
op_kwargs={'target_day':target_day},
dag=dag
)
Dags 작성
Python Operator
Parameter 설명
task_id 각 Task를 구분하기 위한 Unique한 Task명
python_callable 실제 호출된 python 함수명
provide_context python 함수 호출 시 해당 함수에서 사용될 수 있는
기본적인 argument값을 넘겨줄 지 여부
op_kwargs 기본 argument 외에 추가로 넘겨줄 파라미터 정의
dag default dag 명
Dags 작성
작성된 Dag는 변경된 사항을 반영하기 위해서
airflow의 scheduler에 의해서 주기적으로 호출되므로
파일이 너무 크거나 복잡해지지 않도록 만든다
Dag에서는 실제 처리 내용을 정의하기 보다는 처리될
순서가 정의될 수 있도록 하고 실제 처리내용은 별도
파일(lib)에서 호출될 수 있도록 했다
Dags 작성
~/airflow/dags/sample_dag.py
execfile('~/airflow/scripts/sample_dag_lib.py')
t1= PythonOperator(
task_id='get_report_data',
python_callable=get_report_data,
…….
)
t2= PythonOperator(
task_id='upd_add_data',
python_callable='upd_add_data',
…….
)
t2.set_upstream(t1)
~/airflow/scripts/sample_dag_
lib.py
def get_report_data(**kwargs):
…….
…….
def upd_add_data(**kwargs):
…….
…….
)
Dags 작성(xcom)
# 값을 넘겨줄 때
def push_value(**kwargs):
val_a=1
ti=kwargs['ti']
ti.xcom_push(key='push_value1', value=val_a)
# 값을 받을 때
def get_value(**kwargs):
ti=kwargs['ti']
val_b=ti.xcom_pull(task_ids='push_value', key='push_value1')
Task 간의 데이터 전달은 xcom을 사용
Scheduler 및 Job 실행
#airflow scheduler
웹 페이지에서 생성된 Dag를 enable 시키고 수동으로 수행시킬 수 있다
Task 실행 상태 확인(Graph view)
수행중인 Dag를 클릭한 후 Graph View에서 실행 상태를 볼 수 있다
Task 실행 상태 확인(Gant view)
Gant View에서 각 Task의 실행에 소요된 시간을 볼 수 있다
Task의 병렬 실행
But...각 Task가 병렬로 실행되지 않고 Sequential하게 실행되는
것을 볼 수 있다
Task의 병렬 실행
Task를 병렬로 실행하려면 아래 조건이 필요하다
- 실제 Task를 실행하는 airflow의 worker를 sequential
executor가 아닌 celery executor를 사용해야 함
- celery executor 사용을 위해서는 Broker 가 필요한데 이를 위
해 RabbitMQ나 Redis가 필요함
- airflow의 meta store로 sqlite가 아닌 mysql이나 postgresql
을 사용해야 함
병렬 실행을 위한 Airflow 아키텍처
Worker
Worker
Worker
Web Server
Dags
Scheduler
Worker
Worker
[ Celery ]
MySQL 설치 및 설정
# yum install mysql.x86_64
mysql> create database airflow;
mysql> create user airflow@'10.xx.xx.xx' identified by 'airflow_pwd';
mysql> grant ALL PRIVILEGES ON airflow.* to airflow@'10.xx.xx.xx';
my.cnf에 아래 설정 추가
explicit_defaults_for_timestamp = 1
max_allowed_packet = 30M
MySQL 설치 및 설정
MySQL start 및 airflow db 초기화
# /etc/init.d/mysql start
# airflow initdb
xcom으로 전달되는 데이터의 크기 확장을 위해 컬럼 타입 변경
mysql> alter table airflow.xcom modify value LONGBLOB;
RabbitMQ 설치 및 설정
# yum install rabbitmq-server.noarch
# rabbitmq-server
# rabbitmqctl add_user airflow airflow
Creating user "airflow" ...
...done.
# rabbitmqctl add_vhost airflow_vhost
Creating vhost "airflow_vhost" ...
...done.
# rabbitmqctl set_user_tags airflow airflow
Setting tags for user "airflow" to [airflow] ...
...done.
# rabbitmqctl set_permissions -p airflow_vhost airflow ".*" ".*" ".*"
Setting permissions for user "airflow" in vhost "airflow_vhost" ...
...done.
airflow.cfg 설정
# vi ~/airflow/airflow.cfg
# executor를 default인 SequentialExecutor에서 CeleryExecutor로 변경
executor = CeleryExecutor
# db connection을 sqlite에서 mysql로 변경
sql_alchemy_conn = mysql://airflow:airflow@10.xx.xx.xx/airflow
# Celery broker URL을 rabbitmq로 설정
broker_url = amqp://airflow:airflow@10.xx.xx.xx:5672/airflow_vhost
# Celery가 job을 수행한 결과를 저장한 db metastore 설정
celery_result_backend = db+mysql://airflow:airflow@10.xx.xx.xx:3306/airflow
airflow restart
# airflow webserver -p 8080
-- celeryExecutor는 별도 worker 실행이 필요하다
# airflow worker
# airflow scheduler
Task 병렬 실행 확인
Sequential 실행 시에 발생하지 않던 DB Lock 발생
해당 작업의 특성 상 특정 일자 데이터 범위를 조회/추가/변경 하는
로직으로 동일 테이블의 Task를 병렬로 수행 시 Lock경합이 발생함
각 Task의 실행 순서를 조정해서 Lock 문제 해결
But..병렬 실행으로 인한 경합 발생
Gant view에서 각 Task가 병렬로 수행됨을 확인할 수 있다
Task 병렬 수행 및 경합 해소 확인
- 데이터 처리 Flow를 쉽게 파악할 수 있다
- 데이터 처리를 위한 배치를 통합해서 관리할 수 있다
- 웹페이지를 통해 매일 배치 수행 현황을 쉽게 확인할 수 있다
- 배치 실패 시에 특정 Task만 별도로 수행함으로써 문제를 쉽게
해결할 수 있다
Airflow 적용 후 개선점
Thank you

Contenu connexe

Tendances

Amazon Aurora 성능 향상 및 마이그레이션 모범 사례 - AWS Summit Seoul 2017
Amazon Aurora 성능 향상 및 마이그레이션 모범 사례 - AWS Summit Seoul 2017Amazon Aurora 성능 향상 및 마이그레이션 모범 사례 - AWS Summit Seoul 2017
Amazon Aurora 성능 향상 및 마이그레이션 모범 사례 - AWS Summit Seoul 2017Amazon Web Services Korea
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System Kwangseob Kim
 
Google Cloud IAM 계정, 권한 및 조직 관리
Google Cloud IAM 계정, 권한 및 조직 관리Google Cloud IAM 계정, 권한 및 조직 관리
Google Cloud IAM 계정, 권한 및 조직 관리정명훈 Jerry Jeong
 
로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법Jeongsang Baek
 
AWS EMR Cost optimization
AWS EMR Cost optimizationAWS EMR Cost optimization
AWS EMR Cost optimizationSANG WON PARK
 
Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나
Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나
Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나Amazon Web Services Korea
 
[DevGround] 린하게 구축하는 스타트업 데이터파이프라인
[DevGround] 린하게 구축하는 스타트업 데이터파이프라인[DevGround] 린하게 구축하는 스타트업 데이터파이프라인
[DevGround] 린하게 구축하는 스타트업 데이터파이프라인Jae Young Park
 
Data pipeline and data lake
Data pipeline and data lakeData pipeline and data lake
Data pipeline and data lakeDaeMyung Kang
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기Yungon Park
 
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Seongyun Byeon
 
Amazon DocumentDB vs MongoDB 의 내부 아키텍쳐 와 장단점 비교
Amazon DocumentDB vs MongoDB 의 내부 아키텍쳐 와 장단점 비교Amazon DocumentDB vs MongoDB 의 내부 아키텍쳐 와 장단점 비교
Amazon DocumentDB vs MongoDB 의 내부 아키텍쳐 와 장단점 비교Amazon Web Services Korea
 
[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영NAVER D2
 
마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트)
마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트) 마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트)
마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트) Amazon Web Services Korea
 
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)Jaikwang Lee
 
실시간 이상탐지를 위한 머신러닝 모델에 Druid _ Imply 활용하기
실시간 이상탐지를 위한 머신러닝 모델에 Druid _ Imply 활용하기실시간 이상탐지를 위한 머신러닝 모델에 Druid _ Imply 활용하기
실시간 이상탐지를 위한 머신러닝 모델에 Druid _ Imply 활용하기Kee Hoon Lee
 
TF에서 팀 빌딩까지 9개월의 기록 : 성장하는 조직을 만드는 여정
TF에서 팀 빌딩까지 9개월의 기록 : 성장하는 조직을 만드는 여정TF에서 팀 빌딩까지 9개월의 기록 : 성장하는 조직을 만드는 여정
TF에서 팀 빌딩까지 9개월의 기록 : 성장하는 조직을 만드는 여정Seongyun Byeon
 
AWS Personalize 중심으로 살펴본 추천 시스템 원리와 구축
AWS Personalize 중심으로 살펴본 추천 시스템 원리와 구축AWS Personalize 중심으로 살펴본 추천 시스템 원리와 구축
AWS Personalize 중심으로 살펴본 추천 시스템 원리와 구축Sungmin Kim
 

Tendances (20)

Amazon Aurora 성능 향상 및 마이그레이션 모범 사례 - AWS Summit Seoul 2017
Amazon Aurora 성능 향상 및 마이그레이션 모범 사례 - AWS Summit Seoul 2017Amazon Aurora 성능 향상 및 마이그레이션 모범 사례 - AWS Summit Seoul 2017
Amazon Aurora 성능 향상 및 마이그레이션 모범 사례 - AWS Summit Seoul 2017
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System
 
Google Cloud IAM 계정, 권한 및 조직 관리
Google Cloud IAM 계정, 권한 및 조직 관리Google Cloud IAM 계정, 권한 및 조직 관리
Google Cloud IAM 계정, 권한 및 조직 관리
 
로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법
 
AWS EMR Cost optimization
AWS EMR Cost optimizationAWS EMR Cost optimization
AWS EMR Cost optimization
 
Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나
Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나
Amazon SageMaker 모델 배포 방법 소개::김대근, AI/ML 스페셜리스트 솔루션즈 아키텍트, AWS::AWS AIML 스페셜 웨비나
 
[DevGround] 린하게 구축하는 스타트업 데이터파이프라인
[DevGround] 린하게 구축하는 스타트업 데이터파이프라인[DevGround] 린하게 구축하는 스타트업 데이터파이프라인
[DevGround] 린하게 구축하는 스타트업 데이터파이프라인
 
Data pipeline and data lake
Data pipeline and data lakeData pipeline and data lake
Data pipeline and data lake
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기
 
NiFi 시작하기
NiFi 시작하기NiFi 시작하기
NiFi 시작하기
 
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
 
Amazon DocumentDB vs MongoDB 의 내부 아키텍쳐 와 장단점 비교
Amazon DocumentDB vs MongoDB 의 내부 아키텍쳐 와 장단점 비교Amazon DocumentDB vs MongoDB 의 내부 아키텍쳐 와 장단점 비교
Amazon DocumentDB vs MongoDB 의 내부 아키텍쳐 와 장단점 비교
 
2020.02.06 우리는 왜 glue를 버렸나?
2020.02.06 우리는 왜 glue를 버렸나?2020.02.06 우리는 왜 glue를 버렸나?
2020.02.06 우리는 왜 glue를 버렸나?
 
[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영
 
마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트)
마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트) 마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트)
마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트)
 
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
 
실시간 이상탐지를 위한 머신러닝 모델에 Druid _ Imply 활용하기
실시간 이상탐지를 위한 머신러닝 모델에 Druid _ Imply 활용하기실시간 이상탐지를 위한 머신러닝 모델에 Druid _ Imply 활용하기
실시간 이상탐지를 위한 머신러닝 모델에 Druid _ Imply 활용하기
 
TF에서 팀 빌딩까지 9개월의 기록 : 성장하는 조직을 만드는 여정
TF에서 팀 빌딩까지 9개월의 기록 : 성장하는 조직을 만드는 여정TF에서 팀 빌딩까지 9개월의 기록 : 성장하는 조직을 만드는 여정
TF에서 팀 빌딩까지 9개월의 기록 : 성장하는 조직을 만드는 여정
 
AWS Personalize 중심으로 살펴본 추천 시스템 원리와 구축
AWS Personalize 중심으로 살펴본 추천 시스템 원리와 구축AWS Personalize 중심으로 살펴본 추천 시스템 원리와 구축
AWS Personalize 중심으로 살펴본 추천 시스템 원리와 구축
 
Log design
Log designLog design
Log design
 

Similaire à Airflow를 이용한 데이터 Workflow 관리

Airflow introduce
Airflow introduceAirflow introduce
Airflow introducet lc
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crowJaeseung Ha
 
Multi mechanize
Multi mechanizeMulti mechanize
Multi mechanizeSungMin OH
 
PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2Juwon Kim
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로Jaeseung Ha
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine LearningJEEHYUN PAIK
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기지수 윤
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Node.js and react
Node.js and reactNode.js and react
Node.js and reactHyungKuIm
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Meteor React Tutorial 따라하기
Meteor React Tutorial 따라하기Meteor React Tutorial 따라하기
Meteor React Tutorial 따라하기Jiam Seo
 
Vue.js 기초 실습.pptx
Vue.js 기초 실습.pptxVue.js 기초 실습.pptx
Vue.js 기초 실습.pptxwonyong hwang
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOSConfd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS충섭 김
 
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발영욱 김
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 

Similaire à Airflow를 이용한 데이터 Workflow 관리 (20)

Airflow introduce
Airflow introduceAirflow introduce
Airflow introduce
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
 
Multi mechanize
Multi mechanizeMulti mechanize
Multi mechanize
 
PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine Learning
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Meteor React Tutorial 따라하기
Meteor React Tutorial 따라하기Meteor React Tutorial 따라하기
Meteor React Tutorial 따라하기
 
Nest js 101
Nest js 101Nest js 101
Nest js 101
 
Vue.js 기초 실습.pptx
Vue.js 기초 실습.pptxVue.js 기초 실습.pptx
Vue.js 기초 실습.pptx
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOSConfd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
 
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 

Plus de YoungHeon (Roy) Kim

My sql failover test using orchestrator
My sql failover test  using orchestratorMy sql failover test  using orchestrator
My sql failover test using orchestratorYoungHeon (Roy) Kim
 
ProxySQL & PXC(Query routing and Failover Test)
ProxySQL & PXC(Query routing and Failover Test)ProxySQL & PXC(Query routing and Failover Test)
ProxySQL & PXC(Query routing and Failover Test)YoungHeon (Roy) Kim
 
MySQL Monitoring using Prometheus & Grafana
MySQL Monitoring using Prometheus & GrafanaMySQL Monitoring using Prometheus & Grafana
MySQL Monitoring using Prometheus & GrafanaYoungHeon (Roy) Kim
 
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKMySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKYoungHeon (Roy) Kim
 
MySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKMySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKYoungHeon (Roy) Kim
 

Plus de YoungHeon (Roy) Kim (6)

Query logging with proxysql
Query logging with proxysqlQuery logging with proxysql
Query logging with proxysql
 
My sql failover test using orchestrator
My sql failover test  using orchestratorMy sql failover test  using orchestrator
My sql failover test using orchestrator
 
ProxySQL & PXC(Query routing and Failover Test)
ProxySQL & PXC(Query routing and Failover Test)ProxySQL & PXC(Query routing and Failover Test)
ProxySQL & PXC(Query routing and Failover Test)
 
MySQL Monitoring using Prometheus & Grafana
MySQL Monitoring using Prometheus & GrafanaMySQL Monitoring using Prometheus & Grafana
MySQL Monitoring using Prometheus & Grafana
 
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKMySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELK
 
MySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKMySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELK
 

Airflow를 이용한 데이터 Workflow 관리

  • 3. Airflow Workflow 관리를 위한 플랫폼 airbnb에서 개발 현재 아파치 incubating project
  • 4. 왜 Airflow 인가? 데이터 처리를 위한 복잡한 단계를 flow diagram 형태로 한눈에 볼 수 있다.
  • 5. 왜 Airflow 인가? Python 기반으로 비교적 쉽게 각 task를 작성할 수 있다. t1= PythonOperator( task_id='get_report_data', python_callable=get_report_data, provide_context=True, op_kwargs={'target_day':target_day}, dag=dag ) def get_report_data(**kwargs): target_day=kwargs['target_day'] stmt= """SELECT ~~~~""" %(target_day) a_cursor.execute(stmt) dags/task1.py scripts/task1_lib.py
  • 6. 왜 Airflow 인가? 각 task의 실행 시간을 한눈에 볼 수 있다.
  • 7. 왜 Airflow 인가? 각 task의 실행 이력을 한눈에 볼 수 있고 필요한 경우 특정 task만 실행할 수 있다.
  • 8. 왜 Airflow 인가? 쉬운 job 스케줄 관리 및 전체 job의 실행 상황을 볼 수 있다.
  • 9. 왜 Airflow 인가? 각 task를 병렬로 실행할 수 있다.
  • 10. Airflow 기본 아키텍처 Worker Web Server Dags Scheduler
  • 11. Airflow 설치 #pip install apache-airflow #airflow initdb #airflow webserver –p 8080 웹 브라우저에서 접속 :http://localhost:8080
  • 12. Dags 작성 DAG : Directed Acyclic Graph Task들의 집합 여러개의 Task들이 순서와 Dependency를 갖는다 ~/airflow/dags 디렉토리에 저장
  • 13. Dags 작성 Python Operator t1= PythonOperator( task_id='get_report_data', python_callable=get_report_data, provide_context=True, op_kwargs={'target_day':target_day}, dag=dag )
  • 14. Dags 작성 Python Operator Parameter 설명 task_id 각 Task를 구분하기 위한 Unique한 Task명 python_callable 실제 호출된 python 함수명 provide_context python 함수 호출 시 해당 함수에서 사용될 수 있는 기본적인 argument값을 넘겨줄 지 여부 op_kwargs 기본 argument 외에 추가로 넘겨줄 파라미터 정의 dag default dag 명
  • 15. Dags 작성 작성된 Dag는 변경된 사항을 반영하기 위해서 airflow의 scheduler에 의해서 주기적으로 호출되므로 파일이 너무 크거나 복잡해지지 않도록 만든다 Dag에서는 실제 처리 내용을 정의하기 보다는 처리될 순서가 정의될 수 있도록 하고 실제 처리내용은 별도 파일(lib)에서 호출될 수 있도록 했다
  • 16. Dags 작성 ~/airflow/dags/sample_dag.py execfile('~/airflow/scripts/sample_dag_lib.py') t1= PythonOperator( task_id='get_report_data', python_callable=get_report_data, ……. ) t2= PythonOperator( task_id='upd_add_data', python_callable='upd_add_data', ……. ) t2.set_upstream(t1) ~/airflow/scripts/sample_dag_ lib.py def get_report_data(**kwargs): ……. ……. def upd_add_data(**kwargs): ……. ……. )
  • 17. Dags 작성(xcom) # 값을 넘겨줄 때 def push_value(**kwargs): val_a=1 ti=kwargs['ti'] ti.xcom_push(key='push_value1', value=val_a) # 값을 받을 때 def get_value(**kwargs): ti=kwargs['ti'] val_b=ti.xcom_pull(task_ids='push_value', key='push_value1') Task 간의 데이터 전달은 xcom을 사용
  • 18. Scheduler 및 Job 실행 #airflow scheduler 웹 페이지에서 생성된 Dag를 enable 시키고 수동으로 수행시킬 수 있다
  • 19. Task 실행 상태 확인(Graph view) 수행중인 Dag를 클릭한 후 Graph View에서 실행 상태를 볼 수 있다
  • 20. Task 실행 상태 확인(Gant view) Gant View에서 각 Task의 실행에 소요된 시간을 볼 수 있다
  • 21. Task의 병렬 실행 But...각 Task가 병렬로 실행되지 않고 Sequential하게 실행되는 것을 볼 수 있다
  • 22. Task의 병렬 실행 Task를 병렬로 실행하려면 아래 조건이 필요하다 - 실제 Task를 실행하는 airflow의 worker를 sequential executor가 아닌 celery executor를 사용해야 함 - celery executor 사용을 위해서는 Broker 가 필요한데 이를 위 해 RabbitMQ나 Redis가 필요함 - airflow의 meta store로 sqlite가 아닌 mysql이나 postgresql 을 사용해야 함
  • 23. 병렬 실행을 위한 Airflow 아키텍처 Worker Worker Worker Web Server Dags Scheduler Worker Worker [ Celery ]
  • 24. MySQL 설치 및 설정 # yum install mysql.x86_64 mysql> create database airflow; mysql> create user airflow@'10.xx.xx.xx' identified by 'airflow_pwd'; mysql> grant ALL PRIVILEGES ON airflow.* to airflow@'10.xx.xx.xx'; my.cnf에 아래 설정 추가 explicit_defaults_for_timestamp = 1 max_allowed_packet = 30M
  • 25. MySQL 설치 및 설정 MySQL start 및 airflow db 초기화 # /etc/init.d/mysql start # airflow initdb xcom으로 전달되는 데이터의 크기 확장을 위해 컬럼 타입 변경 mysql> alter table airflow.xcom modify value LONGBLOB;
  • 26. RabbitMQ 설치 및 설정 # yum install rabbitmq-server.noarch # rabbitmq-server # rabbitmqctl add_user airflow airflow Creating user "airflow" ... ...done. # rabbitmqctl add_vhost airflow_vhost Creating vhost "airflow_vhost" ... ...done. # rabbitmqctl set_user_tags airflow airflow Setting tags for user "airflow" to [airflow] ... ...done. # rabbitmqctl set_permissions -p airflow_vhost airflow ".*" ".*" ".*" Setting permissions for user "airflow" in vhost "airflow_vhost" ... ...done.
  • 27. airflow.cfg 설정 # vi ~/airflow/airflow.cfg # executor를 default인 SequentialExecutor에서 CeleryExecutor로 변경 executor = CeleryExecutor # db connection을 sqlite에서 mysql로 변경 sql_alchemy_conn = mysql://airflow:airflow@10.xx.xx.xx/airflow # Celery broker URL을 rabbitmq로 설정 broker_url = amqp://airflow:airflow@10.xx.xx.xx:5672/airflow_vhost # Celery가 job을 수행한 결과를 저장한 db metastore 설정 celery_result_backend = db+mysql://airflow:airflow@10.xx.xx.xx:3306/airflow
  • 28. airflow restart # airflow webserver -p 8080 -- celeryExecutor는 별도 worker 실행이 필요하다 # airflow worker # airflow scheduler
  • 30. Sequential 실행 시에 발생하지 않던 DB Lock 발생 해당 작업의 특성 상 특정 일자 데이터 범위를 조회/추가/변경 하는 로직으로 동일 테이블의 Task를 병렬로 수행 시 Lock경합이 발생함 각 Task의 실행 순서를 조정해서 Lock 문제 해결 But..병렬 실행으로 인한 경합 발생
  • 31. Gant view에서 각 Task가 병렬로 수행됨을 확인할 수 있다 Task 병렬 수행 및 경합 해소 확인
  • 32. - 데이터 처리 Flow를 쉽게 파악할 수 있다 - 데이터 처리를 위한 배치를 통합해서 관리할 수 있다 - 웹페이지를 통해 매일 배치 수행 현황을 쉽게 확인할 수 있다 - 배치 실패 시에 특정 Task만 별도로 수행함으로써 문제를 쉽게 해결할 수 있다 Airflow 적용 후 개선점