我該如何解決 Amazon MWAA 中「psycopg2.OperationalError: SSL connection has been closed unexpectedly 錯誤」?
我想對 Amazon Managed Workflows for Apache Airflow (Amazon MWAA) 中的「psycopg2.OperationalError: SSL connection has been closed unexpectedly」錯誤進行疑難排解。
簡短說明
當您執行有向非循環圖 (DAG) 且任務失敗時,您可能會在任務日誌中收到以下錯誤訊息:
- 「psycopg2.OperationalError: SSL connection has been closed unexpectedly」。
- 「sqlalchemy.exc.OperationalError: (psycopg2.errors.ConnectionException) Timed-out waiting to acquire database connection」。
當工作程序過載或失去與中繼資料資料庫的連線,或任務嘗試重新使用已關閉的資料庫連線時,就會出現上述錯誤訊息。
若要解決此錯誤,請執行下列動作:
- 降低 CPU 和記憶體的使用率。
- 檢查您工作程序的組態。
- 使用可延遲運算子。
- 移除頂層代碼。
- 請勿使用 Apache Airflow 變數。
- 簡化您的 DAG。
- 建立 .airflowignore 檔案,並將其新增至 Amazon Simple Storage Service (Amazon S3) 中的主要 DAG 資料夾。
解決方法
降低 CPU 和記憶體使用率
過載的排程器、工作程序或 Web 伺服器可能無法維持作用中的資料庫連線。Amazon Relational Database Service (Amazon RDS) for Apache Airflow 中繼資料的預設閒置連線逾時時間為 30 分鐘。如果任務或程序保持閒置或無回應的時間超過此時段,則資料庫可能會關閉連線。如需詳細資訊,請參閱 IdleClientTimeout。
若要檢查 CPU 和記憶體使用率指標,請完成以下步驟:
- 開啟 Amazon CloudWatch console (Amazon CloudWatch 主控台)。
- 選擇 AWS/MWAA 命名空間。
- 在 All metrics (所有指標) 索引標籤上,選擇 Cluster (叢集)。
- 選擇 CPUUtilization,然後選擇 Graph all search results (繪製所有搜尋結果的圖表)。
- 選擇 Graphed metrics (圖表指標) 索引標籤來查看效能指標。
- 重複步驟 1 到 3,然後選擇 MemoryUtilization。
- 選擇 Graph all search results (繪製所有搜尋結果的圖表),然後選擇 Graphed metrics (圖表指標) 索引標籤來查看效果指標。
**注意:**您必須在 Statistic (統計資料) 選取 Maximum (最大值),並在 Period (週期) 選擇 1 minute (1 分鐘)。
如需詳細資訊,請參閱 Amazon MWAA 的容器、佇列和資料庫指標。
如果您工作程序的 CPU 和記憶體使用率持續超過 90%,表示工作程序過載或任務過於繁重。高 CPU 和記憶體使用率可能會導致任務狀態報告、中繼資料資料庫通訊和新任務出現問題。
若要降低工作程序的 CPU 和記憶體使用率,請執行以下動作:
- 由於工作程序在任務建立的初始階段需要較多資源,請將任務排程分散執行。
- 將匯入範圍縮小到僅需使用的任務,並移除不必要的全域匯入。
- 使用 Apache Airflow 和 Amazon MWAA 作為主要工具。在 Amazon Elastic Kubernetes Service (Amazon EKS)、Amazon Elastic Container Service (Amazon ECS) 或 AWS Glue 等服務上排程剩餘任務。
**注意:**請避免在工作程序上處理大量資料,因為其資源有限。請使用專為處理大量資料而設計的服務。 - 減少在任務之間傳遞的資料量。在可能的情況下,將資料分塊處理,以避免下游資料因 Amazon MWAA 工作負載過重而發生變動。
**注意:**如果必須在任務之間傳遞大量資料,請將資料儲存在外部,並在需要時匯入。有些運算子會使用 XComs。如需詳細資訊,請參閱 Apache Airflow 網站上的 XComs。 - 定期清理中繼資料資料庫。
**注意:**高 CPU 使用率或可用記憶體不足可能會導致查詢失敗,或增加延遲,從而引發 SSL 例外狀況錯誤。
**注意:**如果無法降低 CPU 使用率,請改用資源更多的較大環境類別,或進一步調整您的工作程序。
檢查您工作程序的組態
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
每個 Apache Airflow 版本都有工作程序組態的預設值。然而,您可能需要根據您的需求自訂這些組態。
設定 Apache Airflow 組態
使用 Amazon MWAA 主控台、AWS CLI update-environment 命令或 UpdateEnvironment API 呼叫自訂下列組態:
- celery.worker_autoscale 組態控制可在工作程序上同時執行的最大和最小任務數。減少來自工作程序的最大資料庫連線數。然後,對於具有相同工作程序資源的較少數任務,為每個任務分配更多的資源。
- 將 core.execute_tasks_new_python_interpreter 設為 True,為每個任務建立一個新的 Python 解釋器並隔離資料庫連線。
**注意:**僅當「psycopg2.OperationalError」錯誤再次出現時,才將組態設為 True。 - 使用 Amazon MWAA 中的自動擴展功能來增加最大工作程序數量。
**注意:**設定 max-workers 和 celery.worker_autoscale 的值,以適應工作負載。
如需詳細資訊,請參閱在 Amazon MWAA 上使用 Apache Airflow 組態選項。
檢查您的工作程序、排程器和 Web 伺服器日誌
在生產環境中,詳細記錄會佔用不必要的資源並增加 CPU 使用率。最佳實務是將工作程序、排程器和 Web 伺服器日誌層級設定為至少警告。大多數情況下,INFO 日誌並非必要。
使用可延遲運算子
當您的任務將作業提交到外部系統或服務並等待事件發生 (例如 EMR 叢集建立) 時,請使用可延遲運算子。可延遲運算子可釋放工作程序插槽,並提升工作負載處理能力。如需詳細資訊,請參閱 Apache Airflow 網站上的可延遲運算子和觸發程序。
移除頂層程式碼
從排程器中移除使用不必要資源的頂層程式碼。此外,請根據您的使用案例調整 dag_processor.min_file_process_interval 組態。如需詳細資訊,請參閱 Apache Airflow 網站上的 min_file_process_interval 和最佳實務。
請勿使用 Apache Airflow 變數
請勿在頂層 Python 程式碼中使用 Apache Airflow 變數。當您擷取變數時,必須查詢資料庫,而此查詢會在每個剖析迴圈中執行。
**注意:**如果必須使用變數,請使用變數快取。如需詳細資訊,請參閱 Apache Airflow 網站上的 use_cache。
簡化您的 DAG
簡化您的 DAG,並對 Amazon MWAA 環境所使用的特定 Python 版本測試 DAG 程式碼。
必要時使用動態任務對應。如需詳細資訊,請參閱 Apache Airflow 網站上的動態任務對應。
建立 .airflowignore 檔案,並將其新增至 Amazon S3 中的主 DAG 資料夾
Apache Airflow 排程器會將 DAG 資料夾的內容從 Amazon S3 同步到每個工作程序。排程器也會定期剖析 Amazon S3 中的檔案以更新 UI。當排程器剖析時,會執行檔案並產生 DAG。
使用 .airflowignore 檔案指定 Amazon S3 中 DAG 資料夾中的資料夾和檔案。您必須使用規則運算式和全域模式。剖析過程中忽略非 DAG 檔案,以減少排程器的負擔並提升 DAG 效率。如需詳細資訊,請參閱 Apache Airflow 網站上的 .airfowignore。
- 語言
- 中文 (繁體)

相關內容
已提問 2 年前