PySpark集群模式Executor异常终止(KILLED exitStatus143)问题排查
解决Docker部署Spark集群模式下Worker无法连接Cassandra的问题
问题根源
Docker容器的网络隔离特性导致:Spark Worker容器内的localhost指向容器自身,而非Cassandra容器或宿主机,因此集群模式下Worker无法通过localhost:9042访问Cassandra。而local模式下Driver运行在宿主机(或与Cassandra同网络的容器),所以能正常连接。
解决方案
1. 统一Docker网络
确保Spark Master、Worker及Cassandra容器处于同一个自定义Docker网络中:
- 创建自定义网络:
docker network create spark-cassandra-net - 启动所有容器时加入该网络:
- Cassandra启动命令示例:
docker run -d --name cassandra --network spark-cassandra-net cassandra:latest - Spark Master启动命令示例:
docker run -d --name spark-master --network spark-cassandra-net -p 7077:7077 -p 8080:8080 spark:latest master - Spark Worker启动命令示例:
docker run -d --name spark-worker --network spark-cassandra-net spark:latest worker spark://spark-master:7077
- Cassandra启动命令示例:
2. 修改Cassandra连接地址
将PySpark应用中Cassandra的连接地址从localhost:9042改为Cassandra容器的容器名(或自定义网络内的IP,容器名更稳定):
- 在代码中配置:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("KafkaToCassandra") \ .config("spark.cassandra.connection.host", "cassandra") \ .getOrCreate() - 或在spark-submit命令中添加配置:
spark-submit --master spark://localhost:7077 --conf spark.cassandra.connection.host=cassandra your_app.py
3. 检查Cassandra监听配置
确保Cassandra允许外部容器访问:
- 修改Cassandra的
cassandra.yaml配置文件:- 将
listen_address和rpc_address设置为0.0.0.0(允许所有网络访问) - 官方Cassandra镜像默认已配置为允许外部访问,若使用自定义镜像需确认此配置。
- 将
4. 验证网络连通性
进入Spark Worker容器,测试与Cassandra的连通性:
docker exec -it spark-worker nc -zv cassandra 9042
若返回succeeded!则说明网络连通正常。
关于exitStatus143的说明
Executor的exitStatus143是收到SIGTERM信号导致的终止,本质是Worker因无法连接Cassandra导致任务失败,被Spark集群终止进程,解决网络连接问题后该状态会消失。
内容的提问来源于stack exchange,提问作者melon
相关产品推荐
相关产品推荐

