ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spark 3.2.0 环境搭建实战:从解压到集群的避坑指南

Spark 3.2.0 环境搭建实战:从解压到集群的避坑指南 简介spark-3.2.0-bin-hadoop3.2.tgz 是 Apache Spark 3.2.0 面向 Hadoop 3.2 环境编译的官方二进制发行包适合大数据开发工程师、数据科学家及高校学生直接部署使用免去源码编译环节。解压后即可在 Hadoop 3.2 集群上运行 Spark 作业覆盖 Spark Core、Spark SQL、Spark Streaming、MLlib 与 GraphX 等核心组件可用于批处理、结构化查询、实时流计算及机器学习建模等场景。压缩包共 1476 个文件约 287.02MB以 462 个 py、238 个 jar、203 个 scala、135 个 java 文件为主分别对应 PySpark 接口、运行依赖库、Scala 与 Java 源码示例另含 txt、rst 文档及 sh、cmd 启动脚本目录结构完整清晰。目前已有 1123 人学习下载。该版本在性能优化、SQL 增强、Python API 一致性、Kubernetes 原生支持及内存管理等方面均有改进并新增时间旅行等特性便于读者快速搭建实验环境、对照源码理解内部实现并开展调优实践。1. spark-3.2.0-bin-hadoop3.2.tgz一个压缩包背后藏着多少环境坑拿到spark-3.2.0-bin-hadoop3.2.tgz这个文件的人通常正站在两个路口之一要么是第一次搭 Spark 环境被 Hadoop 和 Spark 的版本对应关系搞得头大要么是已经跑过单机模式想往伪分布式或者集群方向走结果发现光解压这个包根本跑不起来。这个 tgz 本质上是一个预编译发行包文件名里的bin-hadoop3.2说明它已经针对 Hadoop 3.2 的客户端库做过编译绑定解压后理论上可以直接提交任务到 YARN 或者连 HDFS不需要你再手动编译 Spark 源码。但“理论上”三个字就是血泪经验的起点。这个包能解决的是“Spark 运行时和 Hadoop 客户端库版本对齐”的问题解决不了的是JDK 版本选错导致UnsupportedClassVersionError、HADOOP_HOME 没配导致No FileSystem for scheme hdfs、伪分布式搭建时 core-site.xml 和 hdfs-site.xml 参数写错导致 DataNode 起不来。适合谁看适合手里已经拿到这个 tgz、准备在 Linux 虚拟机或者 Docker 里把 Spark 跑起来的数据开发、大数据方向的学生和转行从业者。下面按“解压前想清楚 → 解压后配什么 → 跑起来怎么验证 → 踩坑怎么排查”的顺序推一遍。2. 解压之前版本矩阵和 JDK 选型先定死2.1 为什么是 hadoop3.2 而不是 hadoop2.7Spark 官方发行包的文件名格式是spark-{spark版本}-bin-hadoop{hadop版本}.tgz这个后缀不是随便写的。它决定了 Spark 在运行时链接的 Hadoop 客户端 jar 包版本。如果你集群的 HDFS 和 YARN 是 Hadoop 3.2.x那用bin-hadoop3.2这个包最省事因为hadoop-client-api和hadoop-client-runtime的版本已经对齐不需要你手动替换 jar。常见做法是先确认现有 Hadoop 集群的版本再选对应的 Spark 发行包。如果 Hadoop 是 2.7.x用bin-hadoop2.7如果是 3.2.x用bin-hadoop3.2。跨大版本混用不是绝对不行但会遇到guava版本冲突、jackson版本冲突这类玄学问题排查起来非常费时间。组件推荐版本说明JDK8 或 11Spark 3.2.0 官方支持 JDK 8/11JDK 17 会报模块访问错误Hadoop3.2.x与包名后缀对齐Scala2.12Spark 3.2.0 默认编译版本Python3.7如果用 PySpark2.2 JDK 版本选错后面全白搭Spark 3.2.0 对 JDK 的支持边界很明确JDK 8 最稳JDK 11 可用但需要额外加--add-opens参数JDK 17 直接翻车。我一般会在解压前先跑一遍java -version确认是 1.8 或者 11。# 确认 JDK 版本必须是 1.8 或 11 java -version # 如果输出是 17 或更高先切换 JDK export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH逻辑说明JAVA_HOME必须指向 JDK 根目录不是bin目录。参数说明如果系统里有多个 JDK用update-alternatives --config java切换默认版本或者直接在spark-env.sh里写死JAVA_HOME。提示JDK 11 下跑 Spark 3.2.0 需要在spark-defaults.conf里加spark.driver.extraJavaOptions-Dio.netty.tryReflectionSetAccessibletrue否则会报java.lang.NoSuchMethodError。2.3 解压路径和权限别放在 /tmp 下面# 创建统一安装目录 sudo mkdir -p /opt/bigdata sudo chown -R $(whoami):$(whoami) /opt/bigdata # 解压 spark 发行包 tar -zxvf spark-3.2.0-bin-hadoop3.2.tgz -C /opt/bigdata/ # 重命名方便后续配环境变量 mv /opt/bigdata/spark-3.2.0-bin-hadoop3.2 /opt/bigdata/spark逻辑说明-C指定解压目标目录-z表示 gzip 解压-x解压-v显示过程-f指定文件名。参数说明解压后目录名很长重命名为spark是为了后面写SPARK_HOME时少打几个字也避免脚本里路径写错。3. 环境变量与配置文件让 Spark 找到 Hadoop3.1 spark-env.sh 里必须写死的三个变量进入$SPARK_HOME/conf目录复制模板文件cd /opt/bigdata/spark/conf cp spark-env.sh.template spark-env.sh cp slaves.template slaves然后编辑spark-env.sh写入以下内容# JDK 路径 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 # Hadoop 配置文件目录让 Spark 能读到 core-site.xml 和 hdfs-site.xml export HADOOP_CONF_DIR/opt/bigdata/hadoop/etc/hadoop # Spark Master 地址和端口 export SPARK_MASTER_HOST192.168.1.100 export SPARK_MASTER_PORT7077 # Worker 资源限制 export SPARK_WORKER_CORES2 export SPARK_WORKER_MEMORY2g逻辑说明HADOOP_CONF_DIR是关键Spark 靠它找到 HDFS 的fs.defaultFS配置。如果不设这个变量提交任务时会报No FileSystem for scheme hdfs。参数说明SPARK_WORKER_CORES和SPARK_WORKER_MEMORY根据虚拟机实际资源调整伪分布式一般给 2 核 2G 就够。3.2 伪分布式场景下 Hadoop 侧的最小配置如果 Hadoop 还没配好先确认core-site.xml和hdfs-site.xml这两个文件。伪分布式搭建时最常见的错误是fs.defaultFS写成了file:///而不是hdfs://。!-- core-site.xml -- configuration property namefs.defaultFS/name valuehdfs://192.168.1.100:9000/value /property property namehadoop.tmp.dir/name value/opt/bigdata/hadoop/data/tmp/value /property /configuration!-- hdfs-site.xml -- configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/opt/bigdata/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name value/opt/bigdata/hadoop/data/datanode/value /property /configuration逻辑说明dfs.replication设为 1 是因为伪分布式只有一个 DataNode设成 3 会导致块副本永远达不到要求HDFS 一直处于安全模式。参数说明hadoop.tmp.dir是 Hadoop 的临时目录必须提前创建并保证有写权限否则 NameNode 格式化会失败。3.3 把 Spark 的 bin 目录加进 PATH# 编辑 ~/.bashrc echo export SPARK_HOME/opt/bigdata/spark ~/.bashrc echo export PATH$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH ~/.bashrc echo export HADOOP_HOME/opt/bigdata/hadoop ~/.bashrc echo export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH ~/.bashrc source ~/.bashrc逻辑说明SPARK_HOME/bin里有spark-submit、spark-shell、pyspark这些命令sbin里有start-master.sh、start-workers.sh。参数说明HADOOP_HOME不是 Spark 必须的但很多脚本会依赖它建议一起配上。4. 启动与验证从 spark-shell 到提交第一个任务4.1 先跑 local 模式确认 Spark 本身没问题在配集群之前先用 local 模式验证 Spark 解压包是完整的# local 模式启动 spark-shell不依赖 Hadoop spark-shell --master local[2]进入 Scala 交互界面后执行// 创建一个简单 RDD 并统计 val data sc.parallelize(1 to 100) val sum data.reduce(_ _) println(sSum is: $sum)逻辑说明local[2]表示用两个线程模拟集群不连 YARN 也不连 HDFS。参数说明如果这一步就报错说明 JDK 版本或者解压包有问题先别急着配集群。4.2 启动 Standalone 集群# 启动 Master $SPARK_HOME/sbin/start-master.sh # 启动 Worker需要先配好 slaves 文件 $SPARK_HOME/sbin/start-workers.sh # 查看进程 jps逻辑说明start-master.sh会在后台启动org.apache.spark.deploy.master.Master进程start-workers.sh会读取conf/slaves文件里的主机名启动 Worker。参数说明jps应该能看到Master和Worker两个进程如果 Worker 没起来检查slaves文件里写的是主机名还是 IP以及 SSH 免密是否配好。4.3 提交一个读取 HDFS 文件的 Spark 任务# 先在 HDFS 上创建测试目录并上传文件 hdfs dfs -mkdir -p /user/test/input echo hello spark hello hadoop /tmp/test.txt hdfs dfs -put /tmp/test.txt /user/test/input/ # 用 spark-submit 提交 WordCount spark-submit \ --master spark://192.168.1.100:7077 \ --class org.apache.spark.examples.SparkPi \ $SPARK_HOME/examples/jars/spark-examples_2.12-3.2.0.jar \ 10逻辑说明--master指定 Standalone 集群的 Master 地址--class指定主类最后面的10是传给SparkPi的参数表示分割份数。参数说明spark-examples_2.12-3.2.0.jar是发行包里自带的示例 jar路径在$SPARK_HOME/examples/jars/下面。注意如果提交任务时报Exception in thread main java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream说明HADOOP_CONF_DIR没配或者 Hadoop 客户端 jar 没被加载。5. 避坑与排查那些让集群起不来的细节5.1 现象Worker 进程启动后立刻消失原因spark-env.sh里SPARK_MASTER_HOST写成了localhost或者127.0.0.1Worker 尝试注册到 Master 时解析不到地址。解决改成实际 IP并且确保/etc/hosts里主机名和 IP 的映射正确。5.2 现象spark-submit 报No FileSystem for scheme hdfs原因Spark 的 classpath 里没有 Hadoop 的配置文件或者HADOOP_CONF_DIR指向的目录里没有core-site.xml。解决确认spark-env.sh里HADOOP_CONF_DIR路径正确并且该目录下确实有core-site.xml和hdfs-site.xml。5.3 现象HDFS 一直处于安全模式无法写入原因dfs.replication设成了 3但伪分布式只有一个 DataNode副本数永远达不到。解决把dfs.replication改成 1然后重启 HDFS执行hdfs dfsadmin -safemode leave手动退出安全模式。5.4 现象JDK 11 下报InaccessibleObjectException原因JDK 11 的模块系统限制了反射访问Spark 3.2.0 部分代码还没适配。解决在spark-defaults.conf里加spark.driver.extraJavaOptions--add-opensjava.base/java.langALL-UNNAMED或者直接换回 JDK 8。5.5 现象PySpark 启动报Python worker failed to connect back原因Python 版本不兼容或者PYSPARK_PYTHON环境变量没设。解决在spark-env.sh里加export PYSPARK_PYTHON/usr/bin/python3确保 Python 版本在 3.7 以上。6. 进阶技巧用 Docker 快速复现一套 Spark 环境如果你不想在虚拟机上折腾 JDK、Hadoop、Spark 的版本对齐Docker 是最省事的后悔药。常见做法是拉一个带 Hadoop 和 Spark 的镜像把spark-3.2.0-bin-hadoop3.2.tgz挂载进去。# 拉取一个基础镜像 docker pull ubuntu:20.04 # 启动容器并挂载 Spark 包 docker run -it --name spark-test \ -v /path/to/spark-3.2.0-bin-hadoop3.2.tgz:/tmp/spark.tgz \ -p 8080:8080 -p 7077:7077 \ ubuntu:20.04 /bin/bash进入容器后安装 JDK 并解压apt-get update apt-get install -y openjdk-8-jdk tar -zxvf /tmp/spark.tgz -C /opt/ export SPARK_HOME/opt/spark-3.2.0-bin-hadoop3.2 export PATH$SPARK_HOME/bin:$PATH逻辑说明-v把宿主机上的 tgz 挂载到容器内避免重复下载。-p暴露 Spark Master 的 Web UI 端口 8080 和通信端口 7077。参数说明如果只是本地测试可以只跑spark-shell --master local[*]不需要启动集群。验证方法在容器内跑spark-submit --master local[2] --class org.apache.spark.examples.SparkPi $SPARK_HOME/examples/jars/spark-examples_2.12-3.2.0.jar 10如果输出Pi is roughly 3.14说明环境没问题。我自己的习惯是每次拿到一个新的 Spark 发行包先解压跑 local 模式确认 JDK 和 Scala 版本没问题再去配 Hadoop 和集群。这样出问题时排查范围小不会一上来就面对一堆报错不知道从哪下手。希望帮到你。本文还有配套的精品资源点击获取
返回列表