☰
Hadoop 3.3.6 伪分布式安装实战:从 tar.gz 到 HDFS+YARN 可用
2026/10/6 13:38:00 网站建设 项目流程

简介:本资源为 Apache Hadoop 3.3.6 官方二进制发行版安装包(hadoop-3.3.6.tar.gz),面向大数据初学者、运维工程师及分布式系统实践者,用于快速搭建本地或集群环境,支撑HDFS存储、YARN资源调度与MapReduce计算等核心功能的学习与开发。压缩包解压即用,无需编译,配套包含大量Web UI静态资源(如yarn-ui.css、bootstrap系列CSS/JS)、可执行脚本(sh/cmd)、配置模板(xml/properties/conf)、核心JAR库及文档文件(html/license/notice),覆盖部署、监控、调试全流程所需资产。资源共2000个文件,总大小696.28MB,其中HTML文档超1.6万页,提供完整API参考与用户指南;JAR包504个支撑各类服务模块;Shell脚本74个便于环境初始化与服务启停。目前已有1362人下载学习,适合需要开箱即用、深入理解Hadoop目录结构与组件依赖关系的实践者。

1. Hadoop 3.3.6 安装包:不是“解压即用”,而是伪分布式环境的起点

你下载了hadoop-3.3.6.tar.gz,双击解压后看到bin/etc/share/一堆目录,心里一松:“Hadoop装好了?”——错。这只是一个未经配置、未初始化、未验证的二进制骨架。它不连本地文件系统,不启 NameNode,不跑 MapReduce,甚至hadoop version都会报JAVA_HOME not set。真正卡住新手的,从来不是“怎么下”,而是“解压之后哪一步先动、改哪三行配置、为什么start-dfs.sh一执行就卡在localhost: ssh: connect to host localhost port 22: Connection refused”。本篇不讲 Hadoop 架构图或 RDD 概念,只聚焦一个动作:用hadoop-3.3.6.tar.gz在单机上跑通伪分布式模式(Pseudo-Distributed Mode),让hdfs dfs -ls /返回真实目录,让yarn node -list显示 RUNNING 状态。适合正在头歌平台做实验、准备大数据课程设计、或需快速验证 Hive/Spark 底层依赖的同学——你不需要集群,但必须让 Hadoop 的核心进程(NameNode/DataNode/ResourceManager/NodeManager)在本机独立进程里真正活起来。所有操作基于 Ubuntu 22.04 + OpenJDK 17(JDK 17 是 Hadoop 3.3.6 的硬性要求,JDK 8 已彻底不兼容),命令可逐行复制,配置项带明确取值依据,失败时看哪几行日志——这才是安装包该有的打开方式。


2. 从 tar.gz 到可启动服务:四步不可跳过的初始化流程

Hadoop 3.3.6 的安装包本质是预编译二进制分发版,它不包含 JDK、不生成 SSH 密钥、不创建 HDFS 数据目录、也不校验 XML 配置语法。所谓“安装”,实为环境适配 → 目录初始化 → 配置注入 → 进程启动四步闭环。跳过任意一步,后续start-dfs.sh要么静默退出,要么日志里堆满java.lang.NoClassDefFoundError或Connection refused。下面每一步都对应一个具体动作、一个必须检查的输出、一个可复现的验证点。

2.1 解压与环境变量固化:为什么export HADOOP_HOME必须写进~/.bashrc而非临时生效

# 1. 创建统一安装目录(避免权限混乱) sudo mkdir -p /opt/hadoop sudo chown $USER:$USER /opt/hadoop # 2. 解压到目标路径(注意:不要解到 ~/Downloads 下!) tar -zxvf hadoop-3.3.6.tar.gz -C /opt/hadoop/ # 解压后得到 /opt/hadoop/hadoop-3.3.6/ # 3. 设置环境变量(关键:必须 source 到当前 shell 且永久化) echo 'export HADOOP_HOME=/opt/hadoop/hadoop-3.3.6' >> ~/.bashrc echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc echo 'export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc source ~/.bashrc # 4. 验证基础命令可用(不是看版本号,而是看是否识别 HADOOP_HOME) hadoop version 2>/dev/null | head -n1 # 正确输出应为:Hadoop 3.3.6

