Apache Airflow ว่ากันด้วย Path File และ การทำ Local Python library
เมื่อมีเหตุที่เราต้องเรียกใช้ไฟล์อื่นๆ ที่อยู่นอกเหนือสคริปไฟล์ เช่น การ Access ที่ต้องการ Credential key หรือแม้กระทั่งอยากทำ Reusable Code Functions ปัญหาที่ตามมาคือ จะการเรียกใช้งานมันยังไง !?
เริ่มจาก เคสการเรียกใช้งานไฟล์ภายนอกสคริปก่อนครับ
สมมุติว่า ผมมี Airflow อยู่ตัวนึง และสร้าง Folder ขึ้นมาใหม่เพื่อเก็บ key ต่างๆ ที่ชื่อว่า keys และโยนไฟล์ google-credential.json ลงไป
คำถามคือจะเรียกใช้มันยังไง?
คำตอบโดยทั่วก็เรียกใช้ตามแบบปกติ
คือ “./” (Current directory) ตามด้วย folder + file
เช่น
GOOGLE_APPLICATION_CREDENTIALS=”./keys/google-credential.json”
แต่กลายเป็นว่ามันใช้ไม่ได้ / มองไม่ไม่เห็นไฟล์ !!
สาเหตุนั้นก็คือ ในทุกๆ DAG ตัว Airflow จะสร้าง Temporary Location ขึ้น ตามรูป
วิธีแก้ไขคือ เราต้อง browse ตั้งแต่ home directory เลย !!
แต่ … แล้ว home directory มันอยู่ที่ไหน ??
วิธีตามล่าหา home directory เลือกที่ Menu : Admin > Configuration คลิกเข้าไป
จากลองดูใน config file ในหัวข้อ dags_folder
สาเหตุที่ต้องใช้ dag_folder เพราะ dag_folder เปรียบเสมือน home directory ของ Airflow script ซึ่ง Airflow จะแสกนหา dag script จาก path นี้เท่านั้น และไม่รวม sub directory
( หากทำ sub directory เช่น dags/sub_script/dag_example.py Airflow ก็จะมองไม่เห็น script ตัวนี้เช่นกัน )
ตัดกลับมาที่ตัวอย่างโค้ดเดิม คือ
GOOGLE_APPLICATION_CREDENTIALS=”./keys/google-credential.json”
ก็จะถูกเปลี่ยนเป็นโค้ดที่ถูกต้อง ดังนี้
GOOGLE_APPLICATION_CREDENTIALS=”/home/airflow/gcs/dags/keys/google-credential.json”
เท่านี้เราก็สามารถเรียกใช้ไฟล์จากภายนอก script ได้แล้ว !!
ยัง ยังไม่หมด !! ถ้าเราอยาก Reusable Code Function หรือ Local Python library ของเราเองหละจะทำยังไง ??
Step1 : เริ่มต้นคือ สร้าง Folder ใหม่ขึ้นภายใน “/dags” Folder
ในตัวอย่างสร้าง Folder ชื่อ “dependencies” (อันนี้ จะตั้งชื่ออะไรก็สุดแล้วแต่เรา)
Step2 : สร้างไฟล์เปล่าๆ ชื่อ “__init__.py” ภายใน sub folder “dependencies/”
Step3 : สร้างไฟล์ “.py” และข้างในคือ function code ในตัวอย่างชื่อ ”coin_module.py” (อันนี้ จะตั้งชื่ออะไรก็สุดแล้วแต่เรา)
ตัวอย่าง ผมสร้าง function นึงไว้ใน “coin_module.py” ชื่อ “exchange_coin”
Step4: มาถึงตอนนี้เราสามารถเรียกใช้งาน local function ภายใน Airflow script ได้แล้ว วิธีใช้งานคือ
วิธี import file
from (1)ชื่อsubfolder import (2)ชื่อไฟล์
วิธีเรียกใช้งาน function
(2)ชื่อไฟล์.(3)ชื่อlocal_function
หวังว่าจะมีประโยชน์นะครับ ขอบคุณครับ :)