当前位置: 首页 > article >正文

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

(1)环境准备

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

(2)配置本地JDK8

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

Java Archive Downloads - Java SE 8u211 and latericon-default.png?t=O83Ahttps://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html

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

查看JDK安装目录:

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

配置环境变量文件:

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

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

# 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,回车就可以了

将配置生效:

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

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

(3)Docker中拉取jdk8镜像

docker pull openjdk:8-jdk 

(4)创建工作目录

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

mkdir hadoop-docker
cd hadoop-docker

(5)编写 Dockerfile

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

touch Dockerfile

编辑 Dockerfile,内容如下:

# 使用 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

<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>

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>
</configuration>

mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

(7)构建 Docker 镜像

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

docker build -t hadoop-single-node .

(8)运行 Docker 容器

创建并启动容器:

docker run -it --name hadoop-container -p 50070:50070 -p 8088:8088 -p 9000:9000 hadoop-single-node

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

1.格式化 HDFS:

hdfs namenode -format

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

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

输入:

which java

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

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

docker rm hadoop-container
docker build -t hadoop-single-node .

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

docker start -ai hadoop-container

2.启动 HDFS:

start-dfs.sh

在这里启动时,报错了

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

解决:

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

adduser hadoop

切换到 hadoop 用户:

配置环境变量

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

编辑用户的bashrc

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

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

重新格式化
后续启动容器后,就以hadoop用户进行启动hdfs

问题又来了。

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

配置 SSH 无密码访问

使用 hadoop 用户生成 SSH 密钥:

ssh-keygen -t rsa -P ""

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

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

确认密钥生成成功:

ls ~/.ssh/

设置无密码访问

将公钥添加到 authorized_keys

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

设置正确的权限:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

测试 SSH 无密码访问:

ssh localhost

成功无密码登陆localhost

配置 Hadoop 环境

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

编辑 hadoop-env.sh 文件:

直接在容器中追加内容:

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用户

chown -R hadoop:hadoop /usr/local/hadoop/logs
chmod -R 755 /usr/local/hadoop/logs

重新启动hdfs

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

3.启动 YARN:

start-yarn.sh

(9)验证 Hadoop 部署

  • 访问 HDFS Web 界面

    • 打开浏览器,访问 http://localhost:50070
  • 访问 YARN Web 界面

    • 打开浏览器,访问 http://localhost:8088
  • 测试 Hadoop 命令: 在容器中运行以下命令验证:

  • hdfs dfs -mkdir /test
    hdfs dfs -ls /
    


http://www.kler.cn/a/427830.html

相关文章:

  • arkts bridge使用示例
  • 仿真设计|基于51单片机的温室环境监测调节系统
  • [Collection与数据结构] B树与B+树
  • LigerUI在MVC模式下的响应原则
  • 【C++】类与对象(下)
  • WGCLOUD服务器资源监控软件使用笔记 - Token is error是什么错误
  • Python 中的魔法方法有哪些?
  • el-table expand-row-keys默认展开,数据更新后默认展开的问题
  • 如何使用apache部署若依前后端分离项目
  • AWS Fargate + Cloud Map + Prometheus 实现 JVM 监控方案详解
  • 控制访问权限
  • 【QT】一个简单的串口通信小工具(QSerialPort实现)
  • C/C++基础知识复习(40)
  • 响应式布局:登录界面
  • Qt Window应用程序去掉控制台窗口
  • K8S对接ceph的RBD块存储
  • 在Ubuntu-22.04 [WSL2]中配置Docker
  • go get依赖包失败,502 Bad gateway
  • C++ String(字符串)和 int(整数) 互转
  • idea连接到docker出现 org.apache.hc.client5.http.ConnectTimeoutException 异常怎么办?
  • 【教程】创建NVIDIA Docker共享使用主机的GPU
  • 网页端五子棋对战(四)---玩家匹配实现上线下线处理
  • Devtools 的作用?
  • 更新危机bug
  • 网络命令配置
  • git强制覆盖本地更改