如何使用Docker和Docker compose设置容器并测试单个Hadoop集群

9,784 阅读10分钟

使用Docker和Docker compose设置容器并测试单个Hadoop集群

Hadoop框架有助于处理和分析大数据。Hadoop框架使用一个计算机硬件集群有效地存储和处理大量的任何数据。

前提条件

本文假设你有一些使用容器化技术的基本和背景知识,如使用Docker运行和管理容器。了解大数据的作用也是至关重要的,因为这正是Hadoop所要实现的。

什么是Hadoop集群?

我们可以将Hadoop集群归类为计算机集群的一个子集。它是为了容纳和分析大量的非结构化和结构化数据。并行处理、负载平衡和容错都是集群的常见用途。

Hadoop集群的功能类似于一个计算机集群。一个计算机集群是一个链接的计算机集合,作为一个单一的系统运行。更多的力量可以通过这种方式相对容易地添加到集群中。你只需在网络上添加一台新的计算机。

Hadoop生态系统包括三个主要组件,它们被设计用来专门处理大数据。

hadoop-ecosystem

这些组件是

1.Hadoop分布式文件系统(HDFS)

HDFS是一个存储单元,有助于在许多计算机之间分配数据,并以块的形式存储。

hdfs-architecture

图片来源。Hadoop Apache

Hadoop框架将数据细分为多个小块,并将每个区段存储在集群内自己的节点上。

hdfs-datanodes

假设你有大约4兆字节的数据。HDFS会将数据分割成多个数据块,然后将数据存储在Hadoop集群的几个数据节点中。

以每个块(节点)分配128兆字节作为默认大小。在磁盘上存储这些数据所需的时间会大大减少。这样一来,在磁盘上存储这些数据的总时间将与在单个块中存储数据的时间相同。

然后,HDFS将使用复制方法,将每个数据节点复制到集群内存在的其他机器上。这使得HDFS具有容错性,确保即使其中一个数据节点发生故障,也不会丢失数据。

2.MapReduce

MapReduce将数据分成几块,并在不同的数据节点上分别处理每一块。之后,各个结果被合并,产生最终的输出。

下图显示了Hadoop MapReduce的架构和HDFS中MapReduce作业的流程。

map-reduce-architecture

mapreduce-flow-diagram

3.另一个资源协商器(YARN)

YARN管理集群内的资源。一个资源管理器、一个节点管理器、一个应用程序主控器和容器组成了这个系统。Hadoop集群的资源是由资源管理器分配的。

节点管理器负责节点并跟踪其资源使用情况。物理资源的集合被保存在容器中。应用程序使用YARN从节点管理器中请求容器。节点管理器收到资源后,会将其发送给资源管理器。这样,YARN管理Hadoop集群资源并处理作业请求。

yarn-architecture

注意:除了上面列出的组件外,Hadoop生态系统还包括一系列其他组件。

什么是Docker和Docker容器?

容器是一种将应用程序打包的方式,包内有它们所需的一切,包括运行它所需的依赖和配置。此外,该包像其他人工制品一样是可移植的,可以很容易地在相关团队之间共享和移动。

Docker是一个开源的容器解决方案,它允许你将一个应用程序和它的依赖物装入Docker容器,用于开发和部署目的。

一个Docker容器是一个预先配置好的环境,包括在里面运行的应用程序的所有必要安装。每个容器都有一个正在运行的应用程序,每个容器都运行在Docker引擎上,而Docker引擎又运行在主机操作系统之上。

docker-container

Docker容器使用Docker容器镜像将一个应用程序容器化。对于每个应用程序,都有一个官方的Docker容器镜像,你可以用它来容器化你的应用程序依赖和可执行文件。

docker-architecture

设置Docker和docker-compose

要使用Docker设置这个单一的Hadoop集群,确保Docker已经安装在你的电脑上。运行以下命令以确保Docker已经被设置为运行docker-compose。

  • 要检查Docker,请运行。
docker --version

如果Docker设置好了,输出结果应该类似于。

docker-version-reponse

  • 要检查docker-compose,请运行。
docker-compose --version

如果Docker有docker-compose的良好设置,输出应该类似于。

docker-compose-version-response

注意:版本号可能不同,这取决于你电脑上安装的Docker版本。

检查Docker是否在你的系统上正常工作,如果你有的话,就检查目前正在运行的容器。运行下面的命令来做。

docker ps

如果你有一个正在运行的容器,它将被记录下来并列在命令输出中。由于我的系统上目前没有任何Docker容器,输出结果将如下。

docker-ps-response

此外,确保你的电脑上安装有git

如何使用docker-compose建立一个单一的Hadoop集群

首先从Github上克隆这个docker-Hadoop仓库,如下所示。

git clone https://github.com/big-data-europe/docker-hadoop.git

上面的样本仓库有一个Hadoopdocker-compose.yml 集,并准备部署到Docker容器中。导航到克隆的文件夹,然后运行以下命令,使用docker-compose ,启动容器。

docker-compose up -d

docker-compose up 将检查在docker-compose.yml 中设置的容器,下载它们并在Docker引擎中运行它们。

-d 标志将设置容器以可分离的模式运行,即在后台运行。一切完成后,你可以使用以下命令检查运行中的Hadoop容器。

docker ps

hadoop-running-containers-response

检查运行中的Hadoop容器化环境

为了获得一个正在运行的Hadoop应用程序的视觉效果,你需要获得容器的IP地址。然后使用映射的容器端口在浏览器上测试Hadoop。运行这个命令来获取你的IP地址。

ifconfig

在响应中,你的IP是第二行的inet ,如下所示。

check-ip-address

从上面来看,IP地址被设置为172.19.0.1

