Apache PredictionIO Helm Charts 部署指南:在 Kubernetes 上安装 PredictionIO 与 Spark 集群
2026/9/23 1:12:21 网站建设 项目流程

Apache PredictionIO Helm Charts 部署指南:在 Kubernetes 上安装 PredictionIO 与 Spark 集群

【免费下载链接】predictionioPredictionIO, a machine learning server for developers and ML engineers.项目地址: https://gitcode.com/gh_mirrors/pred/predictionio

本指南以仓库 docker/charts/README.md 为核心,系统讲解如何借助 Helm Charts 将 Apache PredictionIO 部署到 Kubernetes 集群:包括以 PostgreSQL 作为存储后端安装 PredictionIO、通过kubectl port-forward访问内置 Jupyter、独立安装 Spark 集群,并最终使用pio train -- --master spark://...将训练任务提交到 Spark 集群。读完本文,你将能够在一套 Kubernetes 环境中完整落地「存储 + PredictionIO + Jupyter + Spark」的机器学习服务基础设施。

Helm Charts 概览:PredictionIO 的 Kubernetes 打包方式

Helm Charts 本质上是「预配置好的 Kubernetes 资源包」,它将 Deployment、Service、ConfigMap 等 Kubernetes 对象模板化,配合 values 文件实现参数化安装。仓库中的docker/charts目录提供了两套可直接安装的 Chart:

  • predictionio:PredictionIO 主服务 Chart。其Chart.yaml声明了name: predictionioversion: 0.1.0appVersion: 0.13.0,默认镜像为predictionio/pio-jupyter(见 predictionio/values.yaml),即一个同时内置 PredictionIO 与 Jupyter Notebook 的运行环境。
  • spark:Apache Spark 集群 Chart,appVersion: 2.3.2,包含 Spark Master、Worker 与 Web UI,供 PredictionIO 提交训练任务使用。

两套 Chart 可以独立安装、独立管理:PredictionIO 的元数据、事件数据、模型数据存储在后端数据库中,而训练计算则交给独立的 Spark 集群。下面按官方文档的步骤,从「PredictionIO + PostgreSQL」开始安装。

前置条件

在开始之前,请确保你的环境满足以下条件:

  • 一个可用的 Kubernetes 集群(并已配置好kubectl访问凭证);
  • 已安装 Helm 客户端;
  • 集群节点可以拉取predictionio/pio-jupyterstable/postgresqlbde2020/spark-masterbde2020/spark-worker等容器镜像;
  • 从模板细节看,这两套 Chart 的模板(如 pio-deployment.yaml 中的apiVersion: apps/v1beta2、spark-master-deployment.yaml 中的extensions/v1beta1)面向较早期版本的 Kubernetes/Helm 编写,若你的集群版本较新,建议先评估 API 版本兼容性。

第一步:安装 PredictionIO 与 PostgreSQL

官方文档给出的安装过程分两步:先装 PostgreSQL,再装 PredictionIO,全程使用helm install命令:

helm install --name my-postgresql stable/postgresql -f postgresql.yaml helm install --name my-pio ./predictionio -f predictionio_postgresql.yaml

postgresql.yamlpredictionio_postgresql.yaml分别是这两次安装使用的 values 覆盖文件,下面逐一解析。

PostgreSQL Chart 配置解析

postgresql.yaml 是传给stable/postgresqlChart 的 values 文件,内容如下:

postgresqlUsername: pio postgresqlPassword: pio postgresqlDatabase: pio # for testing persistence: enabled: false
  • postgresqlUsername/postgresqlPassword/postgresqlDatabase:创建数据库pio,用户名与密码均为pio,与后续 PredictionIO 的环境变量一一对应;
  • persistence.enabled: false:关闭持久化存储,注释明确标注「for testing」——生产环境请删除或改写此段以启用持久卷,否则 Pod 重启后数据会丢失。

第一次安装的 release 名为my-postgresql,Helm 会为该 release 生成形如my-postgresql-postgresql的 Service 名称,这正是第二个配置文件中数据库连接地址的来源。

PredictionIO Chart 配置解析

predictionio_postgresql.yaml 通过覆盖pio.env列表,告诉 PredictionIO 容器如何连接上面安装的 PostgreSQL。核心是四个存储相关环境变量组,这与 PredictionIO 的「统一存储」设计一致——Metadata、Event Data、Model Data 三类数据仓库分别可指定独立的存储后端:

