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
内容如下,可根据自身需求进行修改:
# 以 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
启动脚本,这里可以根据你的实际需求微调:
#!/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:
或使用 Docker:
访问服务#
构建完成后,可通过以下地址访问各服务:
运行容器#
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。