逻辑说明:HADOOP_HOME不仅用于定位bin/下的脚本,更是etc/hadoop/配置文件的默认搜索根路径。若只在当前终端export,start-dfs.sh内部调用的子脚本(如hdfs --daemon start namenode)会丢失该变量,导致配置加载失败。HADOOP_CONF_DIR显式指定配置目录,避免 Hadoop 去$HADOOP_HOME/etc/hadoop外的路径(如/etc/hadoop)找文件,这是生产环境和伪分布式必须隔离的关键。

2.2 JDK 17 强制绑定:Hadoop 3.3.6 的 class 版本陷阱

Hadoop 3.3.6 编译目标为 Java 11+,但官方文档明确要求JDK 17(LTS)。使用 JDK 17 以下版本(如 JDK 11)会导致org.apache.hadoop.util.VersionInfo类加载失败;使用 JDK 21 则因--illegal-access=permit参数被移除而启动报错。验证方式不是java -version,而是检查 Hadoop 启动时实际加载的 JVM:

# 先确认已安装 JDK 17(Ubuntu 下推荐 openjdk-17-jdk) sudo apt update && sudo apt install -y openjdk-17-jdk # 设置 JAVA_HOME(必须指向 jdk-17 的 home,而非 jre) export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:/jre/bin/java::") echo $JAVA_HOME # 应输出 /usr/lib/jvm/java-17-openjdk-amd64 # 将 JAVA_HOME 写入 ~/.bashrc(同 HADOOP_HOME 逻辑) echo "export JAVA_HOME=$JAVA_HOME" >> ~/.bashrc source ~/.bashrc # 关键验证:检查 Hadoop 启动脚本是否读取到正确 JDK $HADOOP_HOME/bin/hadoop classpath | grep "java-17" # 若无输出,说明 HADOOP_HOME 或 JAVA_HOME 未生效

参数说明:hadoop classpath输出的是 Hadoop 运行时实际加载的 JAR 包路径。其中java-17字符串必须出现,证明 JVM 加载的是 JDK 17 的 rt.jar 和 tools.jar。若看到java-11或java-8,说明JAVA_HOME指向错误,或系统存在多版本 JDK 且update-alternatives未切换。

2.3 SSH 免密登录:伪分布式模式的底层通信基石

Hadoop 伪分布式虽运行在单机,但其进程间通信(如 NameNode 启动 DataNode)仍通过 SSH 执行远程命令(ssh localhost)。若未配置免密,start-dfs.sh会卡在starting namenodes on [localhost]并无限等待密码输入。

# 1. 安装并启动 SSH 服务(Ubuntu 默认可能未启用) sudo apt install -y openssh-server sudo systemctl enable ssh sudo systemctl start ssh # 2. 生成 RSA 密钥对(不设密码,-N "" 是关键) ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa # 3. 将公钥追加到 authorized_keys(注意:是追加,不是覆盖) cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 4. 测试免密登录(必须返回 success,且无密码提示) ssh -o StrictHostKeyChecking=no localhost "echo success" 2>/dev/null # 正确输出:success

逻辑说明:StrictHostKeyChecking=no参数绕过首次连接的 host key 确认,避免脚本卡住。-o选项必须显式写出,因为start-dfs.sh内部调用ssh时未传此参数。若测试失败,90% 原因是~/.ssh/authorized_keys权限不对(必须 600)、sshd_config中PubkeyAuthentication yes未开启,或~/.ssh目录权限过大(不能是 777)。

2.4 HDFS 数据目录初始化:格式化前必须手动创建的三个路径

Hadoop 不会自动创建dfs.namenode.name.dir和dfs.datanode.data.dir对应的物理目录。若直接运行hdfs namenode -format,它会在空目录下生成元数据,但 DataNode 启动时因data目录不存在而拒绝注册,导致jps看不到 DataNode 进程。

# 1. 创建 HDFS 核心目录(路径必须与后续 core-site.xml 中配置一致) mkdir -p $HADOOP_HOME/data/namenode mkdir -p $HADOOP_HOME/data/datanode mkdir -p $HADOOP_HOME/logs # 2. 设置目录权限(Hadoop 进程需写入权限) chmod 755 $HADOOP_HOME/data chmod 755 $HADOOP_HOME/logs # 3. 格式化 NameNode(仅首次执行!重复执行会清空元数据) hdfs namenode -format -force # 4. 验证格式化结果(检查 VERSION 文件是否存在) ls -l $HADOOP_HOME/data/namenode/current/VERSION # 正确输出:-rw-r--r-- 1 user user 123 date VERSION

