数据存储依赖:Hadoop 包含 HDFS(分布式文件系统)和 MapReduce(计算框架)等组件,而 Spark 本身主要是一个计算引擎,没有自带分布式文件系统。在很多场景下,Spark 会依赖 HDFS 来存储海量数据。
前提检查
确认 Spark 已正常运行(jps 能看到 Master 和 Worker 进程)
记录 Spark 占用的端口(默认:Master 7077/8080,Worker 8081)
确保服务器有足够内存(建议至少 8GB,避免两者内存竞争)
步骤 1:下载并安装 Hadoop
下载 Hadoop 3.3.6(稳定版本)
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
解压到 /opt 目录
sudo tar -zxvf hadoop-3.3.6.tar.gz -C /opt/
sudo mv /opt/hadoop-3.3.6 /opt/hadoop
设置权限(替换为你的用户名)
sudo chown -R root:root /opt/hadoop
步骤 2:配置 Hadoop 环境变量
编辑环境变量文件
vim ~/.bashrc
添加以下内容(与 Spark 环境变量区分开)
export HADOOP_HOME=/opt/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
生效配置
source ~/.bashrc
验证安装(显示版本即正常)
hadoop version
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64
export PATH=$JAVA_HOME/bin:$PATH
配置完Java后【~/.bashrc】,hadoop version才正常
步骤 3:修改 Hadoop 配置文件(核心:避免端口冲突)
需要修改 4 个关键配置文件,重点调整可能与 Spark 冲突的端口:
3.1 配置 core-site.xml
vim $HADOOP_HOME/etc/hadoop/core-site.xml 【添加内容(使用 9000 端口,与 Spark 不冲突):】
mkdir -p /opt/hadoop/tmp # 创建临时目录
chmod 755 /opt/hadoop/tmp # 赋予权限
3.2 配置 hdfs-site.xml
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml 【添加内容(单节点伪分布式配置):】
3.3 配置 mapred-site.xml
直接创建并编辑 mapred-site.xml
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml 【添加内容(指定 MapReduce 运行在 YARN 上):】
3.4 配置 yarn-site.xml
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml 【添加内容(关键:修改 YARN 端口避免与 Spark 冲突):】
步骤 4:配置 SSH 免密登录(Hadoop 启动需要)
生成 SSH 密钥(一路回车即可)
ssh-keygen -t rsa -P ""
将公钥添加到授权列表
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
测试免密登录本地(首次需输入 yes)
ssh localhost
步骤 5:初始化 HDFS 并启动 Hadoop
格式化 HDFS(仅首次执行)
hdfs namenode -format
启动 HDFS
start-dfs.sh
(可选)启动 YARN(若需使用 MapReduce 等依赖 YARN 的组件)
start-yarn.sh
步骤 6:验证 Hadoop 启动且与 Spark 无冲突
查看进程(应包含以下进程,且与 Spark 的 Master/Worker 共存)
jps
预期结果(包含但不限于):
NameNode、DataNode、ResourceManager、NodeManager、Master、Worker
访问网页控制台验证端口是否正常
HDFS 管理界面:http://localhost:9870
YARN 管理界面:http://localhost:8088
Spark Master 界面:http://localhost:8080(之前已存在)
关键冲突处理
如果出现端口冲突(启动失败或进程异常退出):
查看错误日志($HADOOP_HOME/logs/ 或 $SPARK_HOME/logs/)
找到冲突的端口,修改对应配置文件:
Spark 端口修改:$SPARK_HOME/conf/spark-env.sh 中设置 SPARK_MASTER_WEBUI_PORT 等
Hadoop 端口修改:在上述 4 个 XML 配置文件中调整对应端口参数
通过以上步骤,即可在同一台服务器上同时运行 Spark Standalone 和 Hadoop 伪分布式集群,且两者能协同工作(例如 Spark 可以读取 HDFS 上的数据)。
从日志来看,HDFS 格式化已经成功(关键日志:Storage directory /opt/hadoop/tmp/dfs/name has been successfully formatted),但启动 start-dfs.sh 时报错,原因是 Hadoop 不允许直接用 root 用户启动服务,且未配置对应的用户环境变量。
解决方法是在 Hadoop 的启动脚本配置中,添加 root 用户的环境变量声明,具体步骤如下
声明 HDFS 和 YARN 各组件的运行用户为 root
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
配置 HDFS 组件运行用户(解决 namenode/datanode 启动报错)
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
配置 YARN 组件运行用户(后续启动 YARN 时会用到,提前配置避免后续报错)
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"
重新启动HDFS服务 start-dfs.sh
jps 只看到NameNode没看到DataNode
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh 【export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64】
查看 DataNode 启动日志,定位失败原因
tail -n 100 /opt/hadoop/logs/hadoop-root-datanode-iZwz92800vffoao9eb64l1Z.log
常见原因:
端口被占用(如 9864 端口被其他进程占用)
之前格式化 HDFS 后,/opt/hadoop/tmp 目录残留旧数据导致冲突
stop-dfs.sh
rm -rf /opt/hadoop/tmp
hdfs namenode -format
start-dfs.sh
9864端口换成9865
启动历史服务器
mapred --daemon start historyserver
1. 开放 9870 端口(TCP 协议,HDFS Web 服务用 TCP)
ufw allow 9870/tcp
ufw allow 8088/tcp
2. 重启防火墙使配置生效
ufw reload
3. 验证端口是否已开放(输出 "9870/tcp ALLOW Anywhere" 即成功)
ufw status