超详细!关于在Docker里安装Hadoop的详细操作(部署单点集群)

(1)环境准备

已经安装好Docker,并且更新到最新版本

(2)配置本地JDK8

到官网下载对应系统版本的JDK8

Java Archive Downloads - Java SE 8u211 and laterhttps://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html

安装好后点击下载的文件进行安装,然后进行环境变量配置

查看JDK安装目录:

bash 复制代码
# 进入 JDK 安装目录
cd /Library/Java/JavaVirtualMachines
 
# 查看文件
ls
➜  jdk-1.8.jdk	jdk-11.jdk
 
# 查看路径
pwd
➜  /Library/Java/JavaVirtualMachines

配置环境变量文件:

bash 复制代码
# 进入当前用户的 home 目录
cd /Users/xxx    xxx改为自己的电脑用户名称
 
# 输入
cd ~
 
# 打开环境变量配置文件
vi ~/.bash_profile
# 注意这里用touch命令第一次配置环境变量会报错:.bash_profile does not exist.,意思需要创建文件 直接vi、vim都行。

将下述配置信息粘贴到文件中,注意JAVA_HOME替换为自己目录 上面使用pwd已经查了

bash 复制代码
# JDK Config
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home
CLASS_PATH="$JAVA_HOME/lib"
PATH="$PATH:$JAVA_HOME/bin"

然后按esc键退出编辑,输入:wq,回车就可以了

将配置生效:

bash 复制代码
# 配置文件立即生效
source ~/.bash_profile
 
# 验证:查看 JAVA_HOME 目录
echo $JAVA_HOME
 
# 查看 JDK 版本信息
java -version

返回查看版本信息,即安装成功。

(3)Docker中拉取jdk8镜像

bash 复制代码
docker pull openjdk:8-jdk 

(4)创建工作目录

在本地创建一个目录,用于存放 Dockerfile 和配置文件:

bash 复制代码
mkdir hadoop-docker
cd hadoop-docker

(5)编写 Dockerfile

hadoop-docker 目录下创建 Dockerfile 文件:

bash 复制代码
touch Dockerfile

编辑 Dockerfile,内容如下:

bash 复制代码
# 使用 OpenJDK 8 作为基础镜像
FROM openjdk:8-jdk

# 设置正确的 JAVA_HOME 路径
ENV JAVA_HOME=/usr/local/openjdk-8
ENV PATH=$JAVA_HOME/bin:$PATH

# 设置 Hadoop 版本和相关环境变量
ENV HADOOP_VERSION=3.3.6
ENV HADOOP_HOME=/usr/local/hadoop
ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 安装必要工具
RUN apt-get update && apt-get install -y \
    wget \
    ssh \
    rsync \
    vim && \
    apt-get clean

# 下载并解压 Hadoop
RUN wget https://downloads.apache.org/hadoop/common/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz && \
    tar -xzf hadoop-${HADOOP_VERSION}.tar.gz && \
    mv hadoop-${HADOOP_VERSION} ${HADOOP_HOME} && \
    rm hadoop-${HADOOP_VERSION}.tar.gz

# 配置 SSH(Hadoop 集群通信需要 SSH)
RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa && \
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \
    chmod 600 ~/.ssh/authorized_keys

# 复制 Hadoop 配置文件到镜像
COPY core-site.xml ${HADOOP_HOME}/etc/hadoop/core-site.xml
COPY hdfs-site.xml ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
COPY yarn-site.xml ${HADOOP_HOME}/etc/hadoop/yarn-site.xml
COPY mapred-site.xml ${HADOOP_HOME}/etc/hadoop/mapred-site.xml

# 暴露 Hadoop 服务端口
EXPOSE 50070 8088 9000

# 启动 SSH 服务并保持容器运行
CMD ["bash", "-c", "service ssh start && bash"]

(6)编写 Hadoop 配置文件

在当前目录下创建以下配置文件:

core-site.xml

XML 复制代码
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

hdfs-site.xml

XML 复制代码
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

yarn-site.xml

XML 复制代码
<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>localhost</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

mapred-site.xml

XML 复制代码
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

(7)构建 Docker 镜像

hadoop-docker 目录下,运行以下命令构建镜像:

bash 复制代码
docker build -t hadoop-single-node .

(8)运行 Docker 容器

创建并启动容器:

bash 复制代码
docker run -it --name hadoop-container -p 50070:50070 -p 8088:8088 -p 9000:9000 hadoop-single-node

