DJ王大海

Back

通过容器搭建伪分布式 Hadoop 环境Blur image

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

Podman 的安装#

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

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

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

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

新增如下内容:

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

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

构建镜像#

克隆仓库:

Invisibox / Hadoop-docker-compose

Waiting for api.github.com...

???
???
???
?????
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
bash

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"]
docker

./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
sh

切换到项目目录,下载必要的软件包:

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 ..
bash

构建镜像并启动容器:

使用 Podman:

podman-compose up -d
bash

或使用 Docker:

docker-compose up -d
bash

访问服务#

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

运行容器#

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

数据持久化#

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

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

用户信息#

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

通过容器搭建伪分布式 Hadoop 环境
https://vaoo.cc/blog/2025/hadoop-podman
Author 小岛秀儿
Published at 2025年4月4日
Comment seems to stuck. Try to refresh?✨