在 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 容器,命名为 datanode1
、datanode2
、datanode3
等等:
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
侵删