Kubeflow Notebook无法以YARN模式连接远程Spark Session(Client模式故障)
问题描述
无法在Client模式下运行Spark,从Kubeflow Notebook以YARN模式连接Spark时触发以下错误:
Py4JJavaError: An error occurred while calling o81.showString.
: org.apache.spark.SparkException: Job 0 cancelled because SparkContext was shut down
at org.apache.spark.scheduler.DAGScheduler$$anonfun$cleanUpAfterSchedulerStop$1.apply(DAGScheduler.scala:932)
at org.apache.spark.scheduler.DAGScheduler$$anonfun$cleanUpAfterSchedulerStop$1.apply(DAGScheduler.scala:930)
已验证的前置条件
- 已在Notebook中成功提交Spark任务
- 可从Kubeflow Notebook以Cluster模式连接Spark
- 在Kubernetes Worker节点通过Python Shell能正常运行Spark Session并连接Cloudera管理的远程边缘节点
- Hadoop与Kubernetes集群间无网络连通性问题
解决方案
1. 指定Spark Driver的可访问地址
初始化SparkSession时,显式配置spark.driver.host为Kubeflow Notebook Pod的IP,同时指定spark.driver.port,确保YARN集群能反向连接到Driver:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .master("yarn") \ .appName("InteractiveSparkNotebook") \ .config("spark.driver.host", "<Notebook Pod IP>") \ .config("spark.driver.port", "4040") \ .config("spark.driver.bindAddress", "0.0.0.0") \ .getOrCreate()
获取Notebook Pod IP可在终端执行hostname -i,或通过Kubernetes控制台查看Pod详情。
2. 调整Notebook网络访问权限
确保Notebook Pod的指定端口(如4040)能被YARN集群节点访问:
- 检查Kubernetes NetworkPolicy是否允许YARN集群网段的流量访问该端口
- 若使用Istio,需配置VirtualService和DestinationRule开放对应端口
3. 防止SparkContext意外关闭
添加配置禁用SparkContext的自动销毁逻辑(仅用于调试场景):
.config("spark.driver.allowMultipleContexts", "true")
生产环境建议严格管理SparkContext单例,避免多实例冲突。
4. 排查YARN日志定位细节
通过YARN UI或执行以下命令查看Application日志,确认是否存在连接超时、拒绝等具体错误:
yarn logs -applicationId <你的Spark应用ID>
内容的提问来源于stack exchange,提问作者Kenan Arslanbay

