docker单点安装Hadoop

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 .

几个端口的作用:

端口号服务/用途说明
9870HDFS NameNode Web UINameNode 的 Web 界面,显示 HDFS 文件系统状态、存储信息等,默认端口是 9870。访问地址示例:http://localhost:9870
8088YARN ResourceManager Web UIResourceManager 的 Web 界面,展示集群资源、作业状态、队列等,默认端口是 8088。访问地址示例:http://localhost:8088
9000HDFS NameNode RPC 端口NameNode 的 RPC 服务端口,用于客户端和 DataNode 连接 NameNode(实际存储和访问通信端口),配置文件 core-site.xmlfs.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、在容器中追加环境变量

重新进入容器:

docker exec -it hadoop /bin/bash

先切换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:8088 发现

测试创建一个文件夹:

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安装hadoop https://blog.csdn.net/ffhhsxvhh/article/details/144215118

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乄bluefox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值