SlideShare uma empresa Scribd logo
1 de 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

Mais conteúdo relacionado

Mais procurados

Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1 나무기술(주) 최유석 20170912
Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1  나무기술(주) 최유석 20170912Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1  나무기술(주) 최유석 20170912
Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1 나무기술(주) 최유석 20170912Yooseok Choi
 
Data pipeline and data lake
Data pipeline and data lakeData pipeline and data lake
Data pipeline and data lakeDaeMyung Kang
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
 
로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법Jeongsang Baek
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유Hyojun Jeon
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기AWSKRUG - AWS한국사용자모임
 
[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영NAVER D2
 
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)Seongyun Byeon
 
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안SANG WON PARK
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기Arawn Park
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템NAVER D2
 
Massive service basic
Massive service basicMassive service basic
Massive service basicDaeMyung Kang
 
[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?
[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?
[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?Juhong Park
 
[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)NAVER D2
 
데이터는 차트가 아니라 돈이 되어야 한다.
데이터는 차트가 아니라 돈이 되어야 한다.데이터는 차트가 아니라 돈이 되어야 한다.
데이터는 차트가 아니라 돈이 되어야 한다.Yongho Ha
 
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
성장을 좋아하는 사람이, 성장하고 싶은 사람에게성장을 좋아하는 사람이, 성장하고 싶은 사람에게
성장을 좋아하는 사람이, 성장하고 싶은 사람에게Seongyun Byeon
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리Junyi Song
 
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Seongyun Byeon
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3Heungsub Lee
 

Mais procurados (20)

Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1 나무기술(주) 최유석 20170912
Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1  나무기술(주) 최유석 20170912Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1  나무기술(주) 최유석 20170912
Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1 나무기술(주) 최유석 20170912
 
Data pipeline and data lake
Data pipeline and data lakeData pipeline and data lake
Data pipeline and data lake
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
 
[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영
 
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
 
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템
 
Massive service basic
Massive service basicMassive service basic
Massive service basic
 
[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?
[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?
[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?
 
[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)
 
데이터는 차트가 아니라 돈이 되어야 한다.
데이터는 차트가 아니라 돈이 되어야 한다.데이터는 차트가 아니라 돈이 되어야 한다.
데이터는 차트가 아니라 돈이 되어야 한다.
 
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
성장을 좋아하는 사람이, 성장하고 싶은 사람에게성장을 좋아하는 사람이, 성장하고 싶은 사람에게
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
 
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
 

Semelhante a 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
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 

Semelhante a 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장
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 

Mais 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
 

Mais 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 적용 후 개선점