Apache Airflow ว่ากันด้วย Path File และ การทำ Local Python library

Pratya Thanwatthanakit
3 min readMar 23, 2020

--

เมื่อมีเหตุที่เราต้องเรียกใช้ไฟล์อื่นๆ ที่อยู่นอกเหนือสคริปไฟล์ เช่น การ Access ที่ต้องการ Credential key หรือแม้กระทั่งอยากทำ Reusable Code Functions ปัญหาที่ตามมาคือ จะการเรียกใช้งานมันยังไง !?

เริ่มจาก เคสการเรียกใช้งานไฟล์ภายนอกสคริปก่อนครับ

สมมุติว่า ผมมี Airflow อยู่ตัวนึง และสร้าง Folder ขึ้นมาใหม่เพื่อเก็บ key ต่างๆ ที่ชื่อว่า keys และโยนไฟล์ google-credential.json ลงไป

/dags directory

คำถามคือจะเรียกใช้มันยังไง?
คำตอบโดยทั่วก็เรียกใช้ตามแบบปกติ
คือ “./” (Current directory) ตามด้วย folder + file

เช่น
GOOGLE_APPLICATION_CREDENTIALS=”./keys/google-credential.json
แต่กลายเป็นว่ามันใช้ไม่ได้ / มองไม่ไม่เห็นไฟล์ !!

สาเหตุนั้นก็คือ ในทุกๆ DAG ตัว Airflow จะสร้าง Temporary Location ขึ้น ตามรูป

Airflow — View Log

วิธีแก้ไขคือ เราต้อง browse ตั้งแต่ home directory เลย !!
แต่ … แล้ว home directory มันอยู่ที่ไหน ??

วิธีตามล่าหา home directory เลือกที่ Menu : Admin > Configuration คลิกเข้าไป
จากลองดูใน config file ในหัวข้อ dags_folder

Airflow.cfg

สาเหตุที่ต้องใช้ 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

หวังว่าจะมีประโยชน์นะครับ ขอบคุณครับ :)

--

--