

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 的国内代理都不是很稳定,本文就不进行相关的配置了。
构建镜像#
新建 Hadoop
文件夹:
mkdir hadoop && cd hadoop
bash创建 Dockerfile
:
Dockerfile
# 以 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并在同级目录下放置 start.sh
启动脚本,这里可以根据你的实际需求微调:
start.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构建镜像:
podman build -t hadoop:3.3.2 .
bash运行容器#
podman run -d -p 22:22 -p 9870:9870 -p 8088:8088 --name my-hadoop hadoop:3.3.2
bash这样就可以使用刚刚构建好的镜像来运行容器,还可以在宿主机端口上访问对应 UI(如:http://localhost:9870 ↗ 访问 NameNode UI)。