Spark 集群公网互通场景配置方案
🗂️ 地址规划
-
公网地址:
- Master 节点:
100.112.4.22(主控节点,master-node) - Worker 节点1:
100.112.5.61(worker-node1) - Driver 节点(Client 模式提交任务):
100.112.6.32
- Master 节点:
-
假设的内网地址(不可互通,仅作为说明):
- Master 节点:
172.31.1.34 - Worker 节点1:
122.31.1.34 - Driver 节点:
182.31.1.34
- Master 节点:
背景:三台机器只有公网互通,内网不可互通。Spark 集群必须依赖公网 IP 进行通信。此时如果直接在
spark-env.sh中设置SPARK_MASTER_HOST=master-node(解析到公网),Master 启动会失败,因为 Spark 尝试绑定一个并未直接配置在网卡上的公网地址。解决办法是 监听本机可绑定地址(0.0.0.0 或内网 IP),公布公网地址用于访问。
📌 /etc/hosts 统一方案
在三台机器的 /etc/hosts 中统一配置:
bash
100.112.4.22 master-node
100.112.5.61 worker-node1
100.112.6.32 driver-node
注意:这里仅映射公网地址,不要混入内网地址,避免解析冲突。
⚙️ Master 节点 $SPARK_HOME/conf/spark-env.sh
bash
#!/usr/bin/env bash
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
# Master 监听所有网卡,避免绑定公网失败
export SPARK_MASTER_HOST=0.0.0.0
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8080
# 公布公网地址(UI、集群信息显示用)
export SPARK_PUBLIC_DNS=100.112.4.22
# Worker / Driver 常用端口
export SPARK_WORKER_WEBUI_PORT=8081
export SPARK_DRIVER_PORT=7080
export SPARK_BLOCKMANAGER_PORT=7081
export SPARK_LOG_DIR=$SPARK_HOME/logs
⚙️ Worker 节点 $SPARK_HOME/conf/spark-env.sh
Worker1(100.112.5.61):
bash
#!/usr/bin/env bash
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
# 公布公网地址
export SPARK_PUBLIC_DNS=100.112.5.61
export SPARK_WORKER_WEBUI_PORT=8081
export SPARK_DRIVER_PORT=7080
export SPARK_BLOCKMANAGER_PORT=7081
export SPARK_LOG_DIR=$SPARK_HOME/logs
启动 Worker:
bash
$SPARK_HOME/sbin/start-worker.sh spark://100.112.4.22:7077
📄 spark-defaults.conf(可选)
在 Master 节点配置(Driver 公网可回连):
bash
spark.driver.host 100.112.6.32
spark.driver.port 7080
spark.driver.bindAddress 0.0.0.0
💻 Driver 端参数指定方案(Client 模式)
Driver 在 100.112.6.32 上运行,代码示例:
java
SparkConf conf = new SparkConf();
// 资源配置
conf.set("spark.executor.instances", "6");
conf.set("spark.executor.cores", "8");
conf.set("spark.executor.memory", "16g");
conf.set("spark.driver.memory", "8g");
// Master 公网地址
conf.set("spark.master", "spark://100.112.4.22:7077");
// Driver 公网地址(必须是 Worker 可达)
conf.set("spark.driver.host", "100.112.6.32");
conf.set("spark.driver.port", "7080");
conf.set("spark.driver.bindAddress", "0.0.0.0");
🚀 总结
- SPARK_MASTER_HOST :不要直接设为公网映射的主机名,否则启动失败。应设为
0.0.0.0或本机内网 IP。 - SPARK_PUBLIC_DNS:公布公网地址,供 UI 和集群信息显示。
- Worker:通过公网地址注册到 Master。
- Driver:必须指定公网 IP,保证 Executor 能回连。
- hosts:统一映射公网地址,避免混入内网。
要不要我帮你写一个 完整的启动顺序脚本(start-all.sh),专门针对这种"仅公网互通"的场景?这样你只需要一条命令就能拉起整个集群。