我執行了 AWS Glue 擷取、轉換和載入 (ETL) 作業。作業失敗了,而且我收到一則錯誤訊息,指出子網路中沒有足夠的可用 IP 位址。
簡短描述
執行 AWS Glue ETL 作業時,您可能會收到下列其中一個錯誤:
- 「指定的子網路沒有足夠的可用位址來滿足請求。(服務: AmazonEC2;狀態碼: 400;錯誤代碼: InsufficientFreeAddressesInSubnet;請求 ID:my_request_id)」
- 「呼叫 o70.getDynamicFrame 時發生錯誤。作業 0 已取消,原因是 SparkContext 已關閉,因為啟動後執行程式失敗的次數達到閾值」
出現上述錯誤的原因如下:
- AWS Glue 作業使用的資料處理單元 (DPU) 數量超過了可用的 IP 位址數量。
- 其他 AWS 服務使用了相同子網路中的 IP 位址。
- 作業完成後,您沒有分離彈性網路介面。
解決方法
確認作業使用了多少個 DPU,並減少 DPU 的數量
確認作業已完成。然後,確認作業使用了多少個 DPU,並確定可以移除的 DPU 數量。
若要檢查作業使用了多少個 DPU,請完成下列步驟:
- 開啟 AWS Glue console (AWS Glue 主控台)。
- 在導覽窗格中,選擇 Jobs (作業)。
- 選取作業,然後選擇 History (歷史記錄) 索引標籤。
- 查看 Maximum capacity (最大容量) 欄中的 DPU 數量。
然後,確定要從作業中移除的 DPU 數量。
DPU 的數量不等於網路介面的數量。
每個工作者都需要一個網路介面,但下列需要額外一個網路介面的工作者類型除外:
- 標準工作者類型,每個工作者 1 個 DPU
- G1.X 工作者類型,每個工作者 1 個 DPU
- G2.X 工作者類型,2 個 DPU
例如,如果您在 G.2x 上執行包含 20 個工作者的作業,請使用下列計算方式計算 IP 位址的數量:
AWS Glue 2.0/3.0/4.0: 40 個 DPU = 19 個工作者 (執行者) + 1 個驅動程式 = 20 個 IP 位址。AWS Glue 2.0/3.0/4.0 中沒有任務執行程式。
若要減少 DPU 數量,請完成下列步驟:
- 開啟 AWS Glue console (AWS Glue 主控台)。
- 在導覽窗格中,選擇 Jobs (作業),然後選取作業。
- 選擇 Actions (動作) 下拉式清單,然後選擇 Edit job (編輯作業)。
- 展開 Security configuration, script libraries, and job parameters (optional) (安全組態、指令碼程式庫和作業參數 (選用)) 清單。
- 在 Maximum capacity (最大容量) 欄位中,為該作業可使用的最大 DPU 數量,輸入較小的數字。
- 儲存變更,然後再次執行作業。
檢查可用的 IP 位址數量,並刪除未使用的網路介面
首先,檢查子網路中可用 IP 位址的數量。
請完成下列步驟:
- 開啟 AWS Glue console (AWS Glue 主控台)。
- 在導覽窗格中,選擇 Connections (連線)。
- 選取作業使用的連線。
- 選擇 Action (動作) 下拉式清單,然後選擇 View details (檢視詳細資訊)。
- 記下子網路。
- 開啟 Amazon Virtual Private Cloud (Amazon VPC) 主控台。
- 在導覽窗格中,選擇 Subnets (子網路)。
- 在 Subnet (子網路) 下拉式清單中,選擇 AWS Glue 連線使用的子網路。
- 在 Description (描述) 索引標籤上,檢查 Available IPv4 Addresses (可用的 IPv4 位址) 欄位,查看子網路中有多少個可用的 IP 位址。
- 確認子網路的可用 IP 位址數量,比 AWS Glue 作業所需的數量多。
如果子網路沒有足夠的可用 IP 位址,請刪除所有未使用的網路介面。
建立並使用具有更多可用 IP 位址的子網路
如果現有子網路沒有足夠的 IP 位址,請在 Amazon VPC 中建立新的子網路。您可以使用原始 CIDR 區塊,也可以新增 CIDR 區塊來擴展範圍。然後,確認新子網路是否使用與原始子網路相同的路由表和網路存取控制清單 (網路 ACL) 規則。例如,如果您之前的子網路有通往網際網路閘道的預設路由,則新的子網路必須路由到網際網路閘道。
更新 AWS Glue 連線以使用新的子網路
請完成下列步驟:
- 開啟 AWS Glue console (AWS Glue 主控台)。
- 在導覽窗格中,選擇 Connections (連線)。
- 選取 AWS Glue 作業所使用的連線。
- 在 Action (動作) 下拉式清單中,選擇 Edit connection (編輯連線)。
- 在 Setup your connection's properties (設定連線的屬性) 頁面上,選擇 Next (下一步)。
- 在 Setup access to your data store (設定資料存放區存取權) 頁面的 Subnet (子網路) 下拉式清單中,選取新的子網路。
- 選擇 Next (下一步),然後選擇 Finish (完成)。
- 再次執行作業。
使用作業佇列,自動處理 IP 位址耗盡
AWS Glue 作業在 VPC 中執行時,每個工作者都會透過網路介面耗用一個 IP 位址。作業完成後,AWS Glue 執行角色會呼叫 DeleteNetworkInterface API 釋放網路介面。但是,網路介面釋放時間因系統狀況而異。如果您快速連續執行作業,則可能尚未釋放先前的網路介面。這會暫時減少子網路中可用的 IP 位址數量。
估計網路介面釋放時間
若要估計在環境中釋放網路介面所需的時間,請在 AWS CloudTrail 查詢 DeleteNetworkInterface 事件。然後,將它們的時間戳記與 AWS Glue 作業結束時間進行比對。
請完成下列步驟:
- 開啟 CloudTrail console (CloudTrail 主控台)。
- 選擇 Event history (事件歷史記錄)。
- 依據事件名稱 = DeleteNetworkInterface 與事件來源 = ec2.amazonaws.com 篩選。
- 尋找使用者名稱與 AWS Glue 執行角色相對應的事件。
- 在 History 歷史記錄索引標籤中,將事件時間戳記與 AWS Glue 作業的完成時間進行比對,估計釋放延遲時間。
開啟作業佇列
使用作業佇列,在無法立即取用資源 (包括 IP 位址) 時,將作業保留在佇列中,並於容量可用時再啟動。這可防止 InsufficientFreeAddressesInSubnet 錯誤導致作業失敗。
若要開啟作業佇列,請完成下列步驟:
- 開啟 AWS Glue console (AWS Glue 主控台)。
- 在導覽窗格中,選擇 Jobs (作業),然後選取作業。
- 選擇 Actions (動作) 下拉式清單,然後選擇 Edit job (編輯作業)。
- 在作業屬性中,將 Job queue (作業佇列) 設定為 Enabled (已啟用)。
- (選擇性) 設定 Timeout (逾時) 值,限制作業可以保留在佇列中的時間。
- 儲存您的變更。
注意: 作業佇列不會增加子網路的 IP 容量。如果作業持續耗用可用的 IP,請用作業佇列搭配本文中的其他解決方法。例如,請用作業佇列搭配減少 DPU。
相關資訊
定義 Spark 作業的作業屬性
設定 Amazon VPC,以便透過 JDBC 從 AWS Glue 連線到 Amazon RDS 資料存放區