當您通過MaxCompute訪問位於公網或VPC網路中的目標服務時,預設情況下,MaxCompute與目標服務之間的網路不可達。您需要開通網路連接以便訪問公網或VPC中的目標服務(例如指定IP或網域名稱、RDS、HBase叢集、Hadoop叢集等)。本文為您介紹MaxCompute與目標服務間的網路結構及支援的網路開通方案。
免責聲明
MaxCompute提供的公網與VPC訪問能力目前屬於免費服務,存在以下限制:
保障網路連通性,但是對使用者代碼觸發的網路行為,平台可能因為故障切換的原因導致節點重跑,使用者需要在代碼層面做相容,建議只做資料讀取操作,寫操作需要自行防止多次寫入可能產生的髒資料。
訪問需要經過代理,代理的轉寄能力有限,盡量使用長串連,並控制節點規模,並發過大或串連過多可能導致網路請求失敗。
不保障頻寬,因此可能存在任務運行慢情況,平台不承擔相應責任。
經過代理後的出口IP有限,因此出現的串連行為異常,需要與阿里雲支援人員確認。
出口IP存在變更的可能性,被訪問的服務不應該開啟存取控制,對於針對代理出口配置IP白名單的情況,平台不保障出口IP不變。
如果完成MaxCompute的網路連通後,運行MaxCompute任務時仍然出現了無法訪問等問題,可能是運行MaxCompute任務的工具存在網路限制。例如,使用DataWorks進行資料同步或資料清洗時,需保障DataWorks的資源群組與資料來源網路連通、DataWorks的沙箱白名單沒有限制資料來源的訪問。DataWorks的資源群組網路連通與沙箱配置請參見:網路連通方案。
功能介紹
MaxCompute與目標服務間的網路結構及支援的網路開通方案如下:
MaxCompute訪問目標服務有如下三種情境:
情境一:訪問公網方案。
情境二:訪問VPC方案(專線直連)。
適用於通過MaxCompute SQL、UDF、Spark 、MR、PyODPS/Mars、外部表格或基於湖倉一體架構訪問處於VPC網路下的RDS、HBase叢集、Hadoop叢集等情境。您需要登入VPC所屬主帳號對MaxCompute進行授權,並在MaxCompute控制台建立MaxCompute與VPC網路之間的串連,建立完成後,您可以在控制台下看到MaxCompute建立的ENI網卡,該ENI網卡的訪問規則由建立專用網路串連時您提供的安全性群組控制,以此來建立MaxCompute與目標服務間的網路通路。
說明如果目標服務存在存取控制,需要您將ENI網卡IP或者vSwitch網段添加到目標服務的訪問白名單中。
MaxCompute訪問VPC網路時,MaxCompute側僅打通到所填VPC ID的網路連接。如需跨Region訪問或者訪問該Region的其他VPC,請根據云上VPC現有打通方案,打通專線直連方案中所配置的VPC和其他VPC之間的網路。
情境三:訪問部分阿里雲服務。
適用於通過MaxCompute SQL、UDF、Spark 、MR、PyODPS/Mars、外部表格或基於湖倉一體架構訪阿里雲OSS、DLF、OTS(Tablestore)、Hologres等服務的情境,串連使用阿里雲內部服務提供的雲產品互連網絡地址。
如果您建立了OSS或OTS外部表格,可以通過OSS、OTS的內網Endpoint訪問。
如果您調用UDF訪問OSS、OTS,只能通過OSS、OTS的公網Endpoint訪問。
不同情境下的配置與訪問Endpoint詳情請參見下述的訪問部分阿里雲服務。
前提條件
當您申請開通MaxCompute與目標服務間的網路連接前,請確認已滿足以下條件:
已建立MaxCompute專案。如果已有MaxCompute專案,直接使用即可,不必再建立新專案。在湖倉一體情境中,建議設定MaxCompute專案的資料類型為Hive相容類型。更多建立MaxCompute專案資訊,請參見建立MaxCompute專案。
如果需要訪問位於VPC網路中的目標服務,請確保VPC所有者帳號、訪問MaxCompute專案的阿里雲帳號,以及目標服務環境或叢集的管理員帳號是同一個主帳號或同在一個主帳號下。
地區支援情況
MaxCompute僅支援在如下地區通過訪問公網或VPC網路方案開通網路連接。
方案類型 | 支援地區 | 支援連通的目標 |
訪問公網方案 |
| 公網IP或網域名稱 |
訪問VPC方案(專線直連) |
|
|
訪問公網方案
步驟一:通過專案管理編輯外部網路地址
對於常用的公網IP或網域名稱(如aliyun.com),您可以直接通過MaxCompute控制台的專案管理進行添加與刪除:
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列單擊專案管理。
在專案管理頁面,單擊目標專案操作列的管理。
在參數配置頁簽的外部網路地區,設定可用的外部網路地址。
單擊提交。
支援的頂層網域包括:aliyuncs.com、aliyun.com、amap.com、dingtalk.com、alicloudapi.com、cainiao.com、alicdn.com、taobao.com、alibaba.com、alipaydev.com、alibabadns.com。
不支援配置IPv6地址,公網IP數量無限制。
如果您遇到某外部網路地址無法通過自動校正的問題,則需要刪除該地址後重新提交。如仍有需要,您可以通過提交工單的方式,申請配置外部網路地址。具體操作請參見下述的提交申請。
步驟二:訪問公網地址
使用SQL自訂函數(UDF)或者Spark訪問公網時,在完成上述通過專案管理編輯外部網路地址操作後,需要添加以下配置。
其他類型的任務,請根據相應的任務類型進行具體配置。
SQL自訂函數(UDF)任務
參數設定如下:
--設定網路連接申請表單中配置的公網IP或網域名稱、連接埠。即下方SQL語句要訪問的公網IP或網域名稱。 --如果需要訪問多個網域名稱或連接埠,請使用英文逗號(,)分隔 SET odps.internet.access.list=<ip_address:port|realm_name:port>; --執行SQL語句調用UDF。 SELECT <UDF_name>("<http://ip_address|realm_name>");
ip_address:port | realm_name:port:必填。目標公網IP或網域名稱、連接埠。
UDF_name:訪問公網IP或網域名稱的UDF。
任務範例程式碼如下:
package com.aliyun.odps.test.udf; import com.aliyun.odps.udf.UDF; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; public class <UDF_name> extends UDF { public String evaluate(String urlStr) throws IOException { URL url = new URL(urlStr); StringBuilder sb = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()))) { String line; while ((line = reader.readLine()) != null) { sb.append(line).append('\n'); } } return sb.toString(); } }
執行:基於UDF範例程式碼建立的自訂函數名稱為
url_fetch
,網路連接審核通過後,執行命令樣本如下。SET odps.internet.access.list=www.aliyun.com:80; SELECT url_fetch("http://www.aliyun.com");
Spark on MaxCompute任務
參數設定:此配置項需加在Spark用戶端的conf檔案中或DataWorks提交Spark作業時的配置項中。
spark.hadoop.odps.cupid.smartnat.enable = true;
spark.hadoop.odps.cupid.internet.access.list=<ip_address:port>
步驟三:(可選)添加白名單
如果使用者服務端有存取控制,需要將MaxCompute訪問公網方案的出口IP添加到使用者服務白名單,出口IP請提交工單申請擷取。
提交申請
無法通過自動校正的公網IP或網域名稱需要按照如下步驟進行操作:
提交工單,申請配置公網的IP或網域名稱、連接埠的白名單。
MaxCompute支援人員團隊接收到提交的申請資訊後,會進行審核並完成配置。確認處理完畢後(通常處理周期為3個工作日),即可繼續執行後續步驟。若對審核結果有異議,您可通過搜尋(DingTalk群號:11782920)加入MaxCompute開發人員社區釘群與我們溝通交流。
訪問VPC方案(專線直連)
步驟一:開通專線網路連接
開通專線網路連接的流程如下:
第1步:授權操作
對操作使用者進行授權:需要針對登入使用者,授予能夠建立網路連接對象的許可權(詳情請參見Networklink)。授權的使用者需要是專案所有者(Project Owner),或具備租戶層級的Super_Administrator或Admin角色的使用者(詳情請參見角色規劃)。授權過程可參見租戶內對象許可權一覽表。
對MaxCompute進行授權:授權的目的在於允許MaxCompute在VPC內建立ENI網卡,以實現MaxCompute到使用者VPC的連通。使用者只要在阿里雲帳號登入態下單擊授權即可。
說明MaxCompute訪問VPC時的計費規則請參考VPC對等串連。
第2步:配置安全性群組規則
在VPC執行個體下,建立獨立安全性群組用於控制MaxCompute對VPC網路內的各種資源的存取權限。
登入專用網路管理主控台,單擊目標VPC執行個體ID後,單擊資源管理頁簽。
在資源管理頁簽的專用網路資源地區,將滑鼠移至上方至安全性群組數值上方後,單擊添加(注意:選擇安全性群組為普通安全性群組,不是企業安全性群組。普通安全性群組的出口是預設開啟的。企業安全性群組的出口是預設關閉的,會導致無法訪問VPC內的任何服務),為MaxCompute建立獨立安全性群組並記錄安全性群組ID。需要選擇與連通服務相同的VPC網路。更多建立安全性群組操作,請參見建立安全性群組。
添加安全性群組:
配置安全性群組:配置方法請參見安全性群組應用案例
MaxCompute在後續的建立網路通路過程中會預設自動根據頻寬需求建立2個ENI,不收取費用,由MaxCompute建立的ENI將位於這個安全性群組內。
在HBase情境,如果使用者的HBase無法對某個安全性群組開放網路許可權,您可以將MaxCompute建立的ENI IP添加至白名單即可。由於ENI IP可能會發生變化,推薦您添加VPC執行個體對應交換器的IP網段至白名單。您可以登入ECS管理主控台,在左側導覽列,單擊彈性網卡,擷取ENI IP。
第3步:建立MaxCompute與目標VPC網路間的網路連接
阿里雲帳號(主帳號)或擁有MaxCompute租戶層級的Super_Administrator或Admin角色的RAM子帳號(詳情請參見MaxCompute租戶層級角色),可以在MaxCompute控制台建立MaxCompute與VPC網路之間的串連。操作如下:
在MaxCompute控制台的左側導覽列單擊
。在新增網路連接對話方塊中,按下表填寫參數後單擊確定。
參數名稱
說明
串連名稱
自訂網路連結名稱。格式如下:
字母開頭。
只能包含字母、底線(_)和數字。
長度在1-63個字元。
類型
網路連接類型。預設為直通串連(passthrough)。
說明直通串連對應的即是專用網路串連方案。
地區
MaxCompute支援的通過專用網路串連方案開通網路連接的地區。詳情請參見開通地區。
已選擇VPC
VPC執行個體ID。
擷取方式如下:
串連HBase、Hadoop叢集時:您可以在對應控制台的網路連接資訊處擷取該資訊。
其他情況:登入專用網路管理主控台,在專用網路頁面即可擷取VPC ID。
交換器
VPC網路綁定的交換器ID。
擷取方式如下:
串連HBase、Hadoop叢集時:您可以在對應控制台的網路連接資訊處擷取該資訊。
其他情況:登入專用網路管理主控台,在左側導覽列單擊交換器,即可在右側通過VPC執行個體ID擷取到交換器ID。
安全性群組
步驟【開通專線網路連接】中記錄的安全性群組ID。
第4步:配置目標服務的安全性群組
在完成上述操作(即ENI專線開通)後,使用者還需要在待訪問的服務中增加相關安全規則,授權代表MaxCompute的安全性群組,即上述第2步中提供的安全性群組能訪問哪些服務的具體連接埠(例如9200、31000等)。
例如,使用者需要訪問阿里雲RDS,則需要在RDS中增加規則,允許第2步中建立的安全性群組訪問。如果使用者需要訪問的服務無法添加安全性群組,只能添加IP,那麼需要將目標服務所在vSwitch網段都添加進來。
配置Hadoop叢集安全性群組。
為Hadoop叢集的安全性群組配置如下資訊,確保MaxCompute可以訪問Hadoop叢集。安全性群組配置內容如下:
配置Hadoop叢集所在安全性群組的入方向訪問規則。
授權對象為ENI所在的安全性群組,即步驟2中建立的安全性群組。
HiveMetaStore連接埠:9083。
HDFS NameNode連接埠:8020。
HDFS DataNode連接埠:50010。
例如,當您串連在阿里雲E-MapReduce上建立的Hadoop叢集時,您需要配置的安全性群組規則如下圖所示。更多配置操作,請參見建立安全性群組。
配置HBase叢集安全性群組。
將為MaxCompute建立的安全性群組或ENI IP加入HBase叢集的安全性群組或IP白名單中。
例如,當您串連阿里雲HBase叢集時,可以登入HBase管理主控台,在叢集列表頁面單擊目的地組群名稱後,在左側導覽列單擊存取控制,即可在安全性群組或白名單設定頁簽添加安全性群組或IP白名單。更多添加安全性群組或IP白名單操作,請參見設定白名單和安全性群組。
說明如果不允許添加安全性群組,您可以在白名單設定頁簽添加MaxCompute建立的ENI IP。當MaxCompute配置變更時,ENI IP可能會發生變化,推薦您添加交換器ID的IP網段添加至白名單。
配置RDS安全性群組。
將為MaxCompute建立的安全性群組或ENI IP加入RDS安全性群組或IP白名單中。
例如,當您串連阿里雲RDS時,可以登入RDS管理主控台,在執行個體列表頁面單擊目標執行個體名稱後,在左側導覽列單擊白名單與安全性群組,即可在安全性群組或白名單設定頁簽添加安全性群組或IP白名單。更多添加安全性群組或IP白名單設定作業,請參見設定安全性群組或設定IP白名單。
說明當MaxCompute配置變更時,ENI IP可能會發生變化,推薦您將交換器ID的IP網段添加至白名單。
步驟二:使用網路連接訪問VPC內的地址
使用SQL或者Spark訪問VPC網路時,在完成上述開通專線網路連接操作後,需要添加以下配置。
其他類型的任務,請根據相應的任務類型進行具體配置。
使用SQL訪問VPC網路
UDF訪問VPC網路(詳情請參見:通過UDF訪問VPC網路資源)。代碼如下:
--設定網路連接名稱,即基於專用網路串連方案配置的網串連名稱,僅本Session有效: SET odps.session.networklink=testLink;
外部表格訪問VPC網路。代碼如下:
-- 在建表語句中設定參數 TBLPROPERTIES( 'networklink'='<networklink_name>')
湖倉一體配置Networklink(詳情請參見:MaxCompute湖倉一體概述)。
使用Spark訪問VPC網路
運行Spark作業,需要增加如下配置,即可使用ENI專線連通目標VPC內的服務(詳情請參見:Spark訪問VPC執行個體)。
spark.hadoop.odps.cupid.eni.enable = true
spark.hadoop.odps.cupid.eni.info=regionid:vpc id
步驟三:(可選)添加白名單
如果使用者服務端有存取控制,需要將建立專線網路連接的安全性群組添加進服務端白名單。
訪問部分阿里雲服務
適用於通過MaxCompute SQL、UDF、Spark 、MR、PyODPS/Mars、外部表格或基於湖倉一體架構訪問阿里雲OSS、DLF、OTS(Tablestore)、Hologres等服務的情境,串連使用阿里雲內部服務提供的雲產品互連網絡地址。
通過外部表格訪問OSS、OTS
如果您建立了OSS或OTS外部表格,可以通過OSS、OTS的內網Endpoint訪問。
各地區的OSS內網Endpoint請參見OSS地區和訪問網域名稱文檔中,內網Endpoint列。
各地區的OTS內網Endpoint請參見服務地址中的經典網地址。
其他通過外部表格訪問的樣本可參考:建立Hologres外部表格。
通過UDF訪問OSS、OTS
如果您調用UDF訪問OSS、OTS,只能通過OSS、OTS的公網Endpoint訪問,且在使用公網Endpoint訪問前,您需要先將對應Endpoint添加至MaxCompute的白名單中。
將待訪問的OSS、OTS的公網Endpoint添加至MaxCompute的白名單中。
您可以提交工單,申請將待訪問的OSS、OTS的公網Endpoint添加到MaxCompute的白名單中。各地區的公網Endpoint擷取詳情如下。
各地區的OSS公網Endpoint請參見OSS地區和訪問網域名稱文檔中,公網Endpoint列。
各地區的OTS公網Endpoint請參見服務地址中的公網地址。
使用公網Endpoint訪問OSS或OTS。
Spark on MaxCompute任務樣本可參考:Spark訪問OSS。
常見問題
並發量過大導致DNS解析失敗
問題描述:UDF或Spark任務在運行過程中,產生了大量的並發請求以訪問對端網域名稱,導致DNS解析失敗。
解決方案:建議您在任務的初始化階段將網域名稱解析為IP地址,並在執行階段使用解析得到的IP地址進行訪問。樣本如下:
# -*- coding:UTF-8 -*- from odps.udf import annotate @annotate("string->string") class test_udf(object): __ip_address = '' def evaluate(self, inputPath): import requests output = 'false' retries = 3 print(self.__ip_address) url = f"http://{self.__ip_address}/{inputPath}" print(url) for i in range(retries): try: response = requests.get(url) if response.status_code == 200: output = 'true' else: raise except Exception as e: if i < retries: print('connect retry: ' + str(i + 1)) print('error: ' + e.message) continue else: raise break return output def __init__(self): import socket retries = 3 for i in range(retries): try: self.__ip_address = socket.gethostbyname("xxx-vpc.cn-shanghai.aliyuncs.com") print(self.__ip_address) except socket.gaierror as e: print('Failed to resolv domain' + e.strerror) if i < retries: print('resolv domain retry: ' + str(i + 1)) continue else: raise break