Spark独立集群部署PredictionIO:训练成功但部署失败求助
问题分析与排查建议
我在用PredictionIO的Recommendation模板做测试,已经完成了以下部署步骤:
- 在Docker容器中安装事件服务器
- 配置事件数据、元数据等存储至MySQL
- 在另一Docker容器中部署训练与服务端
- 在另一容器中部署Spark独立集群
- 创建新应用
- 导入足量事件数据
本地执行pio train和pio deploy一切正常,但使用Spark集群执行部署命令时失败——训练操作成功(新模型已存入MySQL),但deploy环节报错。
执行的Spark集群命令
pio train -v engine.json -- --master spark://predictionspark:7077 --executor-memory 2G --driver-memory 2G --total-executor-cores 1 pio deploy -v engine.json --feedback --event-server-ip predictionevent --event-server-port 7070 --accesskey Th7k5gE5yEu9ZdTdM6KdAj0InDrLNJQ1U3qEBy7dbMnYgTxWx5ALNAa2hKjqaHSK -- --master spark://predictionspark:7077 --executor-memory 2G --driver-memory 2G --total-executor-cores 1
部分失败日志
[INFO] [Runner$] Submission command: /spark/bin/spark-submit --master spark://predictionspark:7077 --executor-memory 2G --driver-memory 2G --total-executor-cores 1 --class org.apache.predictionio.workflow.CreateWorkflow --jars file:/PredictionIO/lib/mysql-connector-java-5.1.46.jar,file:/ebsa/app/cf/target/scala-2.11/template-scala-parallel-recommendation_2.11-0.1-SNAPSHOT.jar,file:/ebsa/app/cf/target/scala-2.11/template-scala-parallel-recommendation-assembly-0.1-SNAPSHOT-deps.jar,file:/PredictionIO/lib/spark/pio-data-elasticsearch-assembly-0.12.1.jar,file:/PredictionIO/lib/spark/pio-data-hbase-assembly-0.12.1.jar,file:/PredictionIO/lib/spark/pio-data-jdbc-assembly-0.12.1.jar,file:/PredictionIO/lib/spark/pio-data-localfs-assembly-0.12.1.jar,file:/PredictionIO/lib/spark/pio-data-s3-assembly-0.12.1.jar,file:/PredictionIO/lib/spark/pio-data-hdfs-assembly-0.12.1.jar --files file:/PredictionIO/conf/log4j.properties --driver-class-path /PredictionIO/conf:/PredictionIO/lib/mysql-connector-java-5.1.46.jar --driver-java-options -Dpio.log.dir=/root file:/PredictionIO/lib/pio-assembly-0.12.1.jar --engine-id org.example.recommendation.RecommendationEngine --engine-version 0387c097c02018fa29109a8990b03d163249be00 --engine-variant file:/ebsa/app/cf/engine.json --verbosity 0 --json-extractor Both --env PIO_ENV_LOADED=1,PIO_STORAGE_SOURCES_MYSQL_PASSWORD=***,PIO_STORAGE_REPOSITORIES_METADATA_NAME=pio_meta,PIO_FS_BASEDIR=/root/.pio_store,PIO_STORAGE_SOURCES_MYSQL_URL=jdbc:mysql://***:3306/predictionio,PIO_HOME=/PredictionIO,PIO_FS_ENGINESDIR=/root/.pio_store/engines,PIO_STORAGE_SOURCES_MYSQL_TYPE=jdbc,PIO_STORAGE_REPOSITORIES_METADATA_SOURCE=MYSQL,PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=MYSQL,PIO_STORAGE_REPOSITORIES_EVENTDATA_NAME=pio_event,PIO_STORAGE_SOURCES_MYSQL_USERNAME=***,PIO_FS_TMPDIR=/root/.pio_store/tmp,PIO_STORAGE_REPOSITORIES_MODELDATA_NAME=pio_model,PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE=MYSQL,PIO_CONF_DIR=/PredictionIO/conf [INFO] [Engine] Extracting datasource params... [INFO] [WorkflowUtils$] No 'name' is found. Default empty String will be used. [INFO] [Engine] Datasource params: (,DataSourceParams(cf,None)) [INFO] [Engine] Extracting preparator params... [INFO] [Engine] Preparator params: (,Empty) [INFO] [Engine] Extracting serving params... [INFO] [Engine] Serving params: (,Empty) [INFO] [log] Logging initialized @6069ms [INFO] [Server] jetty-9.3.z-SNAPSHOT [INFO] [Server] Started @6184ms [WARN] [Utils] Service 'SparkUI' could not bind on port 4040. Attempting port 4041. [INFO] [AbstractConnector] Started ServerConnector@2b53840a{HTTP/1.1,[http/1.1]}{0.0.0.0:4041} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@422ad5e2{/jobs,null,AVAILABLE,@Spark} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@1b3ab4f9{/jobs/json,null,AVAILABLE,@Spark} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@1c8f6c66{/jobs/job,null,AVAILABLE,@Spark} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@151732fb{/jobs/job/json,null,AVAILABLE,@Spark} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@40ed1802{/stages,null,AVAILABLE,@Spark} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@feb098f{/stages/json,null,AVAILABLE,@Spark} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@31e739bf{/stages/stage,null,AVAILABLE,@Spark} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@7f42e06e{/stages/stage/json,null,AVAILABLE,@Spark} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@2efd2f21{/stages/pool,null,AVAILABLE,@Spark} [INFO] [ContextHandler] Started o.s.j.s.ServletContextHandler@316cda31{/sta
从目前信息来看,日志被截断了(最后一行不完整),完整的报错信息是定位问题的核心。不过结合场景,我整理了几个常见的排查方向:
容器间网络连通性检查
- 部署服务端的容器要能访问Spark集群的
predictionspark:7077,同时Spark executor节点也要能反向访问部署容器(deploy启动服务后,Spark可能需要回调或拉取模型) - 在部署容器内用
ping predictionspark、telnet predictionspark 7077测试连通性,同时确认事件服务器predictionevent:7070的访问正常(因为开启了--feedback需要实时接收事件)
- 部署服务端的容器要能访问Spark集群的
模型加载权限与依赖问题
- 虽然训练成功把模型存入MySQL,但Spark集群的executor节点是否有权限访问MySQL?确认
mysql-connector-java的jar包在所有executor节点都能被加载(日志里submit命令已包含该jar,但要保证集群节点能获取到) - 核对PIO存储配置,确保
PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=MYSQL在deploy时的环境变量中正确配置(日志里已存在,但避免拼写错误)
- 虽然训练成功把模型存入MySQL,但Spark集群的executor节点是否有权限访问MySQL?确认
Spark资源与端口冲突
- 尝试调整Spark资源参数,比如把
--executor-memory提升到4G、增加--total-executor-cores数量,看是否是资源不足导致部署失败 - 检查部署容器的端口占用情况:deploy默认启动8000端口,可尝试用
--port 8001指定其他端口测试;SparkUI的4040端口冲突是小问题,但也要确保服务端口未被占用
- 尝试调整Spark资源参数,比如把
版本兼容性验证
- 确认PredictionIO 0.12.1与Spark集群版本是否兼容(比如Spark 2.x和PIO 0.12.1是否匹配),版本不匹配容易出现部署时的依赖冲突
最后一定要获取完整的错误日志,deploy失败后会输出具体的异常信息(比如Exception或Error栈),这是精准定位问题的关键。
内容的提问来源于stack exchange,提问作者user8036017
相关产品推荐
相关产品推荐