从正在运行的容器列表中,得到一个你想检查的容器的端口。这些端口号已经在你早先克隆的docker-compose.yml文件内的存储库中设置好了。比如说。

  • 对于datanode, 使用 PORT9864
  • 对于nodemanager, 使用端口8042
  • 对于namenode, 使用 PORT9870
  • 对于historyserver ,使用 PORT8188
  • 对于resourcemanager ,使用 PORT8088

在你的浏览器标签中,键入<your_ip_address>:<container_port>

使用MapReduce作业测试dockerize Hadoop应用程序

使用Docker对Hadoop进行容器化的目的是为了能够使用Hadoop分布式文件系统(HDFS)运行和测试你的作业。我们将使用一个小的数据样本来演示你如何实现这一目标。要测试MapReduce作业,请按照以下步骤进行。

  • 这里下载一个样本jar 文件。

  • jar 文件复制到容器中。在这个例子中,我们将使用namenode 容器来运行一个测试作业;请随意使用任何你想要的。

docker cp hadoop-mapreduce-examples-2.7.1-sources.jar namenode:/tmp/
  • 创建一个简单的文件,即一个.txt 文件。
nano simple-text.txt
  • 在文件中任意写两到三行,然后用 ctrl+X然后将.txt 文件复制到namenode容器中。
docker cp simple-text.txt namenode:/tmp/

这将使该文件被容器访问,以使用并将其上传到HDFS,并运行一个Hadoop MapReduce作业。

  • 导航到容器,用下面的命令以交互式方式执行它。
docker exec -it namenode /bin/bash

/bin/bash ,将引发一个交互式bash终端。

  • 在产生的bash终端中,我们需要创建一个input 文件夹来存放我们的sample-text.txt 文件。要做到这一点,我们将使用hdfs 命令,如下所示。
hdfs dfs -mkdir -p /user/root/input

我们添加了-p ,因为我们正在创建一个带有其后续子文件夹的父文件夹。

  • 使用hdfssample-text.txt 文件复制到创建的文件夹中,如下所示。
hdfs dfs put sample-text.txt /user/root/input
  • 使用Hadoop jar 在我们的jar 文件上运行MapReduce作业,以测试集群。如果产生了输出,那就说明一切正常了。要做到这一点,我们将运行以下命令。
hadoop jar hadoop-mapreduce-examples-2.7.1-sources.jar org.apache.hadoop.examples.WordCount input output

从上面看。

  • org.apache.hadoop.examples 是类。
  • WordCount 是函数。
  • input 是我们的文件所在的目录。
  • output 是文件将被生成的地方。

运行这个过程需要时间,然后它就会完成。

  • 为了测试这个过程是否成功,通过以下方式列出所创建的output 文件夹中的文件。
hdfs dfs -ls /user/root/output

你的命令响应应该类似于。

output-response

这时,你已经成功地建立并测试了一个Hadoop集群。由于你的容器仍在运行,你可以通过运行来停止它们。

docker-compose down

使用Docker建立Hadoop集群

从上面的例子来看,我们已经使用docker-compose执行了Hadoop集群。另外,你也可以使用Docker,直接在你的Docker引擎上运行Hadoop镜像,并建立一个Hadoop集群。

首先,运行以下命令,从Docker中心库中获取Hadoop Docker镜像。

sudo docker pull sequenceiq/hadoop-docker:2.7.1

这将下载Hadoop镜像及其YARN属性,如节点管理器、资源管理器和历史服务器,并将其安装在你电脑的Docker引擎中。运行下面的命令,看看Hadoop Docker镜像是否被成功下载。

docker images

如果镜像被成功安装,它应该被列在输出中,如下所示。

docker-images-response

现在让我们建立一个运行Hadoop的Docker容器。你可以使用以下命令在你的Docker引擎内创建一个Hadoop容器。这将创建并运行一个单一集群的容器。

docker run -it sequenceiq/hadoop-docker:2.7.1 /etc/bootstrap.sh -bash

docker-container-response

如果命令的执行没有任何错误(可能是由于网络连接不畅),继续检查Hadoop服务是否已经启动和运行。你可以通过运行jps 命令来做到这一点。

jps

jps-response

你可以看到,NodeManager、DataNode、资源管理器和NameNode的容器都已设置。

现在你可以验证一切是否已经启动和运行。在你的命令终端上,通过以下命令检查当前运行的容器。

docker ps

如果你的设置运行良好,你会得到一个类似的响应。

running-containers-response

测试Hadoop集群

转到你的终端标签,运行以下命令以获得正在运行的Hadoop Docker容器的IP地址。该IP地址将帮助我们在浏览器上访问Hadoop集群。此外,本地IP地址将映射到Hadoop Docker容器的端口号。

ifconfig

ip-address-response

你的IP地址将是上图中第三行的inet addr 值。

从你的浏览器中,转到:your_ip_address:50070.确保你适当地替换你的IP地址。

如果一切工作正常,你应该在你的浏览器上收到一个Hadoop用户界面。

hadoop-ui

你将得到这个页面,你可以看到所有的DataNode和NameNode信息。

收尾工作

在这一点上,我们已经成功地使用Docker运行一个Hadoop集群,只需遵循一些简单的步骤。由于你的容器目前正在运行,如果你已经完成了与它的互动,你可以选择stoppause

  • 停止将释放它在运行时使用的所有资源。
  • 暂停不会释放资源,而只是阻止调度。

要从当前的bash 环境中退出,你只需要输入exit ,然后按回车键。

要停止或暂停一个正在运行的容器,我们有以下命令。

sudo docker pause <container_id>
sudo docker stop <container_id>

容器的ID是通过running访问的。

sudo docker ps -a

快乐的黑客攻击!!