适用系统 :CentOS / Ubuntu / 其他主流 Linux 发行版
目标版本 :Apache Hadoop 3.3.6(稳定 LTS 版本)
安装路径 :/opt/hadoop
前提条件 :已安装完整 JDK(非 JRE),并正确设置JAVA_HOME环境变量
在大数据生态中,Hadoop 是分布式存储与计算的基石。然而手动部署 Hadoop 涉及下载、解压、环境变量配置、hadoop-env.sh 修改等多个步骤,稍有不慎就会导致"命令找不到"或"Java home not set"等错误。
本文提供一个 全自动 Bash 安装脚本,可一键完成 Hadoop 3.3.6 的下载、安装、环境变量配置及 Java 路径注入,极大提升部署效率,特别适合开发测试环境快速搭建或自动化运维场景。
📌 脚本核心功能亮点
- ✅ 强制 root 权限运行(确保
/opt/可写) - ✅ 严格校验
JAVA_HOME是否指向完整 JDK(需包含java和jps) - ✅ 自动从 Apache 官方镜像下载 Hadoop 3.3.6
- ✅ 避免重复下载
.tar.gz文件(检查/tmp/) - ✅ 避免重复解压(检测
/opt/hadoop或原始目录是否存在) - ✅ 智能写入
/etc/profile环境变量(防止重复添加) - ✅ 自动修改
hadoop-env.sh中的JAVA_HOME(支持注释行替换) - ✅ 安装后自动验证
hdfs version是否可用
📜 完整安装脚本
将以下内容保存为 install_hadoop.sh:
bash
#!/bin/bash
# 自动安装 Hadoop 并配置 JAVA_HOME
set -e
HADOOP_VERSION="3.3.6"
HADOOP_INSTALL_DIR="/opt/hadoop"
echo "=== Hadoop $HADOOP_VERSION 自动安装脚本 ==="
# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
echo "❌ 请以 root 用户运行此脚本。"
exit 1
fi
# 检查 JAVA_HOME 是否设置
if [ -z "$JAVA_HOME" ]; then
echo "❌ JAVA_HOME 未设置,请先设置完整 JDK 的 JAVA_HOME"
exit 1
fi
# 检查 bin 目录下是否有 java 和 jps
if [ ! -x "$JAVA_HOME/bin/java" ] || [ ! -x "$JAVA_HOME/bin/jps" ]; then
echo "❌ JAVA_HOME 指向的目录不完整,缺少 java 或 jps,请使用完整 JDK"
exit 1
fi
# 下载 Hadoop 包(如不存在)
if [ ! -f "/tmp/hadoop-$HADOOP_VERSION.tar.gz" ]; then
echo ">>> 正在下载 Hadoop $HADOOP_VERSION..."
wget -q https://downloads.apache.org/hadoop/common/hadoop-$HADOOP_VERSION/hadoop-$HADOOP_VERSION.tar.gz -P /tmp
else
echo ">>> 已存在 /tmp/hadoop-$HADOOP_VERSION.tar.gz,跳过下载。"
fi
# 检查是否已安装 Hadoop
if [ -d "$HADOOP_INSTALL_DIR" ] || [ -d "/opt/hadoop-$HADOOP_VERSION" ]; then
echo ">>> 检测到 Hadoop 目录已存在,跳过解压步骤。"
else
echo ">>> 解压 Hadoop..."
tar -zxf /tmp/hadoop-$HADOOP_VERSION.tar.gz -C /opt/
mv -f /opt/hadoop-$HADOOP_VERSION $HADOOP_INSTALL_DIR
fi
# 写入环境变量(避免重复添加)
if ! grep -q "HADOOP_HOME" /etc/profile; then
echo ">>> 写入 /etc/profile 环境变量..."
cat >> /etc/profile <<EOF
# Hadoop 环境变量
export JAVA_HOME=$JAVA_HOME
export HADOOP_HOME=$HADOOP_INSTALL_DIR
export PATH=\$PATH:\$JAVA_HOME/bin:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin
EOF
fi
# 修改 Hadoop 的 Java 环境配置
echo ">>> 配置 hadoop-env.sh ..."
HADOOP_ENV_FILE="$HADOOP_INSTALL_DIR/etc/hadoop/hadoop-env.sh"
# 如果文件中已有 export JAVA_HOME,则更新为当前值;否则追加一行
if grep -q "^export JAVA_HOME=" "$HADOOP_ENV_FILE"; then
sed -i "s|^export JAVA_HOME=.*|export JAVA_HOME=$JAVA_HOME|" "$HADOOP_ENV_FILE"
elif grep -q "^# export JAVA_HOME=" "$HADOOP_ENV_FILE"; then
sed -i "s|^# export JAVA_HOME=.*|export JAVA_HOME=$JAVA_HOME|" "$HADOOP_ENV_FILE"
else
echo "export JAVA_HOME=$JAVA_HOME" >> "$HADOOP_ENV_FILE"
fi
# 安全加载系统环境变量
if [ -f /etc/profile ]; then
source /etc/profile || true
fi
# 测试 Hadoop 是否可用
echo ">>> 验证 Hadoop 安装..."
if hdfs version &>/dev/null; then
echo "✅ Hadoop 安装成功!"
hdfs version
else
echo "⚠️ Hadoop 安装完成,但无法运行 hdfs,请检查日志。"
fi
echo "=== Hadoop $HADOOP_VERSION 安装完成 ==="
▶️ 使用步骤
1. 确保已安装 JDK 并设置 JAVA_HOME
bash
# 示例(OpenJDK 11)
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
⚠️ 重要 :必须使用 JDK (含
jps工具),仅 JRE 会导致脚本报错!
2. 保存脚本并赋予执行权限
bash
sudo vim install_hadoop.sh
chmod +x install_hadoop.sh
3. 以 root 身份运行(关键!)
bash
sudo -E ./install_hadoop.sh
🔔 注意:使用
-E参数可保留当前用户的环境变量(尤其是JAVA_HOME),否则 sudo 会清空环境变量导致脚本失败!
4. 验证安装结果
bash
source /etc/profile # 若当前 shell 未生效
hdfs version
预期输出:
Hadoop 3.3.6
...
🔧 脚本关键技术点解析
1. sudo -E 的必要性
普通 sudo 会重置环境变量,导致 $JAVA_HOME 为空。-E 选项保留调用者的环境变量,确保脚本能读取到正确的 JDK 路径。
2. 智能修改 hadoop-env.sh
Hadoop 默认的 hadoop-env.sh 中 JAVA_HOME 是注释状态。脚本通过 sed 精准匹配三种情况:
- 已取消注释 → 直接替换
- 仍为注释 → 取消注释并赋值
- 完全不存在 → 追加新行
3. PATH 安全拼接
在 /etc/profile 中同时加入 $HADOOP_HOME/bin 和 sbin,确保 hdfs、yarn、start-dfs.sh 等命令全局可用。
❓ 常见问题解答
Q1:为什么必须用 root?
A:脚本需写入 /opt/(系统级目录)和 /etc/profile(全局环境变量),普通用户无权限。
Q2:能否用于 Hadoop 3.4.x 或 3.3.4?
A:可以!只需修改脚本开头的 HADOOP_VERSION="3.3.6" 为对应版本号(需确认 Apache 官网存在该版本)。
Q3:安装后能直接启动集群吗?
A:不能 。本脚本仅完成 单机伪分布模式的基础环境搭建。要运行 HDFS/YARN,还需手动配置:
core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xml- 格式化 NameNode:
hdfs namenode -format
✅ 总结
本脚本解决了 Hadoop 安装中最常见的两个痛点:
- 环境变量配置繁琐
hadoop-env.sh中 Java 路径未设置导致启动失败
通过自动化处理,开发者可将精力集中在 集群配置与业务开发 上,而非重复的环境搭建。
💡 建议组合使用 :
先运行 MySQL 5.7 自动安装脚本 → 再运行 Hive 自动安装脚本 → 最后运行本 Hadoop 脚本,即可快速构建 Hive + Hadoop + MySQL 元数据仓库环境!