进入容器后,按照以下步骤启动 Hadoop 服务:

1.格式化 HDFS:

bash 复制代码
hdfs namenode -format

这一步很有可能会报错,报错:找不到你的JAVA_HOME,原因是你的JDK镜像容器文件的地址可能跟你配置的Dockerfile文件中的地址不同。

这个时候你需要运行JDK8镜像容器,然后查找路径。

输入:

bash 复制代码
which java

就会输出java的路径,然后到Dockerfile文件中去修改JAVA_HOME。

再重新构建镜像:(这里要先删除镜像名称hadoop-container,使用docker 删除命令)

bash 复制代码
docker rm hadoop-container
bash 复制代码
docker build -t hadoop-single-node .

后续只需要启动就行,不用重新重建:

bash 复制代码
docker start -ai hadoop-container

2.启动 HDFS:

bash 复制代码
start-dfs.sh

在这里启动时,报错了

原因是:Hadoop 的安全配置默认禁止以 root 用户启动服务(如 namenode 和 datanode)。同时,未定义 HDFS_NAMENODE_USER、HDFS_DATANODE_USER 和 HDFS_SECONDARYNAMENODE_USER 环境变量。

解决:

在容器中创建一个新的用户(如 hadoop):

bash 复制代码
adduser hadoop

切换到 hadoop 用户:

配置环境变量

为新用户设置必要的环境变量(JAVA_HOMEHADOOP_HOME 等):

编辑用户的bashrc

直接在容器内进行追加就行

bash 复制代码
echo 'export JAVA_HOME=/usr/local/openjdk-8' >> ~/.bashrc
echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc

刷新环境变量:

bash 复制代码
source ~/.bashrc

重新格式化

后续启动容器后,就以hadoop用户进行启动hdfs

问题又来了。

这个问题的核心原因是 Hadoop 的分布式模式需要 SSH 无密码访问,而当前用户 hadoop 无法通过 SSH 无密码访问自身或 localhost。

配置 SSH 无密码访问

使用 hadoop 用户生成 SSH 密钥:

bash 复制代码
ssh-keygen -t rsa -P ""

按 Enter 使用默认路径(通常是 ~/.ssh/id_rsa)。

-P "" 表示不设置密码。

确认密钥生成成功:

bash 复制代码
ls ~/.ssh/

设置无密码访问

将公钥添加到 authorized_keys

bash 复制代码
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

设置正确的权限:

bash 复制代码
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

测试 SSH 无密码访问:

bash 复制代码
ssh localhost

成功无密码登陆localhost

配置 Hadoop 环境

确保 Hadoop 的环境变量配置正确:

编辑 hadoop-env.sh 文件:

直接在容器中追加内容:

bash 复制代码
echo 'export JAVA_HOME=/usr/local/openjdk-8' >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
echo 'export HADOOP_HOME=/usr/local/hadoop' >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh

刷新环境变量:

bash 复制代码
source ~/.bashrc

给hadoop用户配置读取/usr/local/hadoop/logs的权限问题:

切换到root用户

bash 复制代码
chown -R hadoop:hadoop /usr/local/hadoop/logs
chmod -R 755 /usr/local/hadoop/logs

重新启动hdfs

如果没有namenode,重新格式化hdfs

3.启动 YARN:

bash 复制代码
start-yarn.sh

(9)验证 Hadoop 部署

bash 复制代码
hdfs dfs -mkdir /test
hdfs dfs -ls /
相关推荐
塔克拉玛攻城狮1 分钟前
私有网盘+在线文档:内网离线搭建NextCloud+OnlyOffice详细指南
docker·在线文档·网盘
ccubee26 分钟前
docker 安装 ftp
运维·docker·容器
枫叶红花1 小时前
【Linux系统编程】:信号(2)——信号的产生
linux·运维·服务器
yaosheng_VALVE1 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king1 小时前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
启明真纳1 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
苹果醋31 小时前
SpringBoot快速入门
java·运维·spring boot·mysql·nginx
筒栗子2 小时前
复习打卡大数据篇——Hadoop HDFS 01
大数据·hadoop·hdfs
TsengOnce2 小时前
Docker 安装 禅道-21.2版本-外部数据库模式
运维·docker·容器
永卿0012 小时前
nginx学习总结(不包含安装过程)
运维·nginx·负载均衡