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