1、Docker中拉取jdk8镜像
拉取镜像
docker pull openjdk:8-jdk
查看jdk
docker run -it openjdk:8-jdk bash
which java
2、安装ubuntu源
拉取镜像
docker pull ubuntu:22.04
保存
docker save -o ubuntu-22.04.tar.gz ubuntu:22.04
移动到自己想要的目录
mv /root/ubuntu-22.04.tar.gz /www/wwwroot/hadoop/docker-files/
3、准备Hadoop所需配置
hadoop3.4.1的下载链接:
https://downloads.apache.org/hadoop/common/hadoop-3.4.1/hadoop-3.4.1.tar.gz
目录结构简图:
/www/wwwroot/hadoop
│
├── conf
│ ├── core-site.xml
│ ├── hdfs-site.xml
│ ├── mapred-site.xml
│ └── yarn-site.xml
│
├── docker-files
│ ├── hadoop-3.4.1.tar.gz
│ └── ubuntu-22.04.tar.gz
│
└── Dockerfile
Dockerfile:
注意开放这几个端口:9870 8088 9000,并且注意刚刚jdk的路径
# 使用 OpenJDK 8(基于 Debian)
FROM openjdk:8-jdk# 设置 JAVA_HOME,改为实际路径
ENV JAVA_HOME=/usr/local/openjdk-8
ENV PATH=$JAVA_HOME/bin:$PATH# 设置 Hadoop 版本和环境变量
ENV HADOOP_VERSION=3.4.1
ENV HADOOP_HOME=/usr/local/hadoop
ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin# 更换为阿里云 Debian 镜像源并安装必要工具
RUN echo 'deb http://mirrors.aliyun.com/debian/ bullseye main contrib non-free' > /etc/apt/sources.list && \echo 'deb http://mirrors.aliyun.com/debian/ bullseye-updates main contrib non-free' >> /etc/apt/sources.list && \echo 'deb http://mirrors.aliyun.com/debian/ bullseye-backports main contrib non-free' >> /etc/apt/sources.list && \echo 'deb http://mirrors.aliyun.com/debian-security/ bullseye-security main contrib non-free' >> /etc/apt/sources.list && \apt-get update && \apt-get install -y wget ssh rsync vim && \apt-get clean && \rm -rf /var/lib/apt/lists/*# 创建工作目录
RUN mkdir -p /data/hadoop# 复制本地 Hadoop 压缩包到容器内
COPY docker-files/hadoop-${HADOOP_VERSION}.tar.gz /tmp/# 解压 Hadoop 到指定目录
RUN tar -xzf /tmp/hadoop-${HADOOP_VERSION}.tar.gz -C /usr/local/ && \mv /usr/local/hadoop-${HADOOP_VERSION} ${HADOOP_HOME} && \rm /tmp/hadoop-${HADOOP_VERSION}.tar.gz# 配置 SSH(用于启动 Hadoop)
RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa && \cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \chmod 600 ~/.ssh/authorized_keys# 拷贝配置文件
COPY conf/core-site.xml ${HADOOP_HOME}/etc/hadoop/core-site.xml
COPY conf/hdfs-site.xml ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
COPY conf/yarn-site.xml ${HADOOP_HOME}/etc/hadoop/yarn-site.xml
COPY conf/mapred-site.xml ${HADOOP_HOME}/etc/hadoop/mapred-site.xml# 暴露 Hadoop 服务端口
EXPOSE 9870 8088 9000# 启动 SSH 服务并保持容器运行
CMD ["bash", "-c", "service ssh start && bash"]
core-site.xml:
<configuration><property><name>fs.defaultFS</name><value>hdfs://localhost:9000</value></property>
</configuration>
hdfs-site.xml:
<configuration><property><name>dfs.replication</name><value>1</value></property>
</configuration>
mapred-site.xml:
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property><property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value></property><property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value></property><property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value></property>
</configuration>
yarn-site.xml:
<configuration><property><name>yarn.resourcemanager.hostname</name><value>localhost</value></property><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.resourcemanager.webapp.address</name><value>0.0.0.0:8088</value></property>
</configuration>
4、构建 Docker 镜像
先进入对应的目录:
cd /www/wwwroot/hadoop
构建:
docker build -t hadoop-single-node .
几个端口的作用:
端口号 | 服务/用途 | 说明 |
---|---|---|
9870 | HDFS NameNode Web UI | NameNode 的 Web 界面,显示 HDFS 文件系统状态、存储信息等,默认端口是 9870。访问地址示例:http://localhost:9870 |
8088 | YARN ResourceManager Web UI | ResourceManager 的 Web 界面,展示集群资源、作业状态、队列等,默认端口是 8088。访问地址示例:http://localhost:8088 |
9000 | HDFS NameNode RPC 端口 | NameNode 的 RPC 服务端口,用于客户端和 DataNode 连接 NameNode(实际存储和访问通信端口),配置文件 core-site.xml 中 fs.defaultFS 常使用此端口,如 hdfs://localhost:9000 |
5、启动docker
docker run -it --name hadoop -p 9870:9870 -p 8088:8088 -p 9000:9000 hadoop-single-node
6、格式化 HDFS:
hdfs namenode -format
7、退出容器重新构建镜像
exit
如果容器正在进行就stop,没的话就直接rm
docker stop hadoop
docker rm hadoop
cd /www/wwwroot/hadoop
docker build -t hadoop-single-node .
docker run -it --name hadoop -p 9870:9870 -p 8088:8088 -p 9000:9000 hadoop-single-node
8、容器里面创建新的用户
adduser hadoop
这里为了方便密码我就设置为:
qwer1234
不然使用后续使用start-dfs.sh会报错:
切换用户 :
su - hadoop
9、配置环境变量
依次执行下面的命令
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
刷新环境变量:
source ~/.bashrc
10、给Hadoop用户生成 SSH 密钥对
生成 SSH 密钥对(如果还没有的话):
ssh-keygen -t rsa -P ''
然后回车就好
将生成的公钥添加到授权密钥文件中:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
设置正确的权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
测试 SSH 无密码登录:
ssh localhost
AI纯享[狗头]:
11、在容器中追加环境变量
先切换root用户给对应文件赋予权限
chown hadoop:hadoop /usr/local/hadoop/etc/hadoop/hadoop-env.sh
切换回 hadoop
用户:
su - hadoop
依次执行
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
刷新环境变量:
source ~/.bashrc
给hadoop用户配置读取/usr/local/hadoop/logs的权限问题,继续切换回root用户:
mkdir -p /usr/local/hadoop/logs
chown -R hadoop:hadoop /usr/local/hadoop/logs
chmod -R 755 /usr/local/hadoop/logs
12、重新启动yarn
start-yarn.sh
会发现无法使用jps,给hadoop用户jps权限:
切换会root用户:
查看jps目前只有哪个用户可以使用:
ls -l /usr/local/openjdk-8/bin/jps
修改权限:
chmod +x /usr/local/openjdk-8/bin/jps
chown hadoop:hadoop /usr/local/openjdk-8/bin/jps
再次查看:
可能你还会发现jps执行不了,可以去检查一下这个文件:
vi ~/.bashrc
在最后添加或者检查最后是不是这个:
export JAVA_HOME=/usr/local/openjdk-8
export HADOOP_HOME=/usr/local/hadoop
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
然后esc,输出:w保存然后:q退出
刷新配置:
source ~/.bashrc
继续jps:
会发现没有namenode,重新格式化一下再启动:
hdfs namenode -format
然后重新启动:
start-dfs.sh
13、启动成功
检查(具体localhost替换成你的服务器IP):
localhost:9870 发现
localhost:9870 发现
测试创建一个文件夹:
hdfs dfs -mkdir /test
hdfs dfs -ls /
14、关于博主遇到的bug和 停止和启动hadoop 指令
关于怎么去停止和启动hadoop:
docker exec -it hadoop /bin/bash
su - hadoop
cd /usr/local/hadoop
sbin/stop-all.sh
sbin/start-all.sh
或者:
$HADOOP_HOME/sbin/stop-yarn.sh
$HADOOP_HOME/sbin/start-yarn.sh
为啥会需要这些呢,因为我之前以为前面的配置问题导致一些xml文件配置有些问题,无法展示8088和9000的界面,不过9000是rpc的通信界面,用localhost也行,毕竟这个也是docker本地腾讯,后期通过手动修改配置文件在容器里面vim他们,然后就需要进行重新启动。
修改的过程大概是这样子:
15、参考
超详细!关于在Docker里安装Hadoop的详细操作(部署单点集群)_docker安装hadoop-CSDN博客文章浏览阅读2.6k次,点赞21次,收藏22次。同时,未定义 HDFS_NAMENODE_USER、HDFS_DATANODE_USER 和 HDFS_SECONDARYNAMENODE_USER 环境变量。这个问题的核心原因是 Hadoop 的分布式模式需要 SSH 无密码访问,而当前用户 hadoop 无法通过 SSH 无密码访问自身或 localhost。这一步很有可能会报错,报错:找不到你的JAVA_HOME,原因是你的JDK镜像容器文件的地址可能跟你配置的Dockerfile文件中的地址不同。这个时候你需要运行JDK8镜像容器,然后查找路径。_docker安装hadoophttps://blog.csdn.net/ffhhsxvhh/article/details/144215118