> ## Content Index
> Fetch the complete content index at: https://djdog.cc/llms.txt
> Use this file to discover other available public pages before exploring further.

# 通过容器搭建伪分布式 Hadoop 环境
- URL: https://djdog.cc/blog/2025/hadoop-podman/
- Published: 2025-04-04T12:25:54.000Z
- Updated: 2026-09-24T14:37:17.000Z
- Description: 更加方便快捷地构建 Hadoop 环境
- Author: DJDOG
- Tags: Container, Linux, #toc

Hadoop 是一个开源框架，它使用分布式存储和并行处理来管理和处理大量数据。它主要用于解决海量数据的存储与计算问题。这里演示一下如何在 Podman 容器中简单地部署 Hadoop 环境。

## Podman 的安装

Podman 背靠 Redhat，各大发行版的仓库中几乎都有，所以直接用包管理器安装即可。

但由于 Podman 在拉取镜像时，不能省略前面的 `docker.io/` 前缀，每次都手动添加当然也是可以的，但这里还是推荐在 podman config file 里设置好。

修改全局或是用户的 config file：

```bash
sudo nvim /etc/containers/registries.conf # 全局
nvim ~/.config/containers/registries.conf # 用户

```

新增如下内容：

```
unqualified-search-registries = ["docker.io"]

```

由于一些众所周知的原因，目前 Docker 的国内代理都不是很稳定，本文就不进行相关的配置了。

## 构建镜像

克隆仓库：

