从零到一:Linux环境下Spark单机与集群部署实战指南
1. 环境准备Linux系统与基础依赖在开始部署Spark之前我们需要确保Linux系统已经准备好基础环境。我推荐使用Ubuntu 20.04 LTS或CentOS 7作为操作系统这两个版本在社区支持和企业环境中都比较常见。实际操作中我发现新装系统经常会缺少一些基础依赖这里列出必须安装的组件# Ubuntu/Debian系 sudo apt-get update sudo apt-get install -y openjdk-8-jdk scala git python3-pip ssh pdsh # CentOS/RHEL系 sudo yum install -y java-1.8.0-openjdk scala git python3-pip openssh-clients pdsh安装完成后建议做三个关键检查Java版本验证java -version应该显示1.8.xSpark 2.x对Java 11支持有限SSH免密登录配置集群部署时需要节点间无密码访问系统防火墙设置需要开放Spark使用的端口默认8080、4040等注意如果使用企业内网环境可能需要先配置代理才能正常下载安装包。建议提前准备好Spark安装包如spark-3.3.1-bin-hadoop3.tgz到本地避免下载中断。2. 单机版Spark部署实战2.1 安装与配置将下载好的Spark安装包上传到服务器后我习惯将其解压到/opt目录下这样便于多用户共享使用。具体操作如下sudo tar -zxvf spark-3.3.1-bin-hadoop3.tgz -C /opt cd /opt sudo mv spark-3.3.1-bin-hadoop3 spark sudo chown -R $USER:$USER spark # 修改属主为当前用户接下来需要配置环境变量这是很多新手容易忽略的关键步骤。编辑~/.bashrc文件添加以下内容export SPARK_HOME/opt/spark export PATH$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin export PYSPARK_PYTHONpython3使配置立即生效source ~/.bashrc2.2 验证安装最简单的验证方式是运行Spark自带的示例程序。这里有个小技巧通过grep过滤输出可以快速确认结果cd $SPARK_HOME bin/run-example SparkPi 10 21 | grep Pi is roughly如果看到类似Pi is roughly 3.1418的输出说明单机版Spark已经正常工作。我建议再做个进阶测试——启动spark-shell交互环境bin/spark-shell在Scala REPL中尝试读取本地文件并统计行数val textFile sc.textFile(file://$SPARK_HOME/README.md) textFile.count()3. 集群环境搭建详解3.1 节点准备假设我们有一个master节点和两个worker节点slave01、slave02所有节点都需要完成单机版的Spark安装。这里有个效率技巧可以使用pdsh工具批量操作# 在所有节点创建安装目录 pdsh -w slave01,slave02 sudo mkdir -p /opt pdsh -w slave01,slave02 sudo chown $USER:$USER /opt # 从master节点同步安装包 pdcp -w slave01,slave02 /opt/spark /opt3.2 关键配置修改进入$SPARK_HOME/conf目录需要修改两个核心文件slaves文件指定worker节点cp slaves.template slaves vim slaves内容示例slave01 slave02spark-env.sh文件环境变量配置cp spark-env.sh.template spark-env.sh vim spark-env.sh添加以下内容根据实际情况修改IP和路径export SPARK_MASTER_HOSTmaster export SPARK_WORKER_CORES4 export SPARK_WORKER_MEMORY8g export HADOOP_CONF_DIR/etc/hadoop/conf3.3 集群启动与验证在master节点依次执行$SPARK_HOME/sbin/start-master.sh $SPARK_HOME/sbin/start-workers.sh验证集群状态的三种方法Web UI访问http://master:8080 应该能看到所有worker节点命令行$SPARK_HOME/bin/spark-shell --master spark://master:7077提交测试任务$SPARK_HOME/bin/spark-submit --master spark://master:7077 \ --class org.apache.spark.examples.SparkPi \ $SPARK_HOME/examples/jars/spark-examples_*.jar 1004. 常见问题排查指南在实际部署中我遇到过不少坑这里分享几个典型问题的解决方案4.1 Worker节点不显示可能原因及排查步骤检查网络连通性ping slave01验证SSH免密登录ssh slave01应该无需密码查看worker日志tail -n 100 $SPARK_HOME/logs/spark-hadoop-org.apache.spark.deploy.worker.Worker-*.out4.2 内存分配问题如果任务频繁失败可能是内存配置不当。建议调整spark-defaults.conf中添加spark.executor.memory 4g spark.driver.memory 2g或者在提交任务时指定spark-submit --executor-memory 4g --driver-memory 2g ...4.3 端口冲突Spark默认使用多个端口7077、8080等如果发现服务无法启动netstat -tulnp | grep 8080 # 查看端口占用解决方案可以是修改配置或终止占用进程。5. 性能优化建议经过多次实践我总结出几个提升Spark集群性能的配置技巧动态资源分配适合多租户环境spark.dynamicAllocation.enabled true spark.shuffle.service.enabled true序列化优化spark.serializer org.apache.spark.serializer.KryoSerializer数据本地性配置spark.locality.wait 3s spark.locality.wait.node 3s对于Python用户特别建议安装PyArrow提升性能pip install pyarrow export ARROW_PRE_0_15_IPC_FORMAT16. 日常维护技巧集群运行后这些命令能帮你高效管理优雅重启集群$SPARK_HOME/sbin/stop-workers.sh $SPARK_HOME/sbin/stop-master.sh # 修改配置后 $SPARK_HOME/sbin/start-master.sh $SPARK_HOME/sbin/start-workers.sh日志管理# 按日期归档日志 find $SPARK_HOME/logs -type f -mtime 7 -exec gzip {} \;资源监控# 实时查看集群负载 pdsh -w master,slave01,slave02 top -b -n 1 | head -n 5最后提醒一点Spark Web UI8080端口不仅用于监控还能查看已完成任务的详细执行计划这对性能调优非常有帮助。建议定期检查Executor的GC时间和Shuffle读写量这些指标往往能反映出潜在问题。