https://widget-platform.oho.chat/widgets/images/Email.png
https://widget-platform.oho.chat/widgets/images/Line.png
https://widget-platform.oho.chat/widgets/images/Messenger.png

บทเรียน (ราคาแพง) จากการใช้งาน Apache Airflow

ทุกวันนี้ในการพัฒนาระบบต่าง ๆ พวกเรามีเครื่องมือที่หลายหลากโดยแต่ละตัวก็จะมีข้อดีข้อเสียที่แตกต่างกันไป ขึ้นอยู่กับการใช้งาน แต่การที่เรานำ tools ต่าง ๆ มาใช้โดยที่ไม่ได้ศึกษาให้ละเอียดเสียก่อนก็อาจจะสร้างปัญหาให้เราได้เช่นกัน วันนี้ผมอยากเล่าถึงประสบการณ์ของทีมที่เกิดเมื่อเร็ว ๆ นี้ จากการมองข้ามข้อจำกัดเล็ก ๆ ของการใช้งาน platform อย่าง Apache Airflow กันครับ สิ่งเล็ก ๆ ที่เรามองข้ามไปก็สามารถส่งผลกระทบที่ยิ่งใหญ่ได้เช่นกัน

มาทำความรู้จักกับ Apache Airflow

ก่อนอื่นผมอยากพาทุกคนมารู้จักกับ Apache Airflow กันก่อนครับ Apache Airflow คือ open source platform ที่สามารถช่วยในการจัดการ data pipelines workflow ด้วย Python ได้ โดยจะมีการแบ่งงานเป็นชุด ๆ หรือ tasks และการทำงานของกลุ่มงานที่อยู่ใน workflow เดียวกันจะถูกเรียกว่า Directed Acyclic Graph (DAG) กระบวนการเหล่านี้สามารถทำให้เราจัดการและตรวจสอบการทำงานที่ซับซ้อนได้อย่างมีประสิทธิภาพมากขึ้น ทำให้ Airflow นิยมนำมาทำ Extract, Transform, Load (ETL) กับข้อมูล

ตัวอย่าง DAG ที่ถูกสร้างขึ้นใน Airflow

โดยการทำงานของ Airflow จะเริ่มต้นเมื่อ user ตั้งค่ารอบของการทำงานไว้ จากนั้นจากนั้น Airflow จะมีสิ่งที่เรียกว่า Airflow scheduler ที่จะเช็กว่า DAG นั้น ถึงเวลาที่จะต้องทำงานแล้วหรือยัง และเมื่อถึงเวลานั้นแล้ว Airflow scheduler ก็จะสั่งให้ DAG นั้น ๆ ทำงานนั้นเองครับ

Diagram การทำงานของ Airflow ที่มา :https://medium.com/@bageshwar.kumar/airflow-architecture-a-deep-dive-into-data-pipeline-orchestration-217dd2dbc1c3

เหตุการณ์ที่เกิดขึ้น

หลังจากที่เรารู้จักกับ Airflow ไปแล้วเรามาพูดถึงเหตุการณ์ที่เกิดขึ้นกันดีกว่า โดยเมื่อไม่นานมานี้เราพบว่ามีค่าใช้จ่ายในส่วนของ Google Cloud Stroage (GCS) บนบัญชีของ Boonmee Lab เพิ่มขึ้นโดยที่เราไม่ทราบว่าอะไรคือสาเหตุของการเพิ่มขึ้นของการใช้จ่ายในครั้งนี้

โดยเบื้องต้นเราได้คาดการไว้ว่าสามารถเกิดขึ้นได้ 3 สาเหตุด้วยกันคือ

  1. มีการใช้งานเพิ่มขึ้นจากเดิม เพราะโปรเจ็คนี้มี open data ทำให้ใครก็สามารถเข้ามาใช้ข้อมูลนี้ได้ เหตุผลข้อนี้ถูกปัดตกไปเพราะลักษณะการเรียกใช้ข้อมูลมีการเรียกใช้ข้อมูลที่มีขนาดใหญ่และมีความถี่ในหลักวินาที ไม่น่าเป็นการใช้งานของผู้ใช้ทั่วไป

Log การเรียกใช้ Google Cloud Storage API ใน Google Cloud Platform 
  1. อาจจะมี Bot ที่เข้ามาเรียกข้อมูลเรื่อย ๆ เพราะจากลักษณะของการเรียกข้อมูลที่เขียนไปข้างต้น แต่ก็ถูกปัดตกไปเพราะ API ทั้งหมดถูกเรียกจาก internal เอง
  2. สาเหตุสุดท้ายคือ มี Service บางอย่างของ Boonmee Lab ทำการเรียกข้อมูลชุดนี้เอง