环境变量作用
PIO_STORAGE_SOURCES_PGSQL_TYPEjdbc存储源类型,PredictionIO 通过 JDBC 访问 PostgreSQL
PIO_STORAGE_SOURCES_PGSQL_URLjdbc:postgresql://my-postgresql-postgresql:5432/pio数据库连接地址:Service 名 + 默认端口 5432 + 库名pio
PIO_STORAGE_SOURCES_PGSQL_USERNAMEpio数据库用户名
PIO_STORAGE_SOURCES_PGSQL_PASSWORDpio数据库密码
PIO_STORAGE_REPOSITORIES_MODELDATA_NAMEpio_model模型数据仓库名
PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCEPGSQL模型数据仓库使用 PGSQL 源
PIO_STORAGE_REPOSITORIES_METADATA_NAMEpio_meta元数据仓库名
PIO_STORAGE_REPOSITORIES_METADATA_SOURCEPGSQL元数据仓库使用 PGSQL 源
PIO_STORAGE_REPOSITORIES_EVENTDATA_NAMEpio_event事件数据仓库名
PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCEPGSQL事件数据仓库使用 PGSQL 源
PYSPARK_DRIVER_PYTHON_OPTSnotebook --NotebookApp.token=''启动 Jupyter Notebook 且关闭 token 鉴权(仅测试环境建议)

这套变量与 PredictionIO 的 pio-env 配置体系对应:仓库中的 pio-env.sh.template 使用同样的PIO_STORAGE_SOURCES_*PIO_STORAGE_REPOSITORIES_*命名规范,Chart 只是把这些配置以环境变量形式注入容器,从而免去手工编辑配置文件。

Deployment 与 Service 模板解读

PredictionIO Chart 的运行时形态由两个模板文件决定:

  • pio-deployment.yaml 定义 Deployment:默认replicas: 1,容器镜像由pio.image.repository:tag决定(默认predictionio/pio-jupyter:latest)。容器对外开放三个端口:7070(event,事件服务器)8000(predict,预测服务)8888(jupyter),并分别配置了 livenessProbe 与 readinessProbe,均通过 HTTP GET 探测 7070 端口/路径。此外还支持resourcesnodeSelectoraffinitytolerations等标准调度配置(默认均为空)。
  • pio-service.yaml 定义 Service:默认type: ClusterIP,暴露 8888 端口映射到容器 8888 端口,名称为jupyter,selector 依据app.kubernetes.io/nameapp.kubernetes.io/instance匹配 Pod。

values.yaml 是 PredictionIO Chart 的默认值全集,其中还保留了pio.service.type(可改为NodePortLoadBalancer)与pio.replicas等参数,方便按需覆盖。

第二步:通过 port-forward 访问 Jupyter

安装完成后,PredictionIO 容器内置的 Jupyter Notebook 运行在 8888 端口。官方文档使用kubectl port-forward将本地端口转发到 Pod,然后打开http://localhost:8888/

export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=predictionio,app.kubernetes.io/instance=my-pio" -o jsonpath="{.items[0].metadata.name}") kubectl port-forward $POD_NAME 8888:8888

关键点:标签选择器app.kubernetes.io/name=predictionio,app.kubernetes.io/instance=my-pio中的instance值就是安装时的 release 名my-pio(如果换用其他 release 名,这里要同步修改)。由于 values 中设置了PYSPARK_DRIVER_PYTHON_OPTS="notebook --NotebookApp.token=''",访问http://localhost:8888/时不需要输入 token。

除了默认的 ClusterIP + port-forward 方式,NOTES.txt 模板还根据pio.service.type提供了两种访问路径:

  • NodePort:通过kubectl get ... -o jsonpath="{.spec.ports[0].nodePort}"获取节点端口,再用节点 IP 访问http://$NODE_IP:$NODE_PORT
  • LoadBalancer:等待云厂商分配loadBalancer.ingress[0].ip(可用kubectl get svc -w观察状态),访问http://$SERVICE_IP:8888

第三步:安装 Spark 集群

PredictionIO 的训练计算依赖 Spark。官方文档给出的命令非常简单:

helm install --name my-spark ./spark

该 Chart(spark/Chart.yaml,版本 0.3.0)会创建:

  • 1 个 Spark Master,7077 端口用于接收作业提交,8080 端口提供 Web UI;
  • 3 个 Spark Worker,默认关闭自动扩缩容,可通过 HPA 在 CPU 达到阈值时扩容(最多 10 个副本);
  • Master 与 WebUI 的 Service 默认类型为LoadBalancer

Spark Chart 可配置参数

spark/README.md 给出了完整参数表,整理如下:

Spark Master

参数说明默认值
Master.NameMaster 名称spark-master
Master.Image容器镜像名bde2020/spark-master
Master.ImageTag镜像标签2.2.2-hadoop2.7
Master.Replicas副本数1
Master.Component选择器 keyspark-master
Master.Cpu容器请求 CPU100m
Master.Memory容器请求内存512Mi
Master.ServicePortService 端口7077
Master.ContainerPort容器监听端口7077
Master.DaemonMemoryMaster JVM Xms/Xmx1g
Master.ServiceTypeService 类型LoadBalancer

