JDK 17 + Hadoop 3.3.5 + Spark 3.3.2 集群搭建避坑全记录:从虚拟机互信到圆周率测试

📅 2026/7/10 8:49:53 👁️ 阅读次数 📝 编程学习
JDK 17 + Hadoop 3.3.5 + Spark 3.3.2 集群搭建避坑全记录:从虚拟机互信到圆周率测试

JDK 17 + Hadoop 3.3.5 + Spark 3.3.2 集群搭建避坑全记录:从虚拟机互信到圆周率测试

搭建大数据集群环境是每个数据工程师的必修课,但过程中总会遇到各种"坑"。本文将详细记录基于JDK 17、Hadoop 3.3.5和Spark 3.3.2的集群搭建全过程,重点分享那些容易踩坑的环节和解决方案。不同于普通的安装教程,这里会还原真实操作中遇到的报错场景,提供经过验证的解决方法。

1. 环境准备与基础配置

1.1 虚拟机环境搭建

选择CentOS 8.5作为基础系统,建议分配至少4GB内存和20GB存储空间。以下是关键配置步骤:

  • 网络配置:确保所有虚拟机使用桥接模式,获取同一网段的IP地址
  • 软件源设置:使用阿里云镜像加速软件安装
    sed -i 's|mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-* sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-*

1.2 JDK 17安装与配置

Hadoop 3.3.x开始支持JDK 17,但需要注意以下要点:

  1. 下载JDK 17 RPM包并安装:

    rpm -ivh jdk-17_linux-x64_bin.rpm
  2. 环境变量配置(/etc/profile)需特别添加JVM参数:

    export JAVA_HOME=/usr/lib/jvm/jdk-17 export PATH=$PATH:$JAVA_HOME/bin export HADOOP_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED"

注意:如果不添加--add-opens参数,后续Hadoop启动时会报java.lang.reflect.InaccessibleObjectException错误

2. 集群SSH互信配置

2.1 主机克隆与基础设置

采用"一主三从"架构,先配置好master节点后克隆出vice1-3节点。克隆后需要:

  1. 修改每台主机的hostname:

    hostnamectl set-hostname master # 分别修改为vice1-3
  2. 更新/etc/hosts文件,确保包含所有节点IP映射:

    192.168.1.101 master 192.168.1.102 vice1 192.168.1.103 vice2 192.168.1.104 vice3

2.2 SSH免密登录配置

执行以下步骤建立互信关系:

  1. 各节点生成密钥对:

    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
  2. 合并所有公钥到authorized_keys:

    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 将其他节点的公钥内容追加到该文件
  3. 设置权限(关键步骤,权限不对会导致免密失败):

    chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

常见问题排查:

  • 如果仍需输入密码,检查/var/log/secure日志
  • 确保SELinux已禁用:setenforce 0

3. Hadoop集群部署

3.1 关键配置文件调整

Hadoop 3.3.5的配置与之前版本有显著差异,以下是核心配置项:

core-site.xml

<property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property>

hdfs-site.xml

<property> <name>dfs.namenode.http-address</name> <value>master:9870</value> <!-- 注意端口变化 --> </property> <property> <name>dfs.replication</name> <value>3</value> </property>

yarn-site.xml

<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property>

3.2 启动问题排查

首次启动Hadoop时常见错误及解决方案:

  1. NameNode未格式化

    hdfs namenode -format
  2. 权限问题导致进程启动失败: 在/etc/profile中添加:

    export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
  3. Web UI无法访问

    • 检查防火墙状态:systemctl stop firewalld
    • 确认端口是否正确(Hadoop 3.x使用9870替代了50070)

4. Spark on YARN集成

4.1 Spark配置要点

使用Spark 3.3.2的without-hadoop版本,需特别注意:

  1. spark-defaults.conf关键配置:

    spark.master yarn spark.eventLog.enabled true spark.eventLog.dir hdfs://master:9000/spark-eventlog spark.serializer org.apache.spark.serializer.KryoSerializer
  2. spark-env.sh必须包含:

    export SPARK_DIST_CLASSPATH=$(/opt/hadoop-3.3.5/bin/hadoop classpath)
  3. 在HDFS上创建事件日志目录:

    hdfs dfs -mkdir /spark-eventlog hdfs dfs -chmod 777 /spark-eventlog

4.2 圆周率测试问题排查

执行Spark Pi测试时常见问题:

  1. ClassNotFound异常: 确保spark-submit命令包含完整的jar路径:

    spark-submit --master yarn --class org.apache.spark.examples.SparkPi \ /opt/spark/examples/jars/spark-examples_2.12-3.3.2.jar 100
  2. 资源不足错误: 调整executor内存配置:

    spark-submit --master yarn --num-executors 2 --executor-memory 1g ...
  3. 查看日志技巧

    • 通过YARN Web UI(8088端口)查看应用日志
    • 直接查看容器日志:
      yarn logs -applicationId <app_id>

5. 性能调优与维护建议

5.1 内存配置优化

针对JDK 17和Hadoop/Spark的配合,推荐以下JVM参数:

组件参数推荐值说明
NameNode-Xmx2-4G根据元数据量调整
DataNode-Xmx1-2G通常不需要太大
Spark Driverspark.driver.memory2-4G控制驱动进程内存
Spark Executorspark.executor.memory4-8G每个执行器内存

5.2 日常维护命令

常用监控和维护命令集合:

  • HDFS健康检查

    hdfs dfsadmin -report hdfs fsck / -files -blocks
  • YARN应用管理

    yarn application -list yarn application -kill <app_id>
  • Spark历史日志: 启动历史服务器:

    ${SPARK_HOME}/sbin/start-history-server.sh

经过完整测试的集群应该能够稳定运行批处理和交互式作业。在实际项目中,建议进一步配置监控系统(如Prometheus+Grafana)来跟踪集群健康状态。