[Invisibox/Hadoop-docker-composeGitHub repositoryGitHub](https://github.com/Invisibox/Hadoop-docker-compose?ref=djdog.cc)

```bash
git clone https://github.com/Invisibox/Hadoop-docker-compose.git

```

项目树状结构如下：

```bash
❯ tree
.
├── config
│   ├── hadoop
│   │   ├── core-site.xml
│   │   ├── hadoop-env.sh
│   │   ├── hdfs-site.xml
│   │   └── workers
│   └── hbase
│       ├── hbase-env.sh
│       └── hbase-site.xml
├── Containerfile
├── docker-compose.yml
├── LICENSE
├── README.md
└── scripts
    └── entrypoint.sh

5 directories, 11 files

```

`Containerfile` 内容如下，可根据自身需求进行修改：

#### Containerfile

\# 以 Ubuntu 20.04 作为基础镜像  
FROM ubuntu:20.04  
  
\# 环境变量：非交互安装  
ENV DEBIAN\_FRONTEND=noninteractive  
  
\# 更新并安装基础依赖  
\# 1\. openssh-server：SSH服务  
\# 2\. openjdk-8-jdk：Java 8（Hadoop通常与Java 8配合得更好）  
\# 3\. vim、curl、wget 等常用工具（可按需添加或删除）  
RUN apt-get update && \\  
 apt-get install -y --no-install-recommends \\  
 openssh-server \\  
 openjdk-8-jdk \\  
 vim \\  
 ssh \\  
 rsync \\  
 curl \\  
 wget \\  
 && rm -rf /var/lib/apt/lists/\*  
  
\# 设置 JAVA\_HOME  
ENV JAVA\_HOME /usr/lib/jvm/java-8-openjdk-amd64  
  
\# 创建运行Hadoop的用户 hadoop，并设置家目录  
RUN useradd -m -s /bin/bash hadoop  
  
\# 设置 hadoop 用户的环境变量  
RUN echo 'export HADOOP\_HOME=/usr/local/hadoop' >> /home/hadoop/.profile && \\  
 echo 'export PATH=$PATH:$HADOOP\_HOME/bin:$HADOOP\_HOME/sbin' >> /home/hadoop/.profile  
  
\# 下载并解压 Hadoop （示例以 3.3.2 为例，链接请自行替换为你需要的版本）  
WORKDIR /usr/local  
RUN wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.2/hadoop-3.3.2.tar.gz && \\  
 tar -xzf hadoop-3.3.2.tar.gz && \\  
 mv hadoop-3.3.2 hadoop && \\  
 rm -f hadoop-3.3.2.tar.gz  
  
\# 设置 Hadoop 环境变量  
ENV HADOOP\_HOME=/usr/local/hadoop  
ENV PATH=$PATH:$HADOOP\_HOME/bin:$HADOOP\_HOME/sbin  
  
\# 设置 Hadoop 的 JAVA\_HOME  
RUN echo "export JAVA\_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> $HADOOP\_HOME/etc/hadoop/hadoop-env.sh  
  
\# 准备 SSH 目录，并配置 SSH 无密码登录（在容器内使用 su - hadoop 执行集群脚本）  
RUN mkdir /var/run/sshd  
\# 为 hadoop 用户生成 SSH Key 并配置无密码登录  
\# 注意：此处只在容器内部无密码互联，真实生产环境下不要用这种方法暴露SSH  
RUN mkdir -p /home/hadoop/.ssh && \\  
 chown -R hadoop:hadoop /home/hadoop/.ssh && \\  
 chmod 700 /home/hadoop/.ssh && \\  
 \\  
 \# 以 hadoop 用户身份生成密钥  
 su - hadoop -c "ssh-keygen -t rsa -P '' -f /home/hadoop/.ssh/id\_rsa" && \\  
 \\  
 \# 将公钥加入 authorized\_keys  
 cat /home/hadoop/.ssh/id\_rsa.pub >> /home/hadoop/.ssh/authorized\_keys && \\  
 chmod 600 /home/hadoop/.ssh/authorized\_keys  
  
\# 拷贝自定义脚本 start.sh 到 /usr/local/bin，并赋予执行权限  
COPY start.sh /usr/local/bin/start.sh  
RUN chmod +x /usr/local/bin/start.sh  
  
\# 暴露常见的 Hadoop 端口（可根据需求增减）  
\# 22：SSH  
\# 9870：NameNode Web UI (Hadoop 3.x)  
\# 8088：ResourceManager Web UI  
\# 8020 / 9000：HDFS 交互端口  
EXPOSE 22 9870 8088 8020 9000  
  
\# 启动容器默认执行 start.sh  
CMD \["/usr/local/bin/start.sh"\]  

在 `./scripts` 目录下存有 `entrypoint.sh` 启动脚本，这里可以根据你的实际需求微调：

#### entrypoint.sh

#!/bin/bash  
  
\# ==========  
\# start.sh  
\# ==========  
  
\# 1\. 如果尚未生成 SSH Host Key，则生成（容器首次启动时需要）  
if \[ ! -f /etc/ssh/ssh\_host\_rsa\_key \]; then  
 ssh-keygen -A  
fi  
  
\# 2\. 启动SSH服务  
/usr/sbin/sshd  
  
\# 3\. 根据配置环境变量设置 Namenode 的存储目录（可自行修改）  
\# 也可以在 core-site.xml/hdfs-site.xml 配置 dfs.namenode.name.dir = /data/hdfs/namenode  
\# 这里只是示例做法：如果不存在 VERSION 文件，说明未格式化过，需要进行格式化  
HDFS\_NAME\_DIR=${HDFS\_NAME\_DIR:-/data/hdfs/namenode}  
if \[ ! -f "$HDFS\_NAME\_DIR/current/VERSION" \]; then  
 echo "===> Detected namenode not formatted. Now formatting..."  
 su - hadoop -c "hdfs namenode -format -force"  
fi  
  
\# 4\. 启动 HDFS 和 YARN  
echo "===> Starting HDFS..."  
su - hadoop -c "$HADOOP\_HOME/sbin/start-dfs.sh"  
  
echo "===> Starting YARN..."  
su - hadoop -c "$HADOOP\_HOME/sbin/start-yarn.sh"  
  
\# 5\. （可选）让容器日志输出 Hadoop 日志文件，方便观察  
\# 如果你习惯在容器里 bash 进入查看日志，也可以改成 tail -f /dev/null  
echo "===> Tail Hadoop logs (Press Ctrl+C to stop tail in foreground)..."  
tail -F $HADOOP\_HOME/logs/\*.log  

切换到项目目录，下载必要的软件包：

```bash
cd Hadoop-docker-compose

mkdir -p packages
cd packages

# 下载Java 1.8 JDK
wget https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.gz

# 下载Hadoop 3.3.6
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz

# 下载HBase 2.5.11
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.5.11/hbase-2.5.11-hadoop3-bin.tar.gz

cd ..

```

构建镜像并启动容器：

使用 Podman:

```bash
podman-compose up -d

```

或使用 Docker:

```bash
docker-compose up -d

```

## 访问服务

构建完成后，可通过以下地址访问各服务：

- HDFS Web UI: [http://localhost:9870](http://localhost:9870/?ref=djdog.cc)
- YARN Web UI: [http://localhost:8088](http://localhost:8088/?ref=djdog.cc)
- HBase Web UI: [http://localhost:16010](http://localhost:16010/?ref=djdog.cc)

## 运行容器

```bash
podman exec -it hadoop-hbase bash
# 或
docker exec -it hadoop-hbase bash

```

## 数据持久化

数据通过 Docker volumes 进行持久化：

- hadoop-data: `/usr/local/hadoop/tmp`
- hbase-data: `/usr/local/hbase/data`

## 用户信息

容器默认使用 hadoop 用户，密码 hadoop，可无密码执行 sudo。