Spark WebUI

参数说明默认值
WebUi.NameWebUI 名称spark-webui
WebUi.ServicePortService 端口8080
WebUi.ContainerPort容器监听端口8080

Spark Worker

参数说明默认值
Worker.NameWorker 名称spark-worker
Worker.Image容器镜像名bde2020/spark-worker
Worker.ImageTag镜像标签2.2.2-hadoop2.7
Worker.ReplicasDeployment 与 HPA 副本数3
Worker.ReplicasMaxHPA 最大副本数10
Worker.Component选择器 keyspark-worker
Worker.Cpu容器请求 CPU100m
Worker.Memory容器请求内存512Mi
Worker.ContainerPort容器监听端口7077(注:实际 Worker WebUI 为 8081,见 values.yaml)
Worker.CpuTargetPercentageHPA CPU 目标利用率50
Worker.DaemonMemoryWorker JVM Xms/Xmx1g
Worker.ExecutorMemoryWorker 可提供给 Executor 的内存1g
Worker.Autoscaling是否启用 HPAfalse

参数可以通过两种方式覆盖:

# 方式一:--set key=value helm install --name my-spark ./spark --set Worker.Replicas=5,Master.Cpu=500m # 方式二:-f 指定 values 文件 helm install --name my-spark -f values.yaml ./spark

Spark Master 的模板实现

从 spark-master-deployment.yaml 可以看到 Master 的完整形态:容器以spark-class org.apache.spark.deploy.master.Master启动,并通过环境变量注入SPARK_MASTER_HOSTSPARK_MASTER_PORT(默认 7077)、SPARK_MASTER_WEBUI_PORT(默认 8080)、SPARK_DAEMON_MEMORY(默认 1g),同时暴露 7077(提交端口)与 8080(Web UI)两个容器端口;同文件还定义了两个 Service:master(7077)与webui(8080)。而 spark-worker-hpa.yaml 仅在Worker.Autoscaling.Enabled=true时才会生成HorizontalPodAutoscaler,以Worker.ReplicasMax为上限、Worker.CpuTargetPercentage为 CPU 目标利用率进行扩容。

第四步:向 Spark 集群提交训练任务

Spark 集群就绪后,即可在 PredictionIO 容器内执行pio train,并通过--把参数透传给 Spark,指定 Master 地址为上面安装的集群:

pio train -- --master spark://my-spark-master:7077

这里的spark://my-spark-master:7077中,my-spark是 Spark Chart 的 release 名,master是该 Chart 生成的 Master Service 名称,7077 是 Spark 标准提交端口。如果想在pio eval等其他需要 Spark 的命令中使用集群,也可以用同样的-- --master spark://my-spark-master:7077方式指定。若改为 ClusterIP 类型的 Service,则可以从集群内任意 Pod 以该地址访问 Master。

自定义部署:修改 values 与整体拓扑

结合前文各配置文件的说明,你可以按需调整整套部署:

  • 更换存储后端:本指南的 Chart 默认把三类仓库全部指向 PGSQL;PredictionIO 支持多个存储源(仓库中 pgsql、mysql、elasticsearch、hbase 等均有对应的 compose 与实现),你可以在pio.env中为EVENTDATAMETADATAMODELDATA分别指定不同源与不同连接参数。
  • 调整副本与资源:修改 predictionio/values.yaml 中的pio.replicaspio.resources,或 Spark 的Worker.ReplicasMaster.Cpu/Memory
  • 暴露服务方式:将pio.service.type改为NodePort/LoadBalancer后,可依据 NOTES.txt 提示直接通过集群节点或负载均衡 IP 访问 Jupyter,无需 port-forward。
  • 生产注意事项postgresql.yamlpersistence.enabled: false仅适用于测试;生产环境应启用持久化,同时为 Jupyter 关闭NotebookApp.token=''这类简化鉴权的设置,并评估早期 API 版本模板与当前集群的兼容性。

总结

按照本文步骤,你可以在 Kubernetes 上完成一套可用的 PredictionIO 环境:stable/postgresql提供存储,./predictionioChart 提供带 Jupyter 的 PredictionIO 服务(7070 事件、8000 预测、8888 Jupyter),./sparkChart 提供训练集群,最终通过pio train -- --master spark://my-spark-master:7077将训练任务提交到 Spark。所有配置均可通过 values 文件与--set参数灵活覆盖,相关模板与配置的完整实现都可直接查阅仓库 docker/charts 目录下的源码继续深入学习。

【免费下载链接】predictionioPredictionIO, a machine learning server for developers and ML engineers.项目地址: https://gitcode.com/gh_mirrors/pred/predictionio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询