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集群时,我踩遍了所有能想到的坑——从诡异的权限错误到Yarn模式下Spark作业的神秘失败。这篇记录不是教科书式的步骤复述,而是一个真实场景下的故障诊断手册,我会把那些官方文档没写的细节和凌晨三点才找到的解决方案都摊开来。
1. 环境准备:虚拟机配置的魔鬼细节
在VMware Workstation Pro 16上使用CentOS 8.5时,第一个教训就来了:默认20GB磁盘根本不够用。实际测试发现,仅Hadoop和Spark的日志就会吃掉15GB空间,更别说后续的数据节点存储。这是我的最终配置方案:
- 磁盘分配:
- 主节点:100GB动态分配(实际使用约65GB)
- 从节点:80GB动态分配(实际使用约50GB)
- 内存配置:
# 在/etc/sysctl.conf追加(防止OOM Killer杀死关键进程) vm.overcommit_memory = 1 vm.overcommit_ratio = 95 - 关键依赖:
# 必须安装的依赖包(CentOS 8默认缺失) dnf install -y perl openssl-devel cyrus-sasl-devel libxml2-devel libcurl-devel
注意:JDK 17的模块化系统会导致Hadoop启动时报
java.lang.reflect.InaccessibleObjectException,需要在所有节点的/etc/profile添加:export HADOOP_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED"
2. 集群互信配置:那些容易忽略的权限问题
按照教程配置SSH免密登录后,发现从节点仍然要求输入密码。经过抓包分析,问题出在以下几个隐蔽环节:
-
文件权限检查清单:
~/.ssh目录权限必须为700authorized_keys文件权限必须为600- SELinux上下文需要保持一致:
restorecon -Rv ~/.ssh
-
hosts文件陷阱:
- 每台机器的
/etc/hosts必须包含所有节点的完整FQDN和短主机名 - 错误示例会导致Yarn资源管理器无法解析节点:
192.168.1.101 master # 错误!缺少FQDN - 正确写法:
192.168.1.101 master master.example.com
- 每台机器的
-
时间同步关键点:
# 所有节点必须同步到毫秒级(Spark依赖精确时钟) timedatectl set-ntp true chronyc makestep
3. Hadoop 3.3.5的特殊配置项
官方文档没提到的几个Hadoop 3.x新特性配置:
3.1 必须修改的core-site.xml参数
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<!-- 这个路径需要手动创建并赋权 -->
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-3.3.5/tmp</value>
</property>
<property>
<!-- JDK 17必须添加的JVM参数 -->
<name>hadoop.workaround.non.threadsafe.getpwuid</name>
<value>true</value>
</property>
3.2 Yarn资源调度优化
在yarn-site.xml中添加这些实测有效的参数:
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value> <!-- 根据实际内存调整 -->
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>6144</value>
</property>
<property>
<!-- 解决JDK 17兼容性问题 -->
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME,LANG,TZ,HADOOP_OPTS</value>
</property>
3.3 格式化NameNode时的注意事项
# 必须先删除所有节点的tmp目录内容
rm -rf /opt/hadoop-3.3.5/tmp/*
# 格式化命令需要添加-force参数
hdfs namenode -format -force
4. Spark on Yarn的深度配置技巧
4.1 spark-defaults.conf关键配置
spark.master yarn
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master:9000/spark-eventlog
spark.hadoop.fs.defaultFS hdfs://master:9000
spark.yarn.jars hdfs://master:9000/spark-jars/*
spark.driver.memory 4g
spark.executor.memory 4g
spark.executor.instances 3
4.2 必须执行的准备工作
-
在HDFS创建专用目录:
hdfs dfs -mkdir /spark-jars hdfs dfs -put $SPARK_HOME/jars/* /spark-jars/ -
修正日志目录权限:
hdfs dfs -chmod -R 777 /spark-eventlog
4.3 圆周率计算作业的完整命令
spark-submit \
--master yarn \
--deploy-mode cluster \
--conf spark.yarn.appMasterEnv.JAVA_HOME=/usr/lib/jvm/jdk-17-oracle-x64 \
--conf spark.executorEnv.JAVA_HOME=/usr/lib/jvm/jdk-17-oracle-x64 \
--class org.apache.spark.examples.SparkPi \
/opt/spark/examples/jars/spark-examples_2.12-3.3.2.jar \
100
当看到8088端口页面上出现"Pi is roughly 3.1416"时,那种成就感比实际算出的圆周率还要精确。整个过程最深的体会是:集群搭建就像调试分布式系统的一面镜子,每一个错误提示背后都藏着至少三层需要验证的假设。
更多推荐



所有评论(0)