本文带你从空白容器开始,敲命令、改配置、排错误,亲手搭出一个可用的单节点 Hadoop
为什么要手动装?
直接跑网上的 Dockerfile,成功了也不知道为什么,报错了只能干瞪眼。
先手动走一遍,Hadoop 的目录结构、配置项、启动脚本你都会门儿清。
以后再出问题,三分钟就能定位。
环境准备:你的 Mac 已经装了 Docker Desktop,并在终端里能执行 docker 命令。
一、启动空白 Ubuntu 容器并进入
docker run -it --name hadoop-temp ubuntu:24.04 bash
执行后你会发现已经进入容器的 root 终端。下面的操作全在容器内完成。
二、安装 Java 11
Hadoop 3.x 依赖 Java 8 或 11。这里装 OpenJDK 11。
apt-get update
apt-get install -y sudo openjdk-11-jdk wget vim openssh-server openssh-client net-tools
验证安装:
java -version
输出应显示 openjdk version "11.0.xx"。
注意:这里会让你选时区,一定选上海,不然 hadoop 的时间会不对;别问为啥不选北京。
三、创建 hadoop 用户并配置 SSH 免密
Hadoop 的管理脚本依赖 SSH 进行集群通信,单节点也不例外。
useradd -m hadoop -s /bin/bash
echo "hadoop:hadoop" | chpasswd
echo "hadoop ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
切换到 hadoop 用户:
su - hadoop
生成密钥并配置免密登录自己:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
测试 SSH:
# 先启动 ssh 服务
sudo service ssh start
ssh localhost exit
如果不让你输入密码就顺利退出,说明免密成功。
四、下载并解压 Hadoop 3.3.6
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -xzf hadoop-3.3.6.tar.gz
mv hadoop-3.3.6 hadoop
rm hadoop-3.3.6.tar.gz
Hadoop 主目录就是 /home/hadoop/hadoop。
五、设置环境变量
将以下内容追加到 ~/.profile:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64
export HADOOP_HOME=/home/hadoop/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HDFS_NAMENODE_USER=hadoop
export HDFS_DATANODE_USER=hadoop
export HDFS_SECONDARYNAMENODE_USER=hadoop
export YARN_RESOURCEMANAGER_USER=hadoop
export YARN_NODEMANAGER_USER=hadoop
注意:如果你的 Mac 是 Intel 芯片,JAVA_HOME 应改为 /usr/lib/jvm/java-11-openjdk-amd64。
生效:
source ~/.bashrc
六、创建 Hadoop 需要的本地目录
mkdir -p /home/hadoop/hdfs/namenode
mkdir -p /home/hadoop/hdfs/datanode
mkdir -p /home/hadoop/hadoop/logs
七、修改 Hadoop 配置文件
用 vim 打开并编辑以下四个文件(文件路径都在 $HADOOP_HOME/etc/hadoop/ 下)。
1. core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
2. hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hdfs/datanode</value>
</property>
</configuration>
3. yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>0.0.0.0</value>
</property>
</configuration>
4. mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
八、格式化 NameNode 并启动 Hadoop
确保你当前是 hadoop 用户,且已经 source 了环境变量。
hdfs namenode -format -force
看到“successfully formatted”就表示成功。
启动 HDFS 和 YARN:
start-dfs.sh
start-yarn.sh
用 jps 命令查看进程,应能看到 NameNode、DataNode、ResourceManager、NodeManager 等。
九、验证 Hadoop 是否正常工作
1. 命令行测试
hdfs dfs -mkdir /test
echo "hello hadoop" | hdfs dfs -put - /test/hello.txt
hdfs dfs -cat /test/hello.txt
能输出 hello hadoop 表示 HDFS 读写正常。
2. Web 界面
打开容器所在 Mac 的浏览器,访问:
- HDFS NameNode:
http://localhost:9870 - YARN ResourceManager:
http://localhost:8088
十、从容器外访问(端口映射)
如果你想让 Mac 本机或其他电脑访问这个 Hadoop,启动容器时要做好端口映射。
当前这个容器我们是 docker run -it 进来的,没有做映射。
可以把它保存成镜像,再重新运行。
保存当前容器为镜像:
在容器的外部终端(Mac 终端)执行:
docker commit hadoop-temp hadoop-manual:v4
用端口映射重新启动:
docker run -d --name hadoop-single1 \
-p 9870:9870 \
-p 8088:8088 \
-p 9000:9000 \
-p 2222:22 \
hadoop-manual:v1 \
tail -f /dev/null
进入这个新容器启动 Hadoop 服务:
docker exec -it hadoop-single1 su - hadoop
# 进入后
sudo service ssh start
start-dfs.sh && start-yarn.sh
现在你在 Mac 上访问 localhost:9870 就能看到 Web 界面。
十一、排错小抄
- SSH 连不上:检查
authorized_keys权限必须是600。 - NameNode 没有启动:查看日志
$HADOOP_HOME/logs/hadoop-hadoop-namenode-*.log,多数是格式化没做或目录权限问题。 - 端口冲突:如果 Mac 本机 9870 已被占用,映射时改成
-p 9871:9870 - ssh: connect to host localhost port 22: Connection refused:
SH 服务没启动。你装的 openssh-server 只是软件包,服务本身需要手动拉起来。
sudo service ssh start
看到 * Starting OpenBSD Secure Shell server sshd 就说明起来了。
然后再测试免密登录:
ssh localhost exit
- JAVA_HOME环境变量已经设置了还是无效
JAVA_HOME 已经在你当前 shell 里生效了(所以 java -version 正常),但 Hadoop 的启动脚本是通过 SSH 到 localhost 执行的,而 SSH 会话不会自动加载 ~/.bashrc 里定义的环境变量,所以报 JAVA_HOME is not set。
解决办法:把 JAVA_HOME 直接写在 Hadoop 自己的环境配置里
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
# 找到 # export JAVA_HOME= 这一行(通常在最上面),去掉 # 并改成你的真实路径
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64 # M 芯片
- 启动 hadoop 显示无效命令
环境变量在之前容器里生效过,但现在又丢了。
核心原因是:用 su - hadoop 进入时会启动一个登录 shell,它默认只加载 ~/.profile 或 ~/.bash_profile,不会自动加载 ~/.bashrc。
所以你在 ~/.bashrc 里写的那些 export 全没用上。
docker exec -it hadoop-single bash -c 'cat > /etc/profile.d/hadoop.sh << "EOF"
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64
export HADOOP_HOME=/home/hadoop/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HDFS_NAMENODE_USER=hadoop
export HDFS_DATANODE_USER=hadoop
export HDFS_SECONDARYNAMENODE_USER=hadoop
export YARN_RESOURCEMANAGER_USER=hadoop
export YARN_NODEMANAGER_USER=hadoop
EOF'
验证是否写入
docker exec hadoop-single cat /etc/profile.d/hadoop.sh
手动撸一遍,胜过读十篇教程;干起来吧,有问题欢迎留言!