参数说明:-force参数强制覆盖已有格式化信息,避免Directory is not empty错误。VERSION文件是 NameNode 初始化成功的标志,其内容包含namespaceID和clusterID,这两个 ID 必须与后续 DataNode 的VERSION文件一致,否则 DataNode 拒绝加入集群。这也是为什么data目录必须手动创建——Hadoop 只在namenode目录下生成current/子目录,但datanode目录下什么也不建。


3. 四个核心配置文件:每一行修改都有明确作用域与取值依据

Hadoop 3.3.6 的伪分布式模式依赖core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml四个文件。网上教程常把配置项堆在一起,却不说明为什么改这一行、不改那一行、改错会触发什么异常。这里按启动顺序拆解,每项配置标注其影响范围(NameNode / DataNode / ResourceManager / Client)和典型错误现象。

3.1core-site.xml:定义 HDFS 访问入口与本地文件系统挂载点

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- HDFS 默认文件系统 URI:客户端访问 HDFS 的根地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> <description>HDFS URI for client access</description> </property> <!-- 本地文件系统缓存目录:MapReduce 临时文件存放位置 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop/hadoop-3.3.6/data/tmp</value> <description>Local temp dir for MapReduce staging</description> </property> </configuration>

逻辑说明:fs.defaultFS是客户端(如hdfs dfs -ls /)连接 HDFS 的唯一入口。若写成hdfs://127.0.0.1:9000,部分网络库会解析失败;若端口不是9000,NameNode 日志会报BindException: Address already in use。hadoop.tmp.dir必须是绝对路径且有写权限,否则yarn启动时报Cannot create directory。该配置影响所有组件,是整个 Hadoop 生态的“根域名”。

3.2hdfs-site.xml:控制 NameNode 与 DataNode 的存储行为

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- NameNode 元数据存储路径 --> <property> <name>dfs.namenode.name.dir</name> <value>file:///opt/hadoop/hadoop-3.3.6/data/namenode</value> <description>Path on local filesystem where NameNode stores metadata</description> </property> <!-- DataNode 数据块存储路径 --> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/hadoop/hadoop-3.3.6/data/datanode</value> <description>Path on local filesystem where DataNode stores blocks</description> </property> <!-- 块副本数(伪分布式设为 1,避免因单节点无法满足副本要求而拒绝写入) --> <property> <name>dfs.replication</name> <value>1</value> <description>Default block replication factor</description> </property> </configuration>

参数说明:dfs.namenode.name.dir和dfs.datanode.data.dir必须是file://协议的绝对路径,且与 2.4 节创建的目录完全一致。若漏掉file://前缀,Hadoop 会尝试走 HDFS 协议,导致NameNode启动失败。dfs.replication=1是伪分布式模式的强制设置——HDFS 默认要求副本数 ≥3,单节点无法满足,设为 1 后hdfs dfs -put才能成功写入。

3.3mapred-site.xml:激活 MapReduce 框架并绑定 YARN 资源管理

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- MapReduce 运行框架:必须设为 yarn,否则作业提交到本地 JVM 而非 YARN --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>Execution framework for MapReduce jobs</description> </property> <!-- MapReduce 历史服务器地址(用于查看已完成作业) --> <property> <name>mapreduce.jobhistory.address</name> <value>localhost:10020</value> <description>JobHistory Server host:port</description> </property> </configuration>

逻辑说明:mapreduce.framework.name=yarn是伪分布式与完全分布式的关键分水岭。若设为local,MapReduce 作业在本地线程运行,yarn进程不会参与调度,yarn application -list永远为空。mapreduce.jobhistory.address启动历史服务器后,可通过http://localhost:19888查看作业详情,这是调试 MapReduce 的必备入口。

3.4yarn-site.xml:定义 ResourceManager 与 NodeManager 的通信契约

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- ResourceManager 主机名(必须与 fs.defaultFS 中的主机名一致) --> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> <description>Hostname of ResourceManager</description> </property> <!-- NodeManager 使用的本地资源目录(类似 HDFS 的 data.dir) --> <property> <name>yarn.nodemanager.local-dirs</name> <value>/opt/hadoop/hadoop-3.3.6/data/yarn/local</value> <description>Local directories for NodeManager to store intermediate data</description> </property> <!-- NodeManager 使用的日志聚合目录(YARN 日志集中存储位置) --> <property> <name>yarn.nodemanager.log-dirs</name> <value>/opt/hadoop/hadoop-3.3.6/logs/yarn</value> <description>Directories for NodeManager to store container logs</description> </property> </configuration>

