全部产品
Search
文档中心

云原生数据仓库AnalyticDB:自定义Spark镜像

更新时间:Nov 07, 2024

AnalyticDB for MySQL Spark默认镜像无法满足您的需求时,您可以基于默认镜像,将Spark作业需要的软件包和依赖项打包到镜像中,生成自定义镜像并发布到容器镜像服务。在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位,更多信息请参见一键购买包年包月实例

操作步骤

  1. 创建容器镜像服务实例,并在该实例中创建命令空间镜像仓库,更多信息请参见创建企业版实例

    创建容器镜像实例时,您可以选择企业版实例(推荐)或个人版实例,企业版实例在访问、存储方面具有更高级别的安全性,同时具有高效分发的特性。本文以企业版实例为例进行介绍,更多信息请参见个人版和企业版实例差异化说明

    说明
    • 您的自定义镜像将推送至该实例中,AnalyticDB for MySQL Spark在提交作业时也将从该实例中拉取自定义镜像。

    • 创建企业版镜像服务实例会产生费用,更多信息请参见企业版实例计费说明

  2. 将ECS实例的VPC和vSwithch信息添加到容器镜像服务实例的访问控制中,才能建立ECS与企业版镜像实例之间的连接,更多信息请参见配置专有网络的访问控制

  3. 在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包管理系统崩溃。

  4. 执行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

  5. 构建镜像,并推送到步骤一创建的镜像仓库中。

    构建格式为: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

    推送成功后,您可以在镜像仓库的镜像版本页签中看到该镜像。

  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.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

    容器镜像服务中镜像仓库连接地址。

    spark.adb.acr.instanceId

    cri-jim1hhv0vxqy****

    容器镜像服务企业版实例ID,您可以在容器镜像服务控制台中获取。该参数仅企业版镜像服务实例需配置。

    spark.adb.eni.enabled

    true

    是否开启ENI访问开关,此处必须为true,取值:

    • true:开启

    • false(默认):不开启

    spark.adb.eni.vswitchId

    vsw-bp1o49nlrhc5q8wxt****

    部署弹性网卡的交换机ID,建议选择步骤二中添加到容器镜像服务访问控制中的交换机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应用开发介绍

相关文档