Airflow at Pronto

ทุกวันนี้เรามีการเก็บข้อมูลที่เข้ามาเรื่อยๆ เป็นจำนวนมาก และต้องจัดการ ผ่านกระบวนการต่างๆ เป็นขั้นเป็นตอน เช่น ดึงข้อมูลมาจากหลายๆ แหล่ง แล้วนำมาทำความสะอาดข้อมูล (data cleansing) สุดท้ายก็นำไปโหลดเข้าอีกระบบหนึ่งเพื่อใช้ประโยชน์ไม่ว่าจะเป็นในทางธุรกิจหรือการพัฒนาองค์กร เป็นต้น เราเรียกขั้นตอนเหล่านั้นว่า Extract, Transform, Load (ETL) บทความนี้จะมาพูดถึง Airflow ว่าได้เข้ามาช่วยชีวิตเราที่ Pronto ได้อย่างไร 🙂

ขอเริ่มเกริ่นที่ ETL ก่อนนะ ขั้นตอน ETL นั้นถือได้ว่าเป็นหัวใจสำคัญของ Data Engineering เลยก็ว่าได้ ซึ่งงานส่วนใหญ่จะเป็นแนว scheduled automation หรือถ้าพูดให้ geek ขึ้นมาหน่อยก็..​ เขียนโค้ดแล้วจับตั้งเวลาให้มันทำงานตามที่เราต้องการไงล่ะ

ใช้ Cron เข้ามาช่วย

ทางเลือกหนึ่งคือใช้ Cron มาตั้งเวลาให้ไปสั่งคำสั่งที่เราต้องการให้ทำงานตามเวลาที่เรากำหนด ตัว expression ของ Cron จะหน้าตาประมาณนี้

*/5 * * * * echo "Hello, World!"

Cron expression จะประกอบไปด้วยฟิลด์ 5 ฟิลด์ (ที่เอาไว้กำหนดว่าเราจะให้คำสั่งนั้นๆ ทำงานตอนไหน) และตามด้วยคำสั่ง (อะไรก็ได้) ตาม expression ด้านบนแปลได้ว่า เราจะรัน คำสั่ง echo "Hello, World!" ทุกๆ 5 นาที ถ้าใครจำไม่ได้ว่าต้องเขียน expression อย่างไร แนะนำเว็บ crontab.guru ลองเข้าไปดูเนอะ 😉

Cron เป็นวิธีการหนึ่งที่ใช้ได้ง่ายมาก แต่เมื่อเวลาผ่านไป ด้วยปริมาณและความซับซ้อนของงานก็มากขึ้นตามไปด้วย ข้อเสียเหล่านี้เริ่มมีผลกระทบต่อเรามากขึ้นเรื่อยๆ

  1. เราไม่รู้เลยว่า scheduled task หรือ job นั้นๆ fail หรือไม่ เรื่องนี้ critical เลยทีเดียว เหมือนเราไม่รู้ว่าสิ่งที่เราทำลงไปมันทำงานได้จริงหรือไม่ มีปัญหาอะไร การรับมือเรื่อง task ที่ fail เราจำเป็นที่ต้องไปตาม retry เอง ลำบากชีวิต..
  2. งานที่มี dependency กันก็ค่อนข้างวุ่นวาย เนื่องจาก Cron จะทำงานตามคำสั่ง ณ เวลาที่กำหนดไว้ ทำให้ต้องกำหนดงานแต่ละงานในช่วงเวลาที่แตกต่างกัน เช่นงาน A ใช้เวลา 1 ชม. แล้วให้ทำงาน B ต่อ เราก็ต้องตั้งเวลาของงาน B ให้ห่างกับงาน A อย่างน้อย 1 ชม. แล้วถ้าอยู่ดีๆ งาน A ใช้เวลานานเกิน 1 ชม. ล่ะ? จะเกิดอะไรขึ้นนะ 🙂 ดังนั้นข้อควรระวังคือ แต่ละงานจะสั่งให้ทำติดต่อกันไม่ได้ทันทีที่จบ เราควรจะมี gap ระหว่างแต่ละงานไว้เสมอ
  3. Cron ของเราถ้ายิ่งมีเยอะ มันก็จะ maintain ลำบาก ยิ่งถ้าเราต้องการให้งานแต่ละงานเขียนลง log ด้วยแล้ว เราต้องเอาระบบ log อีกระบบหนึ่งมาช่วย
  4. ไม่มีหน้า user interface (UI)
  5. ด้วยเหตุผลต่างๆ ที่เกิดขึ้นทำให้ Cron นั้นไม่ scalable

การมาของ Airflow

การมาของ Airflow เป็นอะไรที่ช่วยชีวิตของพวกเราชาว Pronto เป็นอย่างมากกกกก เป็นระบบที่ทำ workflow management ที่ช่วยเรื่อง scheduling and monitoring งานต่างๆ และอีกทั้งยังได้ถูกออกแบบมาใช้ทำ ETL ได้เป็นอย่างดี ระบบนี้เริ่มต้นพัฒนาโดย AirBnB ในปี 2014 และได้เข้าร่วม Apache Incubator Projects ในปี 2016 ยังใหม่ๆ อยู่เลยทีเดียว

