用 Docker 装 Hadoop,看这篇就够了

0 阅读4分钟

本文带你从空白容器开始,敲命令、改配置、排错误,亲手搭出一个可用的单节点 Hadoop

img

为什么要手动装?

直接跑网上的 Dockerfile,成功了也不知道为什么,报错了只能干瞪眼。

先手动走一遍,Hadoop 的目录结构、配置项、启动脚本你都会门儿清。

以后再出问题,三分钟就能定位。

环境准备:你的 Mac 已经装了 Docker Desktop,并在终端里能执行 docker 命令。

一、启动空白 Ubuntu 容器并进入

docker run -it --name hadoop-temp ubuntu:24.04 bash

执行后你会发现已经进入容器的 root 终端。下面的操作全在容器内完成。

img

二、安装 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"

img

注意:这里会让你选时区,一定选上海,不然 hadoop 的时间会不对;别问为啥不选北京。

img

三、创建 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

img

测试 SSH:

# 先启动 ssh 服务
sudo service ssh start
ssh localhost exit

如果不让你输入密码就顺利退出,说明免密成功。

img

四、下载并解压 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

img

五、设置环境变量

将以下内容追加到 ~/.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

img

六、创建 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>

img

八、格式化 NameNode 并启动 Hadoop

确保你当前是 hadoop 用户,且已经 source 了环境变量。

hdfs namenode -format -force

看到“successfully formatted”就表示成功。

img

启动 HDFS 和 YARN:

start-dfs.sh
start-yarn.sh

jps 命令查看进程,应能看到 NameNode、DataNode、ResourceManager、NodeManager 等。

img

九、验证 Hadoop 是否正常工作

1. 命令行测试

hdfs dfs -mkdir /test
echo "hello hadoop" | hdfs dfs -put - /test/hello.txt
hdfs dfs -cat /test/hello.txt

能输出 hello hadoop 表示 HDFS 读写正常。

img

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 界面。

img

十一、排错小抄

  • 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环境变量已经设置了还是无效

img

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 显示无效命令

img

环境变量在之前容器里生效过,但现在又丢了。

核心原因是:用 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

手动撸一遍,胜过读十篇教程;干起来吧,有问题欢迎留言!