在 CentOS 上集成 HDFS 与 Spark 的完整步骤
一 环境准备与版本兼容
- 操作系统与基础组件
- 建议使用 CentOS 7/8,安装 JDK 8(Spark 3.x 普遍依赖 JDK 8)。
- 配置主机名解析(/etc/hosts)、SSH 免密登录、关闭防火墙或放行端口(如 HDFS 9000/50070、YARN 8088、Spark 7077/8080)。
- 集群时间同步(如 NTP),避免分布式组件通信异常。
- Hadoop 与 Spark 版本匹配
- Spark 发行包通常带有 Hadoop 版本标签(如:spark-3.1.1-bin-hadoop3.2.tgz),选择与现有 Hadoop 版本一致的包可减少兼容性问题。
- 若使用“without-hadoop”包,需自行提供 Hadoop 依赖与配置。
- 参考实践要点
- 多节点集群需统一 JAVA_HOME、配置 slaves/workers、SSH 互信与 NTP 时间同步。
二 安装与配置 HDFS
- 安装 Hadoop
- 下载并解压 Hadoop 至如 /opt/hadoop-3.3.x,设置环境变量:
- export HADOOP_HOME=/opt/hadoop-3.3.x
- export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- 关键配置($HADOOP_HOME/etc/hadoop)
- core-site.xml
- 指定默认文件系统与 NameNode 地址:
- fs.defaultFShdfs://namenode:9000
- hdfs-site.xml
- 副本数与数据/名称目录(示例为单节点伪分布式):
- dfs.replication1
- dfs.namenode.name.dirfile:///opt/hadoop-3.3.x/dfs/name
- dfs.datanode.data.dirfile:///opt/hadoop-3.3.x/dfs/data
- 格式化与启动
- 首次启动前执行:hdfs namenode -format
- 启动 HDFS:start-dfs.sh
- 验证:jps 应看到 NameNode/DataNode/SecondaryNameNode 进程;访问 http://namenode:9870 查看 HDFS Web UI。
三 安装与配置 Spark 连接 HDFS
- 安装 Spark
- 选择与 Hadoop 匹配的发行包(如 spark-3.1.1-bin-hadoop3.2.tgz),解压至 /opt/spark-3.1.1,设置环境变量:
- export SPARK_HOME=/opt/spark-3.1.1
- export PATH=$PATH:$SPARK_HOME/bin
- 让 Spark 找到 Hadoop 配置
- 方式一(推荐):在 $SPARK_HOME/conf/spark-env.sh 中添加
- export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
- 方式二:使用 “without-hadoop” 包时,在 spark-env.sh 中设置
- export SPARK_DIST_CLASSPATH=$(/opt/hadoop-3.3.x/bin/hadoop classpath)
- 集群与运行模式
- Spark Standalone:在 $SPARK_HOME/conf/workers 配置 Worker 节点,启动:start-all.sh
- 访问 http://spark-master:8080 查看 Spark Web UI。
四 快速验证与常见操作
- 验证 HDFS 读写(spark-shell)
- 读取 HDFS 文件:
- spark-shell --master local[*]
- scala> val df = spark.read.text(“hdfs://namenode:9000/input/test.txt”); df.show()
- 写入 HDFS 目录:
- scala> df.write.mode(“overwrite”).text(“hdfs://namenode:9000/output/”)
- 运行示例作业(WordCount)
- spark-shell --master local[*] --class org.apache.spark.examples.WordCount
/opt/spark-3.1.1/examples/jars/spark-examples_2.12-3.1.1.jar
hdfs://namenode:9000/input/test.txt hdfs://namenode:9000/output/wc
- PySpark 读写 HDFS
- pyspark
-
from pyspark.sql import SparkSession
-
spark = SparkSession.builder.appName(“HDFS-PySpark”).getOrCreate()
-
df = spark.read.text(“hdfs://namenode:9000/input/test.txt”)
-
df.show(); df.count()
- 常见问题排查
- 无法解析 HDFS 地址:检查 core-site.xml 的 fs.defaultFS 与 /etc/hosts 主机名映射。
- ClassNotFound/Hadoop 依赖缺失:确认 HADOOP_CONF_DIR 或 SPARK_DIST_CLASSPATH 配置正确。
- 权限问题:HDFS 目录权限与 hadoop.proxyuser 相关配置(如 spark 用户代理)需允许提交作业。
- 端口不通:确认 firewalld/安全组 已放行 9000/9870/8088/7077/8080 等端口。
五 在 YARN 上运行 Spark 作业(可选)
- 配置与启动 YARN
- 在 yarn-site.xml 启用 Shuffle 服务:
- yarn.nodemanager.aux-servicesmapreduce_shuffle
- 启动 YARN:start-yarn.sh,访问 http://resourcemanager:8088。
- 提交 Spark 到 YARN
- 客户端模式:
- spark-submit --master yarn --deploy-mode client
–class org.apache.spark.examples.SparkPi
/opt/spark-3.1.1/examples/jars/spark-examples_2.12-3.1.1.jar 10
- 集群模式:
- spark-submit --master yarn --deploy-mode cluster
–class org.apache.spark.examples.SparkPi
/opt/spark-3.1.1/examples/jars/spark-examples_2.12-3.1.1.jar 10
- 说明
- 使用 YARN 时,Spark 通过 HADOOP_CONF_DIR 自动读取 YARN 与 HDFS 配置,无需额外改动 Spark 端。