如何使用 docker 搭建 hadoop 分布式集群?

原创
2023/03/03 16:56
阅读数 2.7K

在 Docker 中搭建 Hadoop 分布式集群,可以按照以下步骤进行操作:

1 安装 Docker

首先需要在操作系统中安装 Docker,具体步骤可以参考官方文档,这里不再赘述。

2 创建 Docker 镜像

在 Docker 中创建 Hadoop 镜像,可以通过编写 Dockerfile 文件,然后使用 docker build 命令构建镜像。

以下是一个示例 Dockerfile:


FROM ubuntu:18.04

RUN apt-get update && apt-get install -y wget ssh openjdk-8-jdk

RUN wget https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz \
    && tar -xzvf hadoop-3.3.1.tar.gz \
    && mv hadoop-3.3.1 /usr/local/hadoop \
    && rm hadoop-3.3.1.tar.gz

ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
ENV HADOOP_HOME=/usr/local/hadoop
ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

COPY config/* /usr/local/hadoop/etc/hadoop/

RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa && \
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \
    chmod 0600 ~/.ssh/authorized_keys

CMD [ "sh", "-c", "service ssh start; bash"]

其中:

  • FROM 指定使用的基础镜像,这里选择的是 Ubuntu 18.04。
  • RUN 指定在容器中执行的命令,这里安装了 wget、SSH 和 JDK,并下载和解压了 Hadoop 软件包。
  • ENV 设置环境变量,指定了 Java 和 Hadoop 的安装路径,以及将 Hadoop 的二进制文件添加到 PATH 环境变量中。
  • COPY 将本地的配置文件复制到容器中,这里将 Hadoop 的配置文件复制到容器中。
  • RUN 执行 SSH 相关的命令,生成 SSH 密钥,将公钥添加到授权列表中,以便容器间可以相互通信。
  • CMD 指定容器启动后执行的命令,这里启动 SSH 服务,并进入到交互式 Shell。

在 Dockerfile 所在的目录中执行以下命令可以构建 Docker 镜像:

docker build -t hadoop .

其中 hadoop 是镜像的名称,可以根据实际情况进行修改。

3 创建 Docker 容器

在创建了 Hadoop 镜像之后,需要在 Docker 中创建多个容器,模拟 Hadoop 分布式集群。

首先创建一个 Hadoop 的 Namenode 容器,命名为 namenode

docker run -d -p 50070:50070 -p 9000:9000 --name namenode hadoop

其中:

  • -d 参数指定容器在后台运行。
  • -p 参数指定容器的端口映射,将容器内的端口映射到主机上,这里将 Namenode 的 Web UI 端口 50070 和 HDFS 端口 9000 映射到主机的对应端口上。
  • --name 参数指定容器的名称。
  • hadoop 参数指定使用的镜像名称。

接着创建多个 Hadoop 的 Datanode 容器,命名为 datanode1datanode2datanode3 等等:

docker run -d --name datanode1 hadoop
docker run -d --name datanode2 hadoop
docker run -d --name datanode3 hadoop
可以在运行命令中通过  --link  参数将多个容器连接起来,但这种方法已经过时,推荐使用 Docker 的网络功能进行连接。以下是通过 Docker 网络进行连接的示例:
docker network create hadoop

docker run -d --network hadoop --name namenode -p 50070:50070 -p 9000:9000 hadoop

docker run -d --network hadoop --name datanode1 hadoop
docker run -d --network hadoop --name datanode2 hadoop
docker run -d --network hadoop --name datanode3 hadoop

其中:

  • docker network create hadoop 创建名为 hadoop 的 Docker 网络。
  • --network hadoop 参数指定使用 hadoop 网络。
  • --name 参数指定容器的名称。

4 配置 Hadoop

在创建好容器之后,需要对 Hadoop 进行一些配置,以使其能够在分布式集群中正常工作。

首先需要进入 Namenode 容器,运行以下命令:

docker exec -it namenode bash

接着进入 Hadoop 的配置目录,执行以下命令:

cd $HADOOP_HOME/etc/hadoop/

修改 hdfs-site.xml 文件,添加以下配置:

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/data/dfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/data/dfs/datanode</value>
    </property>
</configuration>

这里设置了 HDFS 的副本数为 3,以及 Namenode 和 Datanode 的数据存储目录。

接着修改 core-site.xml 文件,添加以下配置:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://namenode:9000</value>
    </property>
</configuration>

这里指定了 Hadoop 的默认文件系统为 HDFS,使用的是 Namenode 的地址和端口。

最后修改 workers 文件,将 Datanode 的主机名或 IP 地址添加进去:

datanode1
datanode2
datanode3

这里使用容器的名称作为主机名,因为容器之间可以直接通过名称进行通信。

5 启动 Hadoop

在配置好 Hadoop 之后,可以启动集群。首先需要进入 Namenode 容器,运行以下命令启动 Hadoop:

cd $HADOOP_HOME/sbin
./start-dfs.sh

这里启动了 HDFS。 接着可以运行以下命令查看集群状态:

jps

输出应该包含以下进程:

NameNode
DataNode
SecondaryNameNode

这表明集群已经成功启动了。

6 运行示例程序

最后可以运行 Hadoop 的示例程序,以确保集群能够正常工作。以下是一个简单的示例,统计一段文本中每个单词出现的次数:

cd $HADOOP_HOME
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount input output

这里使用 Hadoop 的 `wordcount` 程序,将输入文件路径设置为 `input` 目录,将输出文件路径设置为 `output` 目录。 运行结束后可以查看输出目录中的结果:

hdfs dfs -cat output/*

这里使用 Hadoop 自带的 `hdfs` 命令,将输出目录中的所有文件合并并输出到控制台上。 至此,已经成功使用 Docker 搭建了一个 Hadoop 分布式集群,并运行了示例程序。


 

作者:自在的影片分享
原文链接:https://www.zhihu.com/question/585587113/answer/2918926588
侵删

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
2 收藏
0
分享
返回顶部
顶部