当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位,更多信息请参见一键购买包年包月实例。
操作步骤
创建容器镜像服务实例,并在该实例中创建命令空间与镜像仓库,更多信息请参见创建企业版实例。
创建容器镜像实例时,您可以选择企业版实例(推荐)或个人版实例,企业版实例在访问、存储方面具有更高级别的安全性,同时具有高效分发的特性。本文以企业版实例为例进行介绍,更多信息请参见个人版和企业版实例差异化说明。
说明您的自定义镜像将推送至该实例中,AnalyticDB for MySQL Spark在提交作业时也将从该实例中拉取自定义镜像。
创建企业版镜像服务实例会产生费用,更多信息请参见企业版实例计费说明。
将ECS实例的VPC和vSwithch信息添加到容器镜像服务实例的访问控制中,才能建立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
容器镜像服务中镜像仓库连接地址。
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应用的信息,请参见Spark应用开发介绍。