参数说明:yarn.resourcemanager.hostname必须与core-site.xml中fs.defaultFS的主机名(localhost)严格一致,否则 NodeManager 注册失败,jps看不到NodeManager。yarn.nodemanager.local-dirs和log-dirs必须是真实存在的可写目录,否则start-yarn.sh启动后yarn node -list显示0 active nodes。


4. 启动、验证与排错:三类高频失败场景的精准定位法

即使配置全部正确,start-dfs.sh和start-yarn.sh仍可能静默失败或进程闪退。此时不能靠jps看进程名,而要按日志层级逐级排查:先看logs/下的hadoop-*-namenode-*.log,再查yarn-*-resourcemanager-*.log,最后盯stdout和stderr。以下是三个最常踩的坑,每条都给出现象、根因、解决动作。

4.1 现象:start-dfs.sh执行后jps只显示Jps,无NameNode/DataNode

  • 原因:hadoop-3.3.6/etc/hadoop/下缺少workers文件,或其内容为空。Hadoop 3.3.6 默认读取workers文件获取 DataNode 列表,若文件不存在或为空,start-dfs.sh不启动任何 DataNode,NameNode 因无 DataNode 注册而主动退出。
  • 解决:
    echo "localhost" > $HADOOP_HOME/etc/hadoop/workers # 注意:文件名是 workers(Hadoop 3.0+ 替代 slaves),内容只能是 hostname,不能带端口或协议

4.2 现象:hdfs dfs -ls /报错Call From localhost to localhost:9000 failed on connection exception

  • 原因:core-site.xml中fs.defaultFS的端口9000被其他进程占用(如 Docker、PostgreSQL),或hdfs-site.xml中dfs.namenode.name.dir路径权限不足,NameNode 启动时因无法写入VERSION文件而崩溃。
  • 解决:
    # 检查 9000 端口占用 ss -tuln | grep :9000 # 若被占用,修改 core-site.xml 的端口为 9001,并同步改 hdfs-site.xml 的 dfs.namenode.http-address(见 4.3) # 检查 namenode 目录权限 ls -ld $HADOOP_HOME/data/namenode # 必须输出 drwxr-xr-x,若为 drw-------,执行 chmod 755

4.3 现象:yarn node -list返回0 active nodes,但jps显示ResourceManager和NodeManager

  • 原因:yarn-site.xml中yarn.resourcemanager.hostname与core-site.xml中fs.defaultFS的主机名不一致(如一个是localhost,另一个是127.0.0.1),导致 NodeManager 注册时 DNS 解析失败,ResourceManager 日志中出现Registration request from node localhost:45228 rejected。
  • 解决:
    # 统一所有配置中的主机名为 localhost(不要用 127.0.0.1) # 并确保 /etc/hosts 中有: echo "127.0.0.1 localhost" | sudo tee -a /etc/hosts # 修改 yarn-site.xml 的 yarn.resourcemanager.hostname 为 localhost # 修改 core-site.xml 的 fs.defaultFS 为 hdfs://localhost:9000

避坑总结:所有配置修改后,必须执行stop-dfs.sh && stop-yarn.sh彻底关闭旧进程,再start-dfs.sh && start-yarn.sh。不要试图kill -9进程,Hadoop 会残留锁文件(如hadoop-3.3.6/data/namenode/in_use.lock),导致下次启动报Another namenode is running。


5. 验证服务健康度:五个命令确认伪分布式真正跑通

配置和启动只是第一步,真正的“跑通”意味着 HDFS 可读写、YARN 可调度、MapReduce 可执行、日志可追溯、Web UI 可访问。以下五个命令覆盖全链路,每个都带预期输出和失败时的速查点。

5.1 HDFS 基础读写:hdfs dfs -mkdir+hdfs dfs -put+hdfs dfs -ls

