當AnalyticDB for MySQL Spark預設鏡像無法滿足您的需求時,您可以基於預設鏡像,將Spark作業需要的軟體包和依賴項打包到鏡像中,產生自訂鏡像並發布到Container Registry。在AnalyticDB for MySQL進行Spark作業開發時,指定自訂鏡像作為Spark作業的執行環境。
背景資訊
使用 AnalyticDB for MySQL Spark預設鏡像時,可能無法滿足部分情境,例如:
執行作業前需要進行複雜的環境初始化,例如下載較大的模型檔案到指定本地目錄、需要安裝和升級特定Linux開發套件等。
使用Python進行機器學習、資料採礦等時,依賴的C與C++版本與預設鏡像中的版本不相容,導致
VirtualEnv
環境上傳方案不滿足。針對Spark核心進行深度定製,或需要處於預覽階段的Spark核心版本中的特性。
您可以通過AnalyticDB for MySQL Spark提供的自訂鏡像服務解決上述問題,將AnalyticDB for MySQL Spark作業執行的預設鏡像修改為您定製的環境鏡像。
前提條件
已經建立ECS執行個體,用於自訂鏡像,本樣本的ECS作業系統為Alibaba Cloud Linux 3.2104 LTS 64位,更多資訊請參見快速購買執行個體一鍵購買訂用帳戶執行個體。
操作步驟
建立Container Registry執行個體,並在該執行個體中建立命令空間與鏡像倉庫,更多資訊請參見建立企業版執行個體。
建立容器鏡像執行個體時,您可以選擇企業版執行個體(推薦)或個人版執行個體,企業版執行個體在訪問、儲存方面具有更進階別的安全性,同時具有高效分發的特性。本文以企業版執行個體為例進行介紹,更多資訊請參見個人版和企業版執行個體差異化說明。
說明您的自訂鏡像將推送至該執行個體中,AnalyticDB for MySQL Spark在提交作業時也將從該執行個體中拉取自訂鏡像。
建立企業版鏡像服務執行個體會產生費用,更多資訊請參見企業版執行個體計費說明。
將ECS執行個體的VPC和vSwithch資訊添加到Container Registry執行個體的存取控制中,才能建立ECS與企業版鏡像執行個體之間的串連,更多資訊請參見配置專用網路的存取控制。
在ECS執行個體中,執行以下命令,下載AnalyticDB for MySQL Spark的預設鏡像。
docker pull registry.cn-hangzhou.aliyuncs.com/adb-public-image/adb-spark-public-image:3.2.0.32
您可以執行
docker images
命令,查看鏡像是否已下載到本地。目前的版本基於阿里龍蜥作業系統進行封裝,包管理工具為RPM。以下為當前AnalyticDB for MySQL Spark預設鏡像的預裝目錄,不建議對內容進行改動,可能會影響部分AnalyticDB for MySQL Spark功能。
目錄
內容
說明
/opt/spark
AnalyticDB for MySQL Spark的安裝目錄。
/opt/spark/adb_jars
為內建spark connectors
,不建議覆蓋或者刪除。/opt/intel
Native執行引擎的安裝目錄。
改動此目錄可能會導致向量化執行失敗。
/opt/prometheus
Prometheus的安裝目錄。
改動此目錄可能導致無法對作業進行效能監控和診斷。
/opt/tools
調試和DEBUG工具的安裝目錄。
建議將效能追蹤、錯誤分析等工具安裝到此目錄。
/opt/entrypoint.sh
引導啟動指令碼。
改動此開機檔案,可能導致JVM啟動失敗並進一步造成無效的資源使用,請謹慎修改。
/usr/java/jdk1.8.0_321-amd64
JAVA_HOME指向的JDK安裝目錄。
建議通過修改
JAVA_HOME
環境變數指向新的安裝路徑來更改JDK,而非直接覆蓋此目錄內容。/usr/local/lib/python3.6
預設Python環境的三方包安裝目錄。
建議通過
spark.pyspark.python
指向一個新的安裝路徑來更改Python環境,而非直接覆蓋。說明直接覆蓋Linux系統的預設Python版本可能導致RPM包管理系統崩潰。
執行
vim Dockerfile
命令,建立Dockerfile檔案,添加下述內容並儲存。本樣本展示如何在自訂鏡像中安裝Python 3.8及最新版Tensorflow。
FROM registry.cn-hangzhou.aliyuncs.com/adb-public-image/adb-spark-public-image:3.2.0.32 RUN wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz RUN tar xzf Python-3.8.12.tgz RUN cd Python-3.8.12 && sudo ./configure --enable-optimizations && sudo make altinstall ENV PYSPARK_PYTHON="/usr/local/bin/python3.8" RUN echo "import sys\nprint(sys.version)" > /tmp/test.py
更多關於Dockerfile的資訊,請參見Dockerfile。
構建鏡像,並推送到步驟一建立的鏡像倉庫中。
構建格式為:
docker build -t <鏡像倉庫串連地址>:<自訂鏡像版本號碼> .
推送格式為:
docker push <鏡像倉庫串連地址>:<自訂鏡像版本號碼>
鏡像倉庫串連地址:您可以在鏡像倉庫控制台的詳情頁擷取該地址。
樣本如下:
docker build -t my-spark-****repo.cn-hangzhou.cr.aliyuncs.com/adb-public/spark:3.2.0.32 . docker push my-spark-****repo.cn-hangzhou.cr.aliyuncs.com/test/spark:3.2.0.32
推送成功後,您可以在鏡像倉庫的鏡像版本頁簽中看到該鏡像。
在AnalyticDB for MySQL控制台進行Spark作業開發,配置下述關鍵參數,樣本如下。
{ "file": "local:///tmp/test.py", "name": "MyImage", "conf": { "spark.driver.resourceSpec": "small", "spark.executor.instances": 1, "spark.executor.resourceSpec": "small", "spark.adb.customImage.enabled": "true", "spark.kubernetes.container.image": "my-spark-****repo.cn-hangzhou.cr.aliyuncs.com/test/spark:3.2.0.32", "spark.adb.acr.instanceId": "cri-jim1hhv0vxqy****", "spark.adb.eni.enabled": "true", "spark.adb.eni.vswitchId": "vsw-bp1o49nlrhc5q8wxt****", "spark.adb.eni.securityGroupId": "sg-bp10fw6e31xyrryu****" } }
關鍵參數說明:
配置
樣本
說明
spark.adb.customImage.enabled
true
是否開啟自訂鏡像,此處必須為true,取值:
true:開啟
false(預設):不開啟
spark.kubernetes.container.image
my-spark-****repo.cn-hangzhou.cr.aliyuncs.com/test/spark:3.2.0
Container Registry中鏡像倉庫串連地址。
spark.adb.acr.instanceId
cri-jim1hhv0vxqy****
Container Registry企業版執行個體ID,您可以在Container Registry控制台中擷取。該參數僅企業版鏡像服務執行個體需配置。
spark.adb.eni.enabled
true
是否開啟ENI訪問開關,此處必須為true,取值:
true:開啟
false(預設):不開啟
spark.adb.eni.vswitchId
vsw-bp1o49nlrhc5q8wxt****
部署彈性網卡的交換器ID,建議選擇步驟二中添加到Container Registry存取控制中的交換器ID。
若您使用個人版鏡像服務執行個體,可以選擇任意有許可權的交換器。
spark.adb.eni.securityGroupId
sg-bp10fw6e31xyrryu****
部署彈性網卡的安全性群組ID,該安全性群組必須與上述彈性網卡交換器為同一個VPC,可以是同VPC下的任意安全性群組。
執行成功後,在控制台下方的應用列表中單擊日誌,可查看日誌資訊。更多關於Spark應用的資訊,請參見Spark應用開發介紹。