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目录提供了两套可直接安装的 ChartpredictionioPredictionIO 主服务 Chart。其Chart.yaml声明了name: predictionio、version: 0.1.0、appVersion: 0.13.0默认镜像为predictionio/pio-jupyter见 predictionio/values.yaml即一个同时内置 PredictionIO 与 Jupyter Notebook 的运行环境。sparkApache Spark 集群 ChartappVersion: 2.3.2包含 Spark Master、Worker 与 Web UI供 PredictionIO 提交训练任务使用。两套 Chart 可以独立安装、独立管理PredictionIO 的元数据、事件数据、模型数据存储在后端数据库中而训练计算则交给独立的 Spark 集群。下面按官方文档的步骤从「PredictionIO PostgreSQL」开始安装。前置条件在开始之前请确保你的环境满足以下条件一个可用的 Kubernetes 集群并已配置好kubectl访问凭证已安装 Helm 客户端集群节点可以拉取predictionio/pio-jupyter、stable/postgresql、bde2020/spark-master、bde2020/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.yamlpostgresql.yaml与predictionio_postgresql.yaml分别是这两次安装使用的 values 覆盖文件下面逐一解析。PostgreSQL Chart 配置解析postgresql.yaml 是传给stable/postgresqlChart 的 values 文件内容如下postgresqlUsername: pio postgresqlPassword: pio postgresqlDatabase: pio # for testing persistence: enabled: falsepostgresqlUsername/postgresqlPassword/postgresqlDatabase创建数据库pio用户名与密码均为pio与后续 PredictionIO 的环境变量一一对应persistence.enabled: false关闭持久化存储注释明确标注「for testing」——生产环境请删除或改写此段以启用持久卷否则 Pod 重启后数据会丢失。第一次安装的 release 名为my-postgresqlHelm 会为该 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 访问 PostgreSQLPIO_STORAGE_SOURCES_PGSQL_URLjdbc:postgresql://my-postgresql-postgresql:5432/pio数据库连接地址Service 名 默认端口 5432 库名pioPIO_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。容器对外开放三个端口7070event事件服务器、8000predict预测服务、8888jupyter并分别配置了 livenessProbe 与 readinessProbe均通过 HTTP GET 探测 7070 端口/路径。此外还支持resources、nodeSelector、affinity、tolerations等标准调度配置默认均为空。pio-service.yaml 定义 Service默认type: ClusterIP暴露 8888 端口映射到容器 8888 端口名称为jupyterselector 依据app.kubernetes.io/name与app.kubernetes.io/instance匹配 Pod。values.yaml 是 PredictionIO Chart 的默认值全集其中还保留了pio.service.type可改为NodePort或LoadBalancer与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/namepredictionio,app.kubernetes.io/instancemy-pio -o jsonpath{.items[0].metadata.name}) kubectl port-forward $POD_NAME 8888:8888关键点标签选择器app.kubernetes.io/namepredictionio,app.kubernetes.io/instancemy-pio中的instance值就是安装时的 release 名my-pio如果换用其他 release 名这里要同步修改。由于 values 中设置了PYSPARK_DRIVER_PYTHON_OPTSnotebook --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_PORTLoadBalancer等待云厂商分配loadBalancer.ingress[0].ip可用kubectl get svc -w观察状态访问http://$SERVICE_IP:8888。第三步安装 Spark 集群PredictionIO 的训练计算依赖 Spark。官方文档给出的命令非常简单helm install --name my-spark ./spark该 Chartspark/Chart.yaml版本 0.3.0会创建1 个 Spark Master7077 端口用于接收作业提交8080 端口提供 Web UI3 个 Spark Worker默认关闭自动扩缩容可通过 HPA 在 CPU 达到阈值时扩容最多 10 个副本Master 与 WebUI 的 Service 默认类型为LoadBalancer。Spark Chart 可配置参数spark/README.md 给出了完整参数表整理如下Spark Master参数说明默认值Master.NameMaster 名称spark-masterMaster.Image容器镜像名bde2020/spark-masterMaster.ImageTag镜像标签2.2.2-hadoop2.7Master.Replicas副本数1Master.Component选择器 keyspark-masterMaster.Cpu容器请求 CPU100mMaster.Memory容器请求内存512MiMaster.ServicePortService 端口7077Master.ContainerPort容器监听端口7077Master.DaemonMemoryMaster JVM Xms/Xmx1gMaster.ServiceTypeService 类型LoadBalancerSpark WebUI参数说明默认值WebUi.NameWebUI 名称spark-webuiWebUi.ServicePortService 端口8080WebUi.ContainerPort容器监听端口8080Spark Worker参数说明默认值Worker.NameWorker 名称spark-workerWorker.Image容器镜像名bde2020/spark-workerWorker.ImageTag镜像标签2.2.2-hadoop2.7Worker.ReplicasDeployment 与 HPA 副本数3Worker.ReplicasMaxHPA 最大副本数10Worker.Component选择器 keyspark-workerWorker.Cpu容器请求 CPU100mWorker.Memory容器请求内存512MiWorker.ContainerPort容器监听端口7077注实际 Worker WebUI 为 8081见 values.yamlWorker.CpuTargetPercentageHPA CPU 目标利用率50Worker.DaemonMemoryWorker JVM Xms/Xmx1gWorker.ExecutorMemoryWorker 可提供给 Executor 的内存1gWorker.Autoscaling是否启用 HPAfalse参数可以通过两种方式覆盖# 方式一--set keyvalue helm install --name my-spark ./spark --set Worker.Replicas5,Master.Cpu500m # 方式二-f 指定 values 文件 helm install --name my-spark -f values.yaml ./sparkSpark Master 的模板实现从 spark-master-deployment.yaml 可以看到 Master 的完整形态容器以spark-class org.apache.spark.deploy.master.Master启动并通过环境变量注入SPARK_MASTER_HOST、SPARK_MASTER_PORT默认 7077、SPARK_MASTER_WEBUI_PORT默认 8080、SPARK_DAEMON_MEMORY默认 1g同时暴露 7077提交端口与 8080Web UI两个容器端口同文件还定义了两个 Servicemaster7077与webui8080。而 spark-worker-hpa.yaml 仅在Worker.Autoscaling.Enabledtrue时才会生成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 默认把三类仓库全部指向 PGSQLPredictionIO 支持多个存储源仓库中 pgsql、mysql、elasticsearch、hbase 等均有对应的 compose 与实现你可以在pio.env中为EVENTDATA、METADATA、MODELDATA分别指定不同源与不同连接参数。调整副本与资源修改 predictionio/values.yaml 中的pio.replicas、pio.resources或 Spark 的Worker.Replicas、Master.Cpu/Memory。暴露服务方式将pio.service.type改为NodePort/LoadBalancer后可依据 NOTES.txt 提示直接通过集群节点或负载均衡 IP 访问 Jupyter无需 port-forward。生产注意事项postgresql.yaml中persistence.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),仅供参考
