全部產品
Search
文件中心

AnalyticDB:自訂Spark鏡像

更新時間:Jul 06, 2024

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位,更多資訊請參見快速購買ECS執行個體一鍵購買訂用帳戶執行個體

操作步驟

  1. 建立Container Registry執行個體,並在該執行個體中建立命令空間鏡像倉庫,更多資訊請參見建立企業版執行個體

    建立容器鏡像執行個體時,您可以選擇企業版執行個體(推薦)或個人版執行個體,企業版執行個體在訪問、儲存方面具有更進階別的安全性,同時具有高效分發的特性。本文以企業版執行個體為例進行介紹,更多資訊請參見個人版執行個體與企業版執行個體差異化說明

    說明
    • 您的自訂鏡像將推送至該執行個體中,AnalyticDB for MySQL Spark在提交作業時也將從該執行個體中拉取自訂鏡像。

    • 建立企業版鏡像服務執行個體會產生費用,更多資訊請參見企業版執行個體計費說明

  2. 將ECS執行個體的VPC和vSwithch資訊添加到Container Registry執行個體的存取控制中,才能建立ECS與企業版鏡像執行個體之間的串連,更多資訊請參見配置專用網路的存取控制

  3. 在ECS執行個體中,執行以下命令,下載AnalyticDB for MySQL Spark的預設鏡像。

     docker pull registry.cn-hangzhou.aliyuncs.com/adb-public-image/adb-spark-public-image:3.2.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包管理系統崩潰。

  4. 執行vim Dockerfile命令,建立Dockerfile檔案,添加下述內容並儲存。

    本樣本展示如何在自訂鏡像中安裝Python 3.8及最新版Tensorflow。

    FROM registry.cn-hangzhou.aliyuncs.com/adb-public-image/adb-spark-public-image:3.2.32
    RUN wget https://www.python.org/ftp/python/3.8.11/Python-3.8.3.tgz
    RUN tar xzf Python-3.8.11.tgz
    RUN cd Python-3.8.11 && sudo ./configure --enable-optimizations && sudo make altinstall
    RUN pip3.8 install --upgrade pip && pip3.8 install tensorflow
    ENV PYSPARK_PYTHON="/usr/local/bin/python3.8"
    RUN echo "import tensorflow as tf\nprint("TensorFlow version:", tf.__version__)\n" > /tmp/test.py

    更多關於Dockerfile的資訊,請參見Dockerfile

  5. 構建鏡像,並推送到步驟一建立的鏡像倉庫中。

    構建格式為:docker build -t <鏡像倉庫串連地址>:<自訂鏡像版本號碼> .

    推送格式為:docker push <鏡像倉庫串連地址>:<自訂鏡像版本號碼>

    鏡像倉庫串連地址:您可以在鏡像倉庫控制台的詳情頁擷取該地址。

    樣本如下:

    docker build -t my-spark-****repo.cn-hangzhou.cr.aliyuncs.com/adb-public/spark:3.2.32 .
    docker push my-spark-****repo.cn-hangzhou.cr.aliyuncs.com/test/spark:3.2.32

    推送成功後,您可以在鏡像倉庫的鏡像版本頁簽中看到該鏡像。

  6. 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",
            "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樣本如下:

    {
        "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": "regi****-vpc.cn-hangzhou.aliyuncs.com/ptshalom/adb_spark:2.0",
            "spark.adb.customImage.username": "db****@test.ali.com",
            "spark.adb.customImage.password": "Data****",
            "spark.adb.eni.enabled": "true",
            "spark.adb.eni.vswitchId": "vsw-bp1o49nlrhc5q8wxt****",
            "spark.adb.eni.securityGroupId": "sg-bp10fw6e31xyrryu****"
        }
    }

    參數說明:

    • spark.adb.customImage.username:個人版鏡像倉庫使用者名稱(必填),預設為阿里雲帳號全名。

    • spark.adb.customImage.password:個人版鏡像倉庫密碼(必填),密碼為開通服務時設定的密碼。

    執行成功後,在控制台下方的應用列表中單擊日誌,可查看日誌資訊。更多關於Spark應用的資訊,請參見Spark應用開發介紹

相關文檔