K8s SparkOperator环境下Spark任务连接HBase失败求助
问题描述
本地运行Spark脚本从HBase读取数据并打印一切正常,但通过K8s的Spark Operator提交SparkApplication时,Driver报连接拒绝错误:
Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect java.net.ConnectException: Connection refused
使用的SparkApplication YAML配置如下:
apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: hbase-v1 namespace: spark-jobs spec: type: Python pythonVersion: "3" mode: cluster image: "yami1012/hbase-spark:latest" imagePullPolicy: Always mainApplicationFile: local:///opt/spark/code_hbase/spark.py sparkVersion: "3.3.2" restartPolicy: type: OnFailure onFailureRetries: 3 onFailureRetryInterval: 10 onSubmissionFailureRetries: 5 onSubmissionFailureRetryInterval: 20 sparkConf: spark.driver.host: "localhost" driver: hostNetwork: true cores: 1 coreLimit: "1200m" memory: "512m" labels: version: 3.1.1 serviceAccount: spark executor: cores: 1 instances: 1 memory: "512m" labels: version: 3.1.1
单独用host网络运行镜像执行脚本正常,尝试创建Headless Service未解决问题。
解决方案
1. 移除错误的spark.driver.host配置
集群模式下,Spark Driver运行在K8s Pod内,将spark.driver.host设为localhost会导致Executor尝试连接自身的localhost,无法与Driver通信,同时干扰Driver访问HBase的网络路径。直接删除该配置,让Spark自动通过K8s服务发现机制获取Driver地址。
2. 确保HBase配置正确传入Spark Pod
Spark需要读取hbase-site.xml连接HBase集群,需确保配置文件能被Driver和Executor Pod加载:
- 若配置已打包进镜像,确认路径为
/opt/spark/conf/hbase-site.xml(Spark默认加载该目录下的配置) - 若使用ConfigMap挂载,在SparkApplication YAML中添加如下配置:
重点检查spec: driver: volumes: - name: hbase-config configMap: name: hbase-site-config # 替换为你的ConfigMap名称 volumeMounts: - name: hbase-config mountPath: /opt/spark/conf/hbase-site.xml subPath: hbase-site.xml executor: volumes: - name: hbase-config configMap: name: hbase-site-config volumeMounts: - name: hbase-config mountPath: /opt/spark/conf/hbase-site.xml subPath: hbase-site.xmlhbase-site.xml中的hbase.zookeeper.quorum配置,需填写K8s中HBase ZooKeeper集群的可访问地址(如ZooKeeper Service名称+端口,格式:zk-service-name.default.svc.cluster.local:2181)
3. 统一Driver和Executor的网络模式
当前仅Driver开启hostNetwork: true,Executor未配置,导致两者网络环境不一致:
- 要么给Executor也添加
hostNetwork: true配置,确保两者都使用宿主机网络访问HBase - 要么都关闭
hostNetwork,依赖K8s集群网络和服务发现访问HBase
4. 验证HBase网络连通性
进入Driver Pod内部,测试HBase ZooKeeper端口的连通性:
# 替换为你的ZooKeeper地址 telnet hbase-zk-service.spark-jobs.svc.cluster.local 2181
若连接失败,检查:
- K8s网络策略是否允许spark-jobs namespace访问HBase所在namespace的服务
- HBase集群所在网络是否对K8s节点开放相应端口(2181、16000等)
5. 确认Spark ServiceAccount权限
确保spark ServiceAccount拥有足够的权限访问集群内的服务和资源,比如允许创建Driver Service、访问ConfigMap等。
内容的提问来源于stack exchange,提问作者yami
相关产品推荐
相关产品推荐