จริงๆ แล้วมีระบบที่เป็น workflow อย่างเช่น LuigiOozieAzkaban มีคนใจดีเขียนเปรียบเทียบระบบพวกนี้ไว้ที่ Open Source Data Pipeline - Luigi vs Azkaban vs Oozie vs Airflow แต่พวกเรามองว่า Airflow นี่แหละตอบโจทย์สำหรับเรามากที่สุดแล้ว ข้อดีก็มีเยอะมากไม่ว่าจะเป็น

  • การสร้าง workflow คือการสร้าง Directed Acyclic Graph (DAG)
  • วิธีการสร้าง DAG เราเขียนด้วยภาษา Python (configuration as code!)
  • โปรเจคเป็น active development มี community ที่ใหญ่
  • หน้า UI สวยงาม
  • และอื่นๆ อีกมากมาย..

ตัวอย่างการสร้าง DAG ก็จะเป็น Python ประมาณนี้

from datetime import datetime

from airflow import DAG
from airflow.operators.bash_operator import BashOperator


default_args = {
    'owner': 'prontotools',
    'start_date': datetime(2017, 5, 8),
    'email': ['[email protected]']
}

dag = DAG(
    'pronto_dag_example',
    default_args=default_args,
    schedule_interval='*/5 * * * *'
)

t1 = BashOperator(
    task_id='print_date',
    bash_command='date',
    dag=dag
)

t2 = BashOperator(
    task_id='sleep',
    bash_command='sleep 5',
    dag=dag
)

t3 = BashOperator(
    task_id='hello',
    bash_command='echo "hello"',
    dag=dag
)

t2.set_upstream(t1)
t3.set_upstream(t2)

จากโค้ดด้านบนเราตั้ง schedule_interval ไว้เป็น */5 * * * * นั่นหมายความว่า DAG นี้จะรันทุกๆ 5 นาทีนั่นเอง ส่วนหน้า UI จะแสดงผล DAG ออกมาตามรูปที่ 1 (Graph View) ด้านล่างนี้

Airflow Graph View - Pronto DAG Example

รูปที่ 1: Airflow Graph View - Pronto DAG Example (Airflow UI)

งาน 3 งานที่เราสร้างไว้ก็จะทำงานตามลำดับ ถ้ามีงาน fail ระหว่างทาง DAG ก็จะหยุดรัน เราสามารถเข้ามาดู log หรือมาวิเคราะห์สิ่งที่เกิดขึ้นได้

Airflow ที่ Pronto

ที่ Pronto เราดูแลเว็บไซต์ให้กับลูกค้า แล้วเราก็อยากรู้ว่า traffic ที่เข้าเว็บไซต์ของลูกค้าเป็นอย่างไรบ้าง ดีขึ้นหรือเปล่า ข้อมูล traffic กลุ่มของลูกค้าที่เป็น IT Consultant เทียบกับกลุ่มของลูกค้าที่เป็น Health & Fitness เป็นอย่างไรบ้าง เราอยากได้ข้อมูลเหล่านี้มาวิเคราะห์ก็เลยสร้าง DAG หรือ data pipeline ขึ้นมาตามรูป 2

Google Analytics Traffic Data Pipeline ที่ Pronto

รูปที่ 2: Google Analytics Traffic Data Pipeline ที่ Pronto

เนื่องจากตอนนี้อยู่ในช่วงเริ่มต้นอยู่เลยทำ DAG ง่ายๆ มา มีแค่ 3 งานคือ

  1. ส่งเลข Google Analytics profile ID เข้าไปที่ SQS
  2. ค่อยๆ ดึงเลข profile ID จาก SQS มา เพื่อเอาไปดึงข้อมูล traffic จาก Google Analytics อีกที
  3. เมื่องานเสร็จก็ส่งข้อความเข้า Slack แจ้งเตือนทีมซะหน่อย (ชื่อ Bearbot เป็นชื่อบอทที่เราตั้งขึ้นมาเอง)

การสร้าง DAG หรือ data pipeline ค่อนข้าง flexible มากๆ และมีอะไรให้เล่นค่อนข้างเยอะ ลองตามไปอ่าน Documentation กันดู

ใครติดใจอยากรู้เพิ่มเติม ไปฟังดร.กานต์ของเราในรายการกูโค้ดกัน!

แล้วก็สุดท้ายท้ายสุดถ้าใครสนใจก็ติดต่อพวกเรามาได้นะ ถามมาในคอมเม้นต์ก็ได้จ้า 😀


Mils Burasakorn

Mils Burasakorn

  • สุดยอดครับ

  • Kan Ouivirach

    5555 จัดไปครับ

  • nuboat in wonderland

    ผมจะไปเพราะคนพูดเนี่ยแหละ

  • Kan Ouivirach

    น้องคนที่เขียนบล็อกนี้จะไปพูดเรื่องนี้ที่ Code Mania 101 นะครับ ขอเชิญๆ ^^

  • น่าสนใจมากครับ เบื่อใช้ cron แล้วเหมือนกัน บางทีติดตามยาก! ^^