Spark 3.5.0 伪分布式 Standalone 集群搭建:单机 2 Worker 节点配置与性能实测

Spark 3.5.0 伪分布式 Standalone 集群搭建:单机 2 Worker 节点配置与性能实测
Spark 3.5.0 伪分布式集群实战单机多Worker配置与性能调优指南伪分布式模式的价值与应用场景对于刚接触Spark的开发者来说在资源有限的情况下搭建完整分布式集群往往存在硬件门槛。伪分布式模式Pseudo-Distributed Mode通过在单台机器上模拟多节点工作方式既保留了分布式系统的核心特性又大幅降低了学习成本。这种模式特别适合以下场景开发测试环境在本地验证Spark应用逻辑时可以提前发现分布式环境下可能出现的序列化、网络通信等问题教学演示学生可以在个人笔记本上理解Spark的Master-Worker架构原理原型验证快速验证计算任务在不同节点配置下的表现差异与真正的分布式集群相比伪分布式模式省去了跨节点部署和网络配置的复杂度但保留了以下关键特性独立的Master和Worker进程基于RPC的进程间通信分布式任务调度机制Web UI监控界面环境准备与基础配置系统要求与软件版本在开始配置前请确保您的系统满足以下要求组件推荐版本备注操作系统Linux/macOSWindows需使用WSL2JavaJDK 8/11必须配置JAVA_HOMESpark3.5.0本文示例版本Python3.8如需PySpark支持初始安装步骤从Apache官网下载Spark预编译包wget https://archive.apache.org/dist/spark/spark-3.5.0/spark-3.5.0-bin-hadoop3.tgz解压并设置软链接tar -xzf spark-3.5.0-bin-hadoop3.tgz -C /opt ln -s /opt/spark-3.5.0-bin-hadoop3 /opt/spark配置环境变量添加到~/.bashrc或~/.zshrcexport SPARK_HOME/opt/spark export PATH$PATH:$SPARK_HOME/bin export PYSPARK_PYTHONpython3关键配置文件说明进入Spark配置目录$SPARK_HOME/conf需要修改两个核心文件spark-env.sh从模板创建cp spark-env.sh.template spark-env.sh添加以下配置# 设置Master主机地址 export SPARK_MASTER_HOSTlocalhost # 设置每个Worker的内存和CPU核数 export SPARK_WORKER_MEMORY2g export SPARK_WORKER_CORES2 # 设置每个Worker实例数关键配置 export SPARK_WORKER_INSTANCES2workers从模板创建cp workers.template workers修改内容为添加两行localhostlocalhost localhost注意伪分布式模式下所有Worker都运行在同一台机器因此需要特别注意内存分配避免OOM。建议Worker总内存不超过物理内存的70%。集群启动与管理进程启动与监控使用Spark自带的脚本启动集群# 启动Master和所有Worker $SPARK_HOME/sbin/start-all.sh # 单独控制命令 $SPARK_HOME/sbin/start-master.sh $SPARK_HOME/sbin/start-worker.sh spark://localhost:7077验证进程是否正常启动jps应看到类似以下输出1234 Master 1356 Worker 1357 WorkerWeb UI访问Spark提供了丰富的Web监控界面服务端口功能Master8080集群资源总览Worker8081单个Worker详情应用4040运行中应用详情访问http://localhost:8080应看到两个Worker已注册性能调优实战资源配置策略在伪分布式环境下合理的资源分配尤为重要。以下是典型配置示例# 在spark-env.sh中调整 export SPARK_WORKER_MEMORY4g export SPARK_WORKER_CORES2 export SPARK_WORKER_INSTANCES2 # 在spark-submit时指定 spark-submit --master spark://localhost:7077 \ --executor-memory 1g \ --total-executor-cores 4 \ your_application.py伪分布式与本地模式性能对比我们使用经典的WordCount示例进行测试测试数据集100MB文本文件测试代码from pyspark.sql import SparkSession spark SparkSession.builder.appName(WordCount).getOrCreate() text spark.read.text(sample.txt).rdd counts text.flatMap(lambda line: line[0].split( )) \ .map(lambda word: (word, 1)) \ .reduceByKey(lambda a, b: a b) print(counts.collect())性能对比结果运行模式执行时间备注local[2]42s单进程多线程pseudo-distributed38s多进程协作local[4]36s完全利用CPU实际测试发现对于计算密集型任务伪分布式模式相比local模式有约10%的性能提升主要得益于避免了Python GIL限制常见问题排查端口冲突错误现象Web UI无法访问或Worker注册失败解决方案检查$SPARK_HOME/conf/spark-env.sh中的端口设置内存不足错误现象Executor频繁崩溃或任务失败解决方案调整spark.executor.memory和spark.memory.fractionPython版本冲突错误现象PySpark任务无法启动解决方案确保所有Worker节点的PYSPARK_PYTHON指向相同版本进阶配置技巧动态资源分配在spark-defaults.conf中添加spark.dynamicAllocation.enabledtrue spark.shuffle.service.enabledtrue spark.dynamicAllocation.minExecutors1 spark.dynamicAllocation.maxExecutors4历史服务配置创建日志目录mkdir -p /tmp/spark-events修改spark-defaults.confspark.eventLog.enabledtrue spark.eventLog.dirfile:///tmp/spark-events spark.history.fs.logDirectoryfile:///tmp/spark-events启动历史服务$SPARK_HOME/sbin/start-history-server.sh应用提交与管理不同提交方式示例Python应用提交spark-submit --master spark://localhost:7077 \ --name PySparkApp \ --py-files dependencies.zip \ main.pyScala应用提交spark-submit --master spark://localhost:7077 \ --class com.example.Main \ --jars lib1.jar,lib2.jar \ app.jar任务监控技巧通过Spark UI可以获取以下关键指标Stage执行时间识别性能瓶颈Shuffle数据量优化数据倾斜问题Executor利用率调整资源分配对于长时间运行的任务建议添加监控# 在应用代码中添加进度汇报 def report_progress(): while True: time.sleep(60) print(fProgress: {sc.statusTracker().getJobIdsForGroup()}) import threading thread threading.Thread(targetreport_progress) thread.daemon True thread.start()伪分布式环境下的特殊考量磁盘IO优化由于所有Worker共享同一块磁盘建议为每个Worker配置独立的临时目录export SPARK_LOCAL_DIRS/tmp/spark-worker1,/tmp/spark-worker2使用内存文件系统加速shufflemount -t tmpfs -o size2g tmpfs /mnt/spark-tmp网络配置优化虽然Worker间通信通过loopback接口但仍可优化# 增加TCP缓冲区大小 sysctl -w net.core.rmem_max2097152 sysctl -w net.core.wmem_max2097152实战经验分享在实际使用伪分布式环境时有几个容易忽视但非常重要的细节日志分离默认情况下所有Worker日志会混在一起建议为每个Worker单独配置$SPARK_HOME/sbin/start-worker.sh \ --webui-port 8082 \ --properties-file worker1.properties \ spark://localhost:7077资源隔离使用cgroups限制每个Worker的资源使用cgcreate -g memory:spark-worker1 echo 2G /sys/fs/cgroup/memory/spark-worker1/memory.limit_in_bytes开发工作流建议的日常开发调试流程graph TD A[本地IDE开发] -- B[单机Local模式测试] B -- C[伪分布式模式验证] C -- D[完整集群部署]