由於tasks都透過pod來運行了,若沒有特別設置Volume等動作將運行的log儲存在本地端,等到tasks都跑完了但卻發生錯誤,這時因為pod在運行完畢也跟著被刪除,log資料也會跟著不見,這時候就摸不著頭緒到底task發生什麼狀況!!!
所以這篇也會分享如何將log存到Google Cloud Storage內,並且能夠在檢視task log時,可以看到運行的結果
若還沒有使用過Airflow KubernetesExecutor
的讀者們,建議先看這篇使用Airflow-KuberenetesPodOperator與KubernetesExecutor
再過來繼續服用本篇
使用的Airflow版本為 : 2.1.0
設定Google Cloud Storage
來到Google Cloud的portal,點擊 cloud storage
建立一個值區 (bucket),用來儲存資料
並替這個值區命名,其他的就先依照預設的設定就好
可以看到bucket已經創建完畢
儲存到該bucket的路徑為 : gs://airflow_bucket_1234
接著透過 gsutil
測試一下是否可以將檔案上傳到 gs://airflow_bucket_1234
1 gsutil cp -r {local_file_path} gs:// {bucket-name} / {gcs_file_path}
local_file_path建議用絕對路徑
接著會看到權限認證的問題,表示新增完畢的bucket有限制存取
1 2 3 4 gsutil cp -r /Users/xxxxx/xxxxx gs: Copying file : [Content-Type =application/octet-stream]... AccessDeniedException: 403 xxxxxx@gmail.com does not have storage.objects.create access to the Google Cloud Storage object .
開放GCS bucket的權限給特定身份
接著我們來產生一個給airflow使用的帳戶
請到 IAM與管理 > 服務帳戶,新增一個給airflow使用的帳戶
只給airflow具備GCS的存取存限
建立完畢後,可以看到新產生的airflow帳戶,接著進入該帳戶產生一把金鑰供airflow使用
新增完畢後,就會自動下載到本機,key的內容大概會長如下
supple-bank-315301-a8f556f62bb8.json
1 2 3 4 5 6 7 8 9 10 11 12 { "type" : "service_account" , "project_id" : "supple-bank-315301" , "private_key_id" : "a8f556f62bb8de28ce6e86b18010799595117e8e" , "private_key" : "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHHLRw07Cik+Wp\n163R2z9k7U/gSaA+lE4Z6tYcbkkxnjtqVnw/3FiUbSaVmGp6yeAbPK0Vosir7LF7\nhiZlS65VKWX0so7uEmr2mh5fcPtXtzFg0VT+FS1izwcXOpKECFBKy4ILcdakgvo7\nmaJnv54A8xbNcqUFsxFrjNpdEG/gttK4ZH7GsVWgy33gOdMCSoU60xO1fY7YE7UK\nlA0ZGy+FfiOvj2Mv2m/2+iTRoFiTDZedEJIMFIRryuvdd4H1XzrC9Co3fY9LQPxd\n799NkPOupp8GiwxjE/yAFLbOr7Y+Br166UZWlRQuUmMD8KAyAsVq/XUvSJy/KQif\n+wQSxSf1AgMBAAECggEAD2U4ISPdG9T/rwWO2mkaGmhXAr/un1LBmd4UjBeNmaa3\nfYi5DAmyN60bjKQ/p3AwidVD33u6CcEVarhRWQe5r7qxuB04+/jPQx4LjH755YBe\nqwkZ30OCl4nrwcS09iHbw3dqKLm2n6XDn2lzqz31A5xy05PdD/cWjmWnr1vJVWs/\nyDh1KhEq1C/FaL/p7tCdhwVQROwlWO6K8O05OEw97QRScyk6LYvWh+/vV9shwjxc\nuZPvUHZipJ2EnJ07X9NSXHLTRv4CCwU6sbx6TGlCZ1YSwW1u3BVYhp4zDuS+m6OV\nQZOpahKQdojhksvD3o29WHNnWakMwPTYMVCIyYGCSQKBgQDwZwWLf7PTJcdBxhne\nJwsrOqjrdsGAo6rbPSg/5TLed79Z/tf1tz2Pc6uRWPZnn7SafmSMZWDy9CjEHbLW\nCNa3TYnLiVoILr5IyAUJL5X44eSdwnEPhM0492JYZmoy7jKcHT+GmZJGaeGQ2yAr\nhyLiChlg0DUIuV8TF3OiTzt8TwKBgQDUB96YFGLxDNmS5hLA0WtAsRwDjkyHMgYb\nrFbYaJwfJN7pYBp6xO4tFBKg9C1hEZ6fqVT7bRcrvM21Uk36CpL6fp4VCCIyFdhU\ndXVKzmrbPtdAk1crXuw8Rx6H6baABogjIECM9m+hOIjLpFFZKy47gkNv5Ji6Jdaz\nCpjbR0cyewKBgQDU26NBPTVQA+dGCc3lsdRl1m6y7levOzuRG7mDucEs0gKQAOHf\nIvxTBCwpagfjALm9AaSt2yXYeO+Plmw+r1zOuM0FdvxMunapotEyrPuxfvIZ7YyG\nHSRJCGH/u87Ugaw2Jn+VAm1OA3pB9IOrhuAQHLkTy8bpjpjsIpu0X0tgaQKBgQC0\nXE1ZCF5xtgCOGO/y3TFiwkWWMMGgb0kK2Tq2s6W6SF7mHj3oGQSRi/WcvJitbZOF\nNUF47n87UUua5fw2qjAErRhDw7ty52oxzgiMLbJv9bCc2bjYx9IkJEswSfpYRTYg\nyxqdzjN+7NxQfeJE+5pEPLaow8e28OEFRApq3OMPaQKBgC5SDSYHAfN+aWIBtxqG\n90Nl5PO4LGk40Fh6rneKysUZ13J+M8rBWW+U0wk9ykBqa3pdmWW7qDa3qFRipbTs\nPAgaG55yBODuLGHMnXVPbZa6uAeWyLS177Ft0i+iLpWoB8wpq8xMeK4Y/XOkPm6e\nKTnUI5APWx1K5KIWieL3KnNl\n-----END PRIVATE KEY-----\n" , "client_email" : "airflow@supple-bank-315301.iam.gserviceaccount.com" , "client_id" : "105233422255710271333" , "auth_uri" : "https://accounts.google.com/o/oauth2/auth" , "token_uri" : "https://oauth2.googleapis.com/token" , "auth_provider_x509_cert_url" : "https://www.googleapis.com/oauth2/v1/certs" , "client_x509_cert_url" : "https://www.googleapis.com/robot/v1/metadata/x509/airflow%40supple-bank-315301.iam.gserviceaccount.com" }
設定Airflow連接GCS
需要透過 airflow.cfg
這個檔案來設置可以進行remote logging的動作,也就是將log儲存到GCS上,airflow.cfg
位於 $AIRFLOW_HOME
目錄底下
在airflow.cfg 的 [logging]這邊,進行以下設置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [logging] base_log_folder = /opt/airflow/logsremote_logging = True remote_log_conn_id = google_cloud_defaultgoogle_key_path = /{your key path}/key.jsonremote_base_log_folder = gs://{your bucket path}
記得將剛剛產生的gcs key,放到 google_key_path
內!
檢視pod與gcs的互動
設定完畢airflow.cfg
與放置好給airflow使用的gcs_key.json 金鑰檔案後,
記得重啟airflow,並且再回到 k8sexecutor_example
這個範例重新執行dag task.
執行完畢後,來到gcs內,可以看到有個目錄產生,這麼目錄名稱就是本次執行dag的名稱,且每個task的log都會各自以自己名稱的目錄儲存起來
點擊task_with_podtemplate
這個task的log,可以查看到已經成功從 gs://airflow_bucket_1234
讀取到剛剛執行的log!
若要調整每次log寫入的細節設定,可以在airflow.cfg檔案內的 [logging]中
對log_format與log_filename_template做調整
參考
Writing Logs to Google Cloud Storage