在CentOS 8上从零搭建Spark伪分布式环境的完整指南
作为一个长期在单机环境下折腾大数据技术栈的开发者,我深知在有限资源下搭建Spark环境的痛点。本文将分享我在CentOS 8系统上配置Spark伪分布式环境的完整过程,包括那些官方文档没提到的细节问题和实用技巧。
1. 环境准备与基础配置
在开始之前,我们需要确保系统环境干净且一致。我使用的是CentOS 8.5 minimal安装版本,这个版本去除了许多不必要的组件,特别适合作为开发环境的基础。
1.1 系统基础设置
首先更新系统并安装基础工具:
sudo dnf update -y sudo dnf install -y wget curl tar vim net-tools然后设置主机名(这里以spark-master为例):
sudo hostnamectl set-hostname spark-master echo "127.0.0.1 spark-master" | sudo tee -a /etc/hosts1.2 创建专用用户
为了避免权限问题,我建议创建一个专门用于运行Spark的用户:
sudo useradd -m sparkuser sudo passwd sparkuser将用户添加到sudoers列表(仅限测试环境):
echo "sparkuser ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers2. Java环境配置
Spark运行依赖Java环境,以下是详细的JDK安装步骤:
2.1 安装OpenJDK 8
虽然Oracle JDK也可以使用,但我更推荐OpenJDK:
sudo dnf install -y java-1.8.0-openjdk-devel验证安装:
java -version javac -version2.2 环境变量配置
编辑~/.bashrc文件,添加以下内容:
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))) export PATH=$PATH:$JAVA_HOME/bin然后使配置生效:
source ~/.bashrc提示:使用
readlink -f可以自动定位Java安装路径,避免手动指定可能出现的路径错误
3. Hadoop伪分布式环境
虽然Spark可以独立运行,但配置Hadoop环境可以获得完整的HDFS支持。
3.1 下载与安装
下载Hadoop 3.3.6并解压:
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz sudo tar -xzf hadoop-3.3.6.tar.gz -C /opt/ sudo ln -s /opt/hadoop-3.3.6 /opt/hadoop sudo chown -R sparkuser:sparkuser /opt/hadoop*3.2 核心配置
编辑/opt/hadoop/etc/hadoop/core-site.xml:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://spark-master:9000</value> </property> </configuration>编辑/opt/hadoop/etc/hadoop/hdfs-site.xml:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>3.3 初始化与启动
格式化HDFS:
hdfs namenode -format启动HDFS服务:
start-dfs.sh验证HDFS状态:
hdfs dfsadmin -report4. Spark伪分布式安装
4.1 下载与解压
选择与Hadoop版本兼容的Spark版本:
wget https://archive.apache.org/dist/spark/spark-3.4.1/spark-3.4.1-bin-hadoop3.tgz sudo tar -xzf spark-3.4.1-bin-hadoop3.tgz -C /opt/ sudo ln -s /opt/spark-3.4.1-bin-hadoop3 /opt/spark sudo chown -R sparkuser:sparkuser /opt/spark*4.2 关键配置
编辑/opt/spark/conf/spark-env.sh:
cp /opt/spark/conf/spark-env.sh.template /opt/spark/conf/spark-env.sh echo "export SPARK_MASTER_HOST=spark-master" >> /opt/spark/conf/spark-env.sh echo "export SPARK_MASTER_PORT=7077" >> /opt/spark/conf/spark-env.sh echo "export SPARK_WORKER_CORES=2" >> /opt/spark/conf/spark-env.sh echo "export SPARK_WORKER_MEMORY=2g" >> /opt/spark/conf/spark-env.sh配置workers文件:
echo "spark-master" > /opt/spark/conf/workers4.3 环境变量设置
在~/.bashrc中添加:
export SPARK_HOME=/opt/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin5. 防火墙与端口配置
CentOS 8使用firewalld作为防火墙管理工具,需要开放以下关键端口:
| 端口号 | 用途 | 协议 |
|---|---|---|
| 7077 | Spark Master通信 | TCP |
| 8080 | Spark Web UI | TCP |
| 8081 | Worker Web UI | TCP |
| 9000 | HDFS NameNode | TCP |
| 9864 | HDFS DataNode | TCP |
执行以下命令开放端口:
sudo firewall-cmd --permanent --add-port=7077/tcp sudo firewall-cmd --permanent --add-port=8080-8081/tcp sudo firewall-cmd --permanent --add-port=9000/tcp sudo firewall-cmd --permanent --add-port=9864/tcp sudo firewall-cmd --reload验证端口开放状态:
sudo firewall-cmd --list-ports6. 启动与验证
6.1 启动Spark集群
start-master.sh start-workers.sh检查进程是否正常运行:
jps应该能看到以下进程:
- Master
- Worker
- NameNode
- DataNode
6.2 Web UI访问
Spark Master Web UI默认在8080端口:
http://<your-server-ip>:8080Spark Worker Web UI默认在8081端口:
http://<your-server-ip>:80816.3 运行测试任务
提交一个简单的Pi计算任务:
spark-submit --class org.apache.spark.examples.SparkPi \ --master spark://spark-master:7077 \ /opt/spark/examples/jars/spark-examples_2.12-3.4.1.jar 1007. 常见问题解决
在实际搭建过程中,我遇到了几个典型问题:
端口冲突问题:
- 如果8080端口被占用,可以在spark-env.sh中设置:
export SPARK_MASTER_WEBUI_PORT=8088
- 如果8080端口被占用,可以在spark-env.sh中设置:
内存不足问题:
- 调整worker内存设置:
export SPARK_WORKER_MEMORY=1g
- 调整worker内存设置:
SSH免密登录问题:
- 虽然是单节点,但Spark仍然需要SSH本地登录:
ssh-keygen -t rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
- 虽然是单节点,但Spark仍然需要SSH本地登录:
HDFS权限问题:
- 在core-site.xml中添加:
<property> <name>hadoop.http.staticuser.user</name> <value>sparkuser</value> </property>
- 在core-site.xml中添加:
8. 性能优化建议
即使是伪分布式环境,适当的优化也能提升开发体验:
资源配置调整:
- 根据机器配置调整executor内存和核心数
- 在spark-defaults.conf中设置:
spark.executor.memory 2g spark.executor.cores 2
日志级别调整:
- 编辑log4j.properties:
log4j.rootCategory=WARN, console
- 编辑log4j.properties:
本地磁盘缓存:
- 启用Spark的本地磁盘缓存:
export SPARK_LOCAL_DIRS=/tmp/spark
- 启用Spark的本地磁盘缓存:
JVM调优:
- 在spark-env.sh中添加:
export SPARK_DAEMON_JAVA_OPTS="-XX:+UseG1GC"
- 在spark-env.sh中添加:
在实际项目中,我发现伪分布式环境足够应对大多数开发测试场景。通过Web UI监控任务执行情况,配合适当的日志级别设置,可以快速定位问题。