# 1. 创建根目录下的 test 目录 hdfs dfs -mkdir /test # 2. 上传本地文件(用 echo 生成测试文件,避免依赖外部文件) echo "hello hadoop 3.3.6" > /tmp/test.txt hdfs dfs -put /tmp/test.txt /test/ # 3. 列出目录内容(关键:看文件大小是否 >0) hdfs dfs -ls /test/ # 正确输出示例: # -rw-r--r-- 1 user supergroup 19 2024-06-15 10:00 /test/test.txt

验证逻辑:-ls输出中文件大小19证明数据块已成功写入 DataNode。若大小为0,说明 DataNode 未注册成功;若报No such file or directory,说明 NameNode 未运行或fs.defaultFS配置错误。

5.2 YARN 节点状态:yarn node -list必须显示RUNNING

yarn node -list -all # 正确输出应包含: # Total Nodes:1 # Node-Id Node-State Node-Http-Address Number-of-Running-Containers # localhost:45228 RUNNING localhost:8042 0

验证逻辑:Node-State必须为RUNNING,Node-Http-Address必须可访问(浏览器打开http://localhost:8042应显示 NodeManager Web UI)。若状态为UNHEALTHY,检查yarn.nodemanager.local-dirs目录磁盘空间是否充足。

5.3 MapReduce 作业提交:hadoop jar运行官方 WordCount 示例

# 1. 准备输入文件(两行文本) echo "hello world" > /tmp/input.txt echo "hello hadoop" >> /tmp/input.txt hdfs dfs -mkdir /wordcount/input hdfs dfs -put /tmp/input.txt /wordcount/input/ # 2. 提交 MapReduce 作业(使用 Hadoop 自带的 example jar) hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar \ wordcount /wordcount/input /wordcount/output # 3. 检查输出(作业成功后,/wordcount/output/part-r-00000 应存在) hdfs dfs -cat /wordcount/output/part-r-00000 # 正确输出: # hadoop 1 # hello 2 # world 1

验证逻辑:part-r-00000是 Reduce 阶段的最终输出文件。若该文件不存在,说明 MapReduce 作业未完成;若内容为空,检查mapred-site.xml中mapreduce.framework.name是否为yarn。

5.4 Web UI 可访问性:四个端口必须全部响应 HTTP 200

端口URL用途验证命令
9870http://localhost:9870NameNode Web UIcurl -sI http://localhost:9870 | head -n1→HTTP/1.1 200 OK
8088http://localhost:8088ResourceManager Web UIcurl -sI http://localhost:8088 | head -n1
8042http://localhost:8042NodeManager Web UIcurl -sI http://localhost:8042 | head -n1
19888http://localhost:19888JobHistory Servercurl -sI http://localhost:19888 | head -n1

验证逻辑:curl -sI只获取 HTTP 头,不下载页面,速度快。若任一端口返回HTTP/1.1 503 Service Unavailable,说明对应服务未启动或配置端口冲突。

5.5 日志溯源:从logs/目录定位任意失败的根源

Hadoop 所有组件日志默认输出到$HADOOP_HOME/logs/,命名规则为<component>-<user>-<hostname>.log。例如:

  • NameNode 日志:hadoop-user-namenode-localhost.localdomain.log
  • DataNode 日志:hadoop-user-datanode-localhost.localdomain.log
  • ResourceManager 日志:yarn-user-resourcemanager-localhost.localdomain.log
# 实时跟踪 NameNode 启动日志(启动时最关键的 20 行) tail -n20 $HADOOP_HOME/logs/hadoop-*-namenode-*.log # 搜索 DataNode 注册失败关键词 grep -i "registration.*failed\|refused" $HADOOP_HOME/logs/hadoop-*-datanode-*.log # 查看最近 5 分钟 ResourceManager 的 ERROR 级别日志 grep -i "error\|exception" $HADOOP_HOME/logs/yarn-*-resourcemanager-*.log | \ awk -F' ' '{if($2>"'$(date -d '5 minutes ago' +%H:%M)'") print}'

技巧说明:tail -n20比cat更高效,因为 NameNode 启动成功日志总在末尾。grep -i忽略大小写,registration.*failed正则匹配注册失败的各种变体(如registration failed、registration refused)。时间过滤用awk比sed更精准,避免误删日志头。


6. 进阶技巧:让hadoop-3.3.6.tar.gz成为可复用的部署模板

做到上一章的五个验证,说明伪分布式已跑通。但真实项目中,你不会每次重装都手敲配置、改workers、调端口。我习惯把hadoop-3.3.6.tar.gz解压后的目录做成可参数化的部署模板,用 Bash 脚本一键生成适配不同环境的配置。这不是为了炫技,而是解决三个现实问题:① 多台机器部署时配置一致性;② 头歌平台实验需频繁重置环境;③ 面试官让你现场搭集群时节省 80% 时间。

6.1 用sed批量替换配置:把localhost替换为任意主机名

假设你要在server01上部署,只需运行:

# 定义目标主机名 TARGET_HOST="server01" # 批量替换所有配置文件中的 localhost sed -i "s/localhost/$TARGET_HOST/g" $HADOOP_HOME/etc/hadoop/core-site.xml sed -i "s/localhost/$TARGET_HOST/g" $HADOOP_HOME/etc/hadoop/hdfs-site.xml sed -i "s/localhost/$TARGET_HOST/g" $HADOOP_HOME/etc/hadoop/yarn-site.xml sed -i "s/localhost/$TARGET_HOST/g" $HADOOP_HOME/etc/hadoop/workers # 同时更新 NameNode HTTP 地址(9870 端口) sed -i "s/9870/9870/g" $HADOOP_HOME/etc/hadoop/hdfs-site.xml # 注意:此处保留 9870,仅替换主机名

参数说明:sed -i直接修改原文件,s/localhost/server01/g中的g表示全局替换(一行内多个localhost全部替换)。hdfs-site.xml中dfs.namenode.http-address默认是localhost:9870,替换后变为server01:9870,Web UI 即可通过http://server01:9870访问。

6.2 用cp+mkdir构建标准化目录结构:避免手建目录权限错误

我写了一个init-hadoop-env.sh脚本,放在$HADOOP_HOME/下:

#!/bin/bash # init-hadoop-env.sh:一键初始化 Hadoop 运行目录 HADOOP_HOME=${HADOOP_HOME:-"/opt/hadoop/hadoop-3.3.6"} # 创建标准目录树 mkdir -p $HADOOP_HOME/{data/{namenode,datanode,yarn/local},logs/{yarn,hdfs,mapred},tmp} # 设置统一权限(755 对目录,644 对文件) find $HADOOP_HOME/data -type d -exec chmod 755 {} \; find $HADOOP_HOME/logs -type d -exec chmod 755 {} \; chmod 644 $HADOOP_HOME/etc/hadoop/*.xml # 生成 workers 文件 echo "localhost" > $HADOOP_HOME/etc/hadoop/workers

执行方式:chmod +x init-hadoop-env.sh && ./init-hadoop-env.sh。它比手动mkdir更可靠,因为find ... -exec chmod确保所有子目录权限一致,避免data/datanode权限正确但data/datanode/current权限错误导致 DataNode 启动失败。

6.3 用jps+netstat编写健康检查脚本

把验证逻辑固化为check-hadoop.sh:

#!/bin/bash # check-hadoop.sh:五维健康检查 echo "=== HDFS Status ===" hdfs dfs -ls / >/dev/null 2>&1 && echo "✅ HDFS accessible" || echo "❌ HDFS down" echo "=== YARN Nodes ===" yarn node -list 2>/dev/null | grep RUNNING >/dev/null && echo "✅ YARN nodes running" || echo "❌ YARN nodes down" echo "=== Web UI Ports ===" for port in 9870 8088 8042; do if nc -z localhost $port; then echo "✅ Port $port open" else echo "❌ Port $port closed" fi done echo "=== Log Errors ===" if grep -q "ERROR\|Exception" $HADOOP_HOME/logs/*.log; then echo "⚠️ Errors found in logs (check $HADOOP_HOME/logs/)" else echo "✅ No errors in logs" fi

使用场景:每次start-dfs.sh && start-yarn.sh后,直接运行./check-hadoop.sh,5 秒内获知全链路状态。它比人工jps+curl+grep快 10 倍,且结果可读性强。

我坚持把hadoop-3.3.6.tar.gz当作一个需要“驯化”的工具,而不是解压即用的黑匣子。每一次start-dfs.sh失败,我都先看logs/hadoop-*-namenode-*.log的最后一行,而不是百度错误码;每一次配置修改,我都用sed批量替换,而不是 Vim 逐个文件打开。这些习惯省下的时间,足够我把 Hadoop 搭建流程教给三个新人。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询