三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

JDK 17 + Hadoop 3.3.5 + Spark 3.3.2 集群搭建保姆级避坑指南(CentOS 8.5 + VMware)

JDK 17 + Hadoop 3.3.5 + Spark 3.3.2 集群搭建保姆级避坑指南(CentOS 8.5 + VMware)

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存储空间。以下是几个容易忽略的关键点:

  • 网络模式选择:务必使用桥接模式而非NAT,否则集群节点间通信会出问题
  • 时区同步:运行timedatectl set-timezone Asia/Shanghai避免时间不同步导致的认证问题
  • SELinux配置:编辑/etc/selinux/config设置为SELINUX=disabled,重启生效

注意:克隆虚拟机前务必在原始机器上执行rm -rf /etc/udev/rules.d/70-persistent-net.rules以避免网卡冲突

1.2 JDK 17安装与关键配置

JDK 17的模块化系统带来了新的兼容性挑战。以下是必须添加的JVM参数:

# /etc/profile 中Java环境变量配置 export JAVA_HOME=/usr/lib/jvm/jdk-17-oracle-x64 export PATH=$PATH:$JAVA_HOME/bin export HADOOP_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED" export SPARK_DRIVER_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED"

验证安装时不要只用java -version,还要测试模块系统:

java --add-opens java.base/java.lang=ALL-UNNAMED -version

2. 集群基础架构搭建

2.1 节点互信配置实战

SSH免密登录是集群工作的基础,但常见问题包括:

  • 权限问题:确保~/.ssh目录权限为700,authorized_keys为600
  • 加密算法:编辑/etc/ssh/sshd_config添加HostKeyAlgorithms ssh-rsa以兼容旧版

主机名解析的可靠配置方案:

# /etc/hosts 示例(所有节点保持一致) 192.168.1.101 master 192.168.1.102 worker1 192.168.1.103 worker2 192.168.1.104 worker3 # 验证互信 for node in master worker1 worker2 worker3; do ssh $node "hostname && date" done

2.2 Hadoop 3.3.5核心配置

这些配置文件中的参数最容易出错:

core-site.xml 关键项

<property> <name>fs.defaultFS</name> <value>hdfs://master:8020</value> <!-- 注意端口不是9000 --> </property> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> <!-- 避免Web UI权限问题 --> </property>

hdfs-site.xml 必须项

<property> <name>dfs.namenode.name.dir</name> <value>/opt/hadoop-3.3.5/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/opt/hadoop-3.3.5/datanode</value> </property>

致命陷阱:格式化NameNode前必须删除所有节点上的数据目录,否则会导致DataNode无法注册

3. YARN资源配置与优化

3.1 内存与CPU分配策略

yarn-site.xml中设置合理的资源限制:

<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>3072</value> <!-- 不超过物理内存的80% --> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>2048</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>2</value> <!-- 虚拟CPU核心数 --> </property>

3.2 常见启动问题解决

start-yarn.sh失败时,按此流程排查:

  1. 检查yarn.resourcemanager.hostname是否指向正确的主节点
  2. 验证yarn.nodemanager.aux-services设置为mapreduce_shuffle
  3. 确保所有节点的HADOOP_CONF_DIR环境变量一致
  4. 查看日志:tail -n 100 $HADOOP_HOME/logs/yarn-*-resourcemanager-*.log

4. Spark on YARN集成配置

4.1 关键配置文件详解

spark-defaults.conf 必须配置

spark.master yarn spark.eventLog.enabled true spark.eventLog.dir hdfs://master:8020/spark-logs spark.history.fs.logDirectory hdfs://master:8020/spark-logs spark.yarn.jars hdfs://master:8020/spark-jars/*

spark-env.sh 重要变量

export SPARK_DIST_CLASSPATH=$(hadoop classpath) export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export SPARK_EXTRA_CLASSPATH=$HADOOP_CONF_DIR

4.2 部署模式对比

参数Client模式Cluster模式
驱动进程位置提交任务的机器YARN容器中
日志可见性直接输出到控制台需要通过YARN UI查看
适用场景交互式调试生产环境长期运行任务
资源释放客户端断开则任务终止客户端断开不影响任务执行

4.3 圆周率测试任务排错

spark-submit提交失败时,重点关注:

  1. 类路径问题:确保--jars参数指定了所有依赖
  2. 内存不足:添加--executor-memory 2g参数
  3. Java 17兼容性:必须包含--add-opens参数

成功提交示例:

spark-submit --master yarn \ --deploy-mode cluster \ --driver-java-options "--add-opens java.base/java.lang=ALL-UNNAMED" \ --conf "spark.executor.extraJavaOptions=--add-opens java.base/java.lang=ALL-UNNAMED" \ --class org.apache.spark.examples.SparkPi \ $SPARK_HOME/examples/jars/spark-examples_2.12-3.3.2.jar 100

5. 集群验证与监控

5.1 服务健康检查清单

通过以下命令验证各组件状态:

# HDFS状态 hdfs dfsadmin -report # YARN节点 yarn node -list # Spark历史服务器 curl http://master:18080 # 综合检查脚本 for service in namenode datanode resourcemanager nodemanager; do jps | grep -q $service || echo "$service NOT running" done

5.2 关键监控指标

配置Grafana监控以下核心指标:

  • HDFS:剩余容量、丢失块数、活跃DataNode数
  • YARN:待处理应用数、容器使用率、内存预留
  • Spark:执行器数量、任务失败率、Shuffle读写量

6. 性能调优实战技巧

6.1 Hadoop参数优化

hadoop-env.sh 内存设置

export HADOOP_HEAPSIZE_MAX=2048m export HADOOP_NAMENODE_OPTS="-Xmx2g -XX:+UseG1GC" export HADOOP_DATANODE_OPTS="-Xmx1g -XX:+UseG1GC"

6.2 Spark执行效率提升

优化RDD操作的三个黄金法则:

  1. 持久化策略:对多次使用的RDD进行cache或persist

    val data = sc.textFile("hdfs://path").persist(StorageLevel.MEMORY_AND_DISK)
  2. 分区数调整:确保每个分区处理128MB-256MB数据

    spark-submit --conf spark.sql.shuffle.partitions=200 ...
  3. 序列化选择:在spark-defaults.conf中配置

    spark.serializer org.apache.spark.serializer.KryoSerializer

7. 日常维护与问题诊断

7.1 日志分析指南

关键日志文件位置:

组件日志路径关键信息
HDFS$HADOOP_HOME/logs/hadoop--namenode-.log块报告、DataNode注册
YARN$HADOOP_HOME/logs/yarn--resourcemanager-.log应用提交、资源分配
Spark$SPARK_HOME/logs/spark--driver-.log任务序列化、Shuffle错误

7.2 安全关闭流程

正确的集群关闭顺序:

  1. 停止Spark作业和历史服务器
  2. 关闭YARN资源管理器
  3. 停止HDFS服务
  4. 最后关闭ZKFC(如果配置了HA)
# 完整停止脚本 $SPARK_HOME/sbin/stop-all.sh stop-yarn.sh stop-dfs.sh

遇到无法停止的服务时,先用jps查找进程ID,然后kill -9强制终止。

← 返回列表