从单机到伪分布式Spark 2.4.8快速搭建与WordCount实战指南对于刚接触大数据处理的开发者来说搭建一个完整的Spark集群往往令人望而生畏。但好消息是我们完全可以在单台Linux机器上模拟出集群环境这就是所谓的伪分布式模式。本文将手把手带你完成Spark 2.4.8的安装配置并通过经典的WordCount示例验证环境。1. 环境准备与基础安装在开始之前确保你的Linux系统已安装Java 8Spark 2.4.8对Java 11支持有限。可以通过以下命令检查Java版本java -version如果未安装可以使用apt或yum快速安装# Ubuntu/Debian sudo apt update sudo apt install openjdk-8-jdk # CentOS/RHEL sudo yum install java-1.8.0-openjdk-devel接下来下载Spark 2.4.8预编译包。这个版本集成了Hadoop 2.7适合大多数学习场景wget https://archive.apache.org/dist/spark/spark-2.4.8/spark-2.4.8-bin-hadoop2.7.tgz解压并移动到合适位置是标准做法tar -zxvf spark-2.4.8-bin-hadoop2.7.tgz -C /opt/ mv /opt/spark-2.4.8-bin-hadoop2.7 /opt/spark配置环境变量让Spark命令随处可用。编辑/etc/profile文件添加export SPARK_HOME/opt/spark export PATH$PATH:$SPARK_HOME/bin使配置立即生效source /etc/profile2. 单机模式验证安装完成后最简单的验证方式是启动Spark shellspark-shell看到Scala提示符(scala)表示单机模式运行正常。此时可以尝试一个简单的RDD操作val data Array(1, 2, 3, 4, 5) val rdd sc.parallelize(data) rdd.collect().foreach(println)退出shell使用:q命令。虽然单机模式简单但它无法展示Spark的分布式特性。接下来我们将把它升级为伪分布式模式。3. 配置伪分布式环境伪分布式的核心思想是让单台机器同时扮演Master和Worker角色。这需要修改两个关键配置文件首先准备workers文件cd /opt/spark/conf cp workers.template workers echo localhost workers然后是spark-env.sh这里需要设置一些重要参数cp spark-env.sh.template spark-env.sh编辑spark-env.sh添加以下内容export JAVA_HOME$(readlink -f /usr/bin/java | sed s:bin/java::) export SPARK_MASTER_HOSTlocalhost export SPARK_MASTER_WEBUI_PORT8080 export SPARK_WORKER_CORES2 export SPARK_WORKER_MEMORY2g注意SPARK_WORKER_MEMORY不应超过机器可用内存的70%。如果内存不足可以适当调小这个值。伪分布式与真实集群的主要区别在于特性伪分布式真实集群节点数量1台多台网络通信本地回环真实网络资源隔离无有适用场景开发测试生产环境4. 启动服务与验证启动伪分布式集群非常简单/opt/spark/sbin/start-all.sh检查服务是否正常运行jps应该能看到以下关键进程MasterWorker访问Web UI确认状态http://你的服务器IP:8080。正常情况应该看到一个Worker节点核心数和内存与你配置的一致。5. WordCount实战测试经典的WordCount是验证Spark环境的绝佳示例。我们准备两种实现方式Python版本(PySpark)创建wordcount.py文件from pyspark import SparkContext sc SparkContext(local[*], WordCount) text_file sc.textFile(README.md) # 使用Spark自带的示例文件 counts text_file.flatMap(lambda line: line.split( )) \ .map(lambda word: (word, 1)) \ .reduceByKey(lambda a, b: a b) counts.saveAsTextFile(wordcount_output)运行脚本spark-submit wordcount.pyScala版本(Spark Shell)直接在spark-shell中执行val textFile sc.textFile(README.md) val counts textFile.flatMap(line line.split( )) .map(word (word, 1)) .reduceByKey(_ _) counts.saveAsTextFile(wordcount_output_scala)查看结果cat wordcount_output/part-*6. 常见问题排查遇到问题时可以按以下步骤排查无法启动服务检查/opt/spark/logs下的日志文件确认端口8080未被占用netstat -tulnp | grep 8080Web UI无法访问检查防火墙设置sudo ufw status临时关闭防火墙测试sudo ufw disable内存不足错误# 降低Executor内存 spark-shell --executor-memory 512m作业卡住检查Worker是否注册到Master查看资源使用情况top或htop7. 进阶配置建议当基础环境运行稳定后可以考虑以下优化配置项调优参数推荐值说明spark.driver.memory1g驱动进程内存spark.executor.memory1g执行器内存spark.default.parallelismCPU核心数×2默认并行度spark.sql.shuffle.partitions200SQL操作的分区数启用历史服务器cp spark-defaults.conf.template spark-defaults.conf添加以下内容spark.eventLog.enabled true spark.eventLog.dir file:///tmp/spark-events spark.history.fs.logDirectory file:///tmp/spark-events创建日志目录并启动历史服务器mkdir -p /tmp/spark-events /opt/spark/sbin/start-history-server.sh现在可以通过http://localhost:18080查看历史作业信息。8. 环境清理与日常管理完成实验后可以按以下步骤停止服务/opt/spark/sbin/stop-all.sh /opt/spark/sbin/stop-history-server.sh日常使用中建议将Spark命令加入系统服务# 创建systemd服务文件 sudo tee /etc/systemd/system/spark-master.service EOF [Unit] DescriptionSpark Master [Service] Typeforking ExecStart/opt/spark/sbin/start-master.sh ExecStop/opt/spark/sbin/stop-master.sh Restartalways [Install] WantedBymulti-user.target EOF # 启用并启动服务 sudo systemctl daemon-reload sudo systemctl enable spark-master sudo systemctl start spark-master