本文是大数据系列第 68 篇,手把手搭建 Apache Spark 分布式计算环境,基于已有的三节点 Hadoop 集群扩展部署。

完整图文版(含截图):CSDN 原文 | 掘金

环境前提

本文假设已按照本系列前几篇完成以下准备:

  • 三台 Linux 节点(h121h122h123),已配置免密 SSH
  • Hadoop 3.x 集群已正常运行(HDFS + YARN)
  • JDK 8 已安装,JAVA_HOME 环境变量已配置

下载 Spark

从 Apache 官方归档下载与 Hadoop 版本匹配的 Spark(选择 without-hadoop 版本,避免 Jar 冲突):

# 下载 Spark 2.4.5(without-hadoop 版本)
wget https://archive.apache.org/dist/spark/spark-2.4.5/spark-2.4.5-bin-without-hadoop-scala-2.12.tgz

# 解压到统一安装目录
tar -zxvf spark-2.4.5-bin-without-hadoop-scala-2.12.tgz -C /opt/servers/
cd /opt/servers/
mv spark-2.4.5-bin-without-hadoop-scala-2.12 spark-2.4.5

配置环境变量

/etc/profile 中追加 Spark 环境变量(三个节点都需要执行):

export SPARK_HOME=/opt/servers/spark-2.4.5
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

执行 source /etc/profile 使配置生效。

配置核心文件

进入 $SPARK_HOME/conf 目录,复制模板文件并修改:

slaves —— 从节点列表

cp slaves.template slaves

编辑 slaves,填入所有 Worker 节点的主机名:

h121.wzk.icu
h122.wzk.icu
h123.wzk.icu

spark-env.sh —— 环境参数

cp spark-env.sh.template spark-env.sh

在文件末尾添加:

export JAVA_HOME=/opt/servers/jdk1.8
export HADOOP_HOME=/opt/servers/hadoop-3.1.3
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_HOME=/opt/servers/spark-2.4.5
export SPARK_MASTER_HOST=h121.wzk.icu
export SPARK_MASTER_PORT=7077

spark-defaults.conf —— 默认配置

cp spark-defaults.conf.template spark-defaults.conf

添加关键参数:

spark.master                     spark://h121.wzk.icu:7077
spark.eventLog.enabled           true
spark.eventLog.dir               hdfs://h121.wzk.icu:8020/spark-logs
spark.driver.memory              512m
spark.serializer                 org.apache.spark.serializer.KryoSerializer

注意:事件日志目录需提前在 HDFS 上创建:hadoop fs -mkdir -p /spark-logs

分发配置到其他节点

使用 rsync 将配置文件同步到 h122、h123:

rsync -av /opt/servers/spark-2.4.5 root@h122.wzk.icu:/opt/servers/
rsync -av /opt/servers/spark-2.4.5 root@h123.wzk.icu:/opt/servers/

# 同步环境变量(或在各节点手动添加)
rsync -av /etc/profile root@h122.wzk.icu:/etc/profile
rsync -av /etc/profile root@h123.wzk.icu:/etc/profile

启动集群

在 Master 节点(h121)执行:

# 启动所有节点(Master + 全部 Worker)
$SPARK_HOME/sbin/start-all.sh

# 验证进程
jps
# h121: Master
# h122/h123: Worker

访问 Spark Web UI:http://h121.wzk.icu:8080,可看到已注册的 Worker 节点及可用资源。

验证:运行示例程序

使用内置的 Pi 估算示例验证集群是否正常:

spark-submit \
  --master spark://h121.wzk.icu:7077 \
  --class org.apache.spark.examples.SparkPi \
  $SPARK_HOME/examples/jars/spark-examples_2.12-2.4.5.jar \
  100

执行完毕后,控制台输出 Pi is roughly 3.14159... 即表示集群部署成功。

常见问题

问题排查方向
Worker 无法注册到 Master检查防火墙是否开放 7077 端口;确认 spark-env.shSPARK_MASTER_HOST 填写正确
事件日志写入失败确认 HDFS /spark-logs 目录已创建且有写权限
序列化异常确认 KryoSerializer 配置正确,自定义类已注册

Spark Standalone 集群搭建完成后,下一步将学习核心数据抽象 RDD 的概念与操作。