ทำไม Service ของ Boonmee Lab ถึงมีการเรียกใช้ข้อมูลที่เพิ่มขึ้น ?

เมื่อเรารู้ถึงสาเหตุแล้ว ทำให้เราสามารถหาต้นตอของปัญหาได้ง่ายขึ้น เมื่อย้อนไปในวันที่ค่าใช้จ่ายเพิ่มขึ้นในโปรเจ็คนั้นมีการอัปเดตโค้ด util ที่จะเป็น function กลางสำหรับเรียกใช้งาน DAG เกี่ยวกับการเรียกข้อมูลผ่าน API โดยโค้ดนี้ถูกรันทั้งที่ไม่ได้ มี DAG ตัวไหนเรียกใช้เลยก็คือ Airflow scheduler นั่นเองครับ

def get_GCS_object (...):
	...
	return files_opendata_ds_009_list_file
files_opendata_ds_009_list_file = get_GCS_object()

โดยทั่วไปการทำงานของ Airflow จะถูกตั้งค่าอยู่ใน Function DAG() ตามตัวอย่าง

with DAG(
    dag_id='data-set-009',
    default_args={
        'depends_on_past': False
    },
    start_date=datetime(2022, 11, 1, 0, 0, 0),
    schedule_interval='0 0 14 * *',
    catchup=True
) as dag:    
    
    start = DummyOperator(
        task_id='start'
    )

    ingestion_ds_009_001 = PythonOperator(
        ...
    )
    
    clean_ds_and_gx = PythonOperator(
        ...
    )
    
    opendata_ds_009_list_file = PythonOperator(
        ...
    )
    
    copy_dataset_to_catalog = GCSToGCSOperator(
        ...
        
    )
    
    make_data_public = PythonOperator(
       ...
    )
    
    finish = DummyOperator(
        task_id='finish'
    )

เมื่อเราต้องการให้เกิดกระบวนการบางอย่างขึ้น เราก็สามารถสร้าง task ใน function ของ DAG ได้เลย โดยที่ function อื่น ๆ ที่ไม่ได้ถูกเรียกโดย task ก็จะไม่ทำงาน จากตัวอย่างจะเห็นได้ว่า DAG ที่ชื่อว่า “data-set-009” มีการทำงานตาม task “ingestion_ds_009_001”, “clean_ds_and_gx”, “opendata_ds_009_list_file”, “copy_dataset_to_catalog”, และ “make_data_public” ตามลำดับ โดย DAG นี้จะทำงานตาม Schedule ที่เรากำหนดไว้ คือทุกวันที่ 14 ของเดือน และหาก DAG ไม่ได้ทำงาน ค่าใช้จ่ายของ GCS ก็ไม่ควรที่จะเกิดขึ้น

อย่างที่เขียนไปข้างบน โค้ดที่เกี่ยวข้องกับการใช้งาน GCS API ที่อยู่ในไฟล์ util ยังมีการถูกเรียกใช้งานอยู่เรื่อย ๆ ทั้งที่ไม่ได้มีการเรียกจาก DAG ไหนเลย เพราะ Airflow Scheduler ทำการ health check ไฟล์ต่าง ๆ ที่เป็นส่วนประกอบของ DAG ว่ามีปัญหาหรือ error หรือเปล่า ทำให้การทำงานที่อยู่นอก function scope ถูกเรียกใช้งานเพื่อตรวจเช็กนั่นเอง

สิ่งที่ทีมได้เรียนรู้

โดยสิ่งที่ทางทีมได้เรียนรู้จากเหตุการณ์ครั้งนี้ 2 เรื่องหลัก ๆ คือ

  1. การเข้าใจพฤติกรรมของสิ่งที่ใช้งานอย่างถี่ถ้วน: โดยทีมได้เห็นถึงความสำคัญในการเข้าใจการทำงานของเครื่องมือของเรา เช่น Apache Airflow มากขึ้น
  2. การ encapsulate code : โดยเหตุการณ์นี้แสดงให้เห็นถึงความสำคัญของการ Encapsulate code ของ function ต่าง ๆ เพื่อป้องกันการเรียกใช้งานโดยไม่ได้ตั้งใจ

สุดท้ายผมและทีม Boonmee Lab เชื่อว่าการแบ่งปันประสบการณ์ของเราอย่างเปิดเผยจะสามารถเป็นความรู้และสร้างความเข้าใจต่อการพัฒนา Software ได้มากขึ้นและมีประสิทธิภาพมากขึ้นนั่นเองครับ

สรุปแล้วราคาที่ Boonmee Lab ต้องจ่ายในครั้งนี้คือ 80,000 บาทนั่นเอง