APP下载

利用Docker容器技术构建大数据实验室

2018-04-11刘亚军

实验室研究与探索 2018年2期
关键词:镜像虚拟化容器

应 毅, 刘亚军, 俞 琰

(1.三江学院 计算机科学与工程学院,南京 210012;2.东南大学 计算机科学与工程学院,南京 210096;3.南京工业大学 信息服务部,南京 210009)

0 引 言

在大数据及云计算产业高速发展的背景下,国内外很多高校已经开始进行大数据人才的培养[1]。大数据是一个典型的交叉学科,涉及到数学/统计学、数据库/数据挖掘、分布式系统、计算机编程等众多领域,人才培养不仅关注理论知识的传授,更注重工程能力的培养,教学过程中强调实验及实践课程。实践教学质量的高低在很大程度上取决于实验室的建设水平。

Apache Hadoop是由Java语言实现的开源大数据平台,它集成了数据存储、数据处理、系统管理等功能,形成了完善的生态圈(海量存储、并行计算、分析/挖掘、NoSQL等),已经成为大数据领域事实上的标准[2]。然而,Hadoop的集群性(一般至少3个节点)、配置复杂、只支持Linux操作系统等特点,对高校实验室建设是一个新挑战。

当前,高校建设大数据实验室大致有3种方法:

(1) 直接在学生机上安装Linux,在Linux上安装Hadoop[3]。

(2) 原有的机房环境不变,额外购置服务器/小型机等高性能硬件设备[4]。

(3) 在Windows系统下安装虚拟机软件(VMWare、VirtualPC等),在虚拟机上安装Linux,在Linux上安装Hadoop[5]。

受到资源限制,很多高校实验室不单独安装Linux系统,而且Linux学生机管理复杂,机房可复用性差。额外购置硬件对资金要求很高[6]。传统的虚拟机技术[7]完整地安装整个操作系统,即使底层操作系统相同,几个Guest OS之间也不能共享,对于Host OS的硬件资源利用率低,无法达到真实物理主机的水平。通常难以在一台普通PC上虚拟出一个多节点集群。

借助于LXC和AUFS技术,Docker以几乎没有额外开销的代价提供资源隔离的应用运行环境,其秒级的启动速度相比于虚拟机有了数量级的提高,而且资源占用极少,一台普通服务器能运行数百个容器(Container)[8]。本文利用Docker容器技术在单台Windows计算机上构建多节点Hadoop集群。

1 Docker容器技术

Docker是dotCloud公司于2013年发布的轻量级容器引擎,基于Go语言开发,遵循Apache 2.0开源协议。Docker的设计哲学是“Build, Ship, and Run Any App, Anywhere”[9](一处封装,处处运行)。通过分层镜像标准化和内核虚拟化技术,Docker可以将应用软件、依赖包和所需环境打包制作成镜像(image),发布到任何一台安装有Docker引擎的计算机(Linux、Mac或Windows平台)上运行。

1.1 Decker的技术优势

传统的Xen、KVM以及VMWare都是一种平台虚拟化技术[10],需要提供一个完善的硬件虚拟层,从而让一个Guest OS完整地安装在虚拟机中。一个完整的操作系统虽然功能强大,但也造成了很大的资源浪费。在实际使用中,有时用户需要的仅仅是一些应用软件和高效的运行环境而非整个操作系统。

遵循物尽其用的原则,Docker采用了LXC(Linux Containers)内核虚拟化技术。LXC能够在同一个服务器上同时支持数千台仿真系统[11],它不提供指令解释机制以及全虚拟化的其它复杂性,不需要完全对真实硬件进行模拟,省去了虚拟化层调度硬件的开销,这使得Docker容器的资源利用率和执行效率比传统虚拟主机高,接近于真实物理机[12]。

在文件系统方面,Docker使用了AUFS(Advanced multi-layered Unification Filesystem)技术,它能实现容器对基础镜像的共享。运行容器时,最底层的操作系统镜像被挂载为Readonly文件层,然后在此基础上设置一个顶层的Writable文件层供容器写入数据。利用这种层级结构,Docker不仅可以将多个具有层次关系的应用服务叠加在一起,形成新的镜像,还可以共享基础镜像,不必像传统虚拟主机那样重复安装Guest OS。

基于以上两点,作为面向应用的虚拟化技术[13],Docker很好地平衡了虚拟化的初衷和对资源的消耗,在启动速度、磁盘占用、物理资源利用率、隔离度等方面具有很大优势。

1.2 Docker Hub和Registry

Docker Hub是Docker提供的官方镜像服务网站,以公开或私有的方式存放了各种操作系统、中间件框架、数据库服务、开发环境镜像资源。Docker Registry组件提供了针对镜像的存储、搜索、上传、下载等一系列API服务。任何组织和个人都可以在Docker Hub上获取已发布的镜像,也可以创建自己的镜像并使用push命令上传到资源仓库,供其他人使用。

1.3 镜像与容器

Docker中有两个重要概念:镜像和容器。

镜像类似于虚拟机模板。开发者从Docker Registry上获取基础镜像,它一般是一个纯净的操作系统,在此基础上做修改,比如安装软件、进行配置,最后封装成一个标准的、隔离的、轻量级环境。这种构建镜像的继承关系可以是多层的。

容器是从镜像创建的运行实例,镜像可以从Docker Registry上下载,也可以来自本地创建或本地缓存。在功能上,镜像与一个完整的Linux系统基本一致,它有两个不同的状态:运行态(Running)、退出态(Exited)。对容器而言,镜像是只读的。当Docker引擎运行容器时,会在镜像之上增加一个可写层,对正在运行的容器的一切操作都会永久地写到容器的文件系统中,而不是镜像中。也可以使用同一个镜像启动多个容器,这些容器在启动后是相互隔离的。

1.4 Deckerfile

Docker提供了两种制作镜像的方式:

(1) 使用基础镜像运行容器,在容器中安装软件和相关操作,退出后使用“docker commit”命令将容器封装成一个新的镜像;

(2) 以基础镜像为基础,根据业务需求,编写Dockerfile,使用“docker build”命令自动构建新的镜像。

Dockerfile是基于DSL(Domain Specific Language)语法的脚本,由一条一条的指令组成,每条指令对应一条Linux命令,Docker引擎负责指令的翻译。与直接给出镜像相比,Dockerfile脚本清晰地表明镜像是怎样生成的,当需要定制额外需求时,只要在Dockerfile上添加或修改指令即可。这种增量发布的能力,具有更好的灵活性、透明性、可重复性以及幂等性[14]。本文在制作Hadoop镜像时,将会使用Dockerfile方式。

2 Hadoop的Docker化

以Ubuntu 14.04.4为基础镜像,采用Dockerfile方式制作Hadoop镜像,关键步骤包括:

(1) 安装JDK,OpenJDK 7。

(2) 安装SSH,OpenSSH 2。

(3) 下载、安装Hadoop,版本选择Hadoop 2.7.2。与1.x分支相比,Hadoop 2.x(YARN)是一个通用的计算框架管理平台,不仅支持MapReduce,也支持其它计算引擎(如Spark)。

(4) 配置环境变量,JAVA_HOME、HADOOP_HOME、PATH。

(5) 配置SSH无密码登录。

(6) 配置Hadoop。准备Hadoop的配置文件:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、hadoop-env.sh、slaves,并将它们拷贝至Hadoop的安装目录。

(7) 格式化NameNode。

制作流程如图1所示。

图1Hadoop image制作流程

Dockerfile的核心内容如下:

FROM ubuntu,14.04

WORKDIR /root

# 安装OpenSSH、OpenJDK、Hadoop

RUN apt-get update && apt-get install -y openssh-server openjdk-7-jdk wget

RUN wget hadoop-2.7.2.tar.gz && tar -xzvf hadoop-2.7.2.tar.gz && mv hadoop-2.7.2 /usr/hadoop/

# 配置环境变量

ENV JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/

ENV HADOOP_HOME=/usr/hadoop/

ENV PATH=PATH:/usr/hadoop/bin:/usr/hadoop/sbin

# 配置SSH无密码登录

RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''

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

RUN mv /tmp/ssh_config ~/.ssh/config

# 配置Hadoop

COPY config/* /tmp/

RUN mv /tmp/hadoop-env.sh /usr/hadoop/etc/hadoop/hadoop-env.sh

RUN mv /tmp/hdfs-site.xml HADOOP_HOME/etc/hadoop/hdfs-site.xml

RUN mv /tmp/core-site.xml HADOOP_HOME/etc/hadoop/core-site.xml

RUN mv /tmp/mapred-site.xml HADOOP_HOME/etc/hadoop/mapred-site.xml

RUN mv /tmp/yarn-site.xml HADOOP_HOME/etc/hadoop/yarn-site.xml

RUN mv /tmp/slaves HADOOP_HOME/etc/hadoop/slaves

# 格式化NameNode

RUN mkdir -p ~/hdfs/namenode

RUN mkdir -p ~/hdfs/datanode

RUN /usr/hadoop/bin/hdfs namenode -format

最后使用“docker build”命令生成Hadoop镜像,给它命名为“hadoop:base”(base其实是镜像的tag),它的大小大约只有780M,比在传统虚拟主机中安装Linux小的多。

3 构建大数据实验室

利用分布式系统的优势,Hadoop是解决大数据问题的高效工具。依托进程级虚拟化技术,Docker以应用为中心,轻巧便捷,特别适合用于需要横向扩展的应用。运行封装有Hadoop的Docker容器,可以快速地在单个PC上搭建Hadoop集群。

3.1 实验室部署

由于准备在一台机器上运行3个Docker容器(1个Master、2个Slave),所以选择硬件较好的计算机机房,PC配置为:Intel i7-4770四核CPU(处理器必须支持硬件虚拟化)、8GB RAM、1TB硬盘(7200转64M缓存)。操作系统为:Windows7 64位。部署过程只有3步:

(1) 安装DockerToolbox 1.13并启动。Docker的Toolbox是一个能在Windows平台上使用运行的轻量级虚拟机引擎。

(2) 获取Hadoop镜像,命令

docker pull hadoop:base

(3) 以bridge模式为Hadoop集群创建单独的网络,给它命名为“hadoop”,命令

docker network create—driver=bridge hadoop

单机部署完成后,可以通过噢易OSS等网络同传工具拷贝到每台学生机上。由于Docker的资源隔离机制,每台机器之间的Hadoop集群相互不干扰。

3.2 运行Hadoop容器

学生上机时,首先打开DockerToolbox,然后运行容器,启动Hadoop集群。

(1) 运行容器。基于相同的hadoop:base镜像运行多个容器。在启动时,使用“—net=hadoop”选项,将所有容器放置在hadoop网络中,它们可以通过容器名称进行通信。

运行Master节点上的容器:

docker run -itd —net=hadoop —name hadoop-master —hostname hadoop-master -p 50070:50070 -p 8088:8088 hadoop:base

运行2个Slave节点上的容器:

docker run -itd —net=hadoop —name hadoop-slave1 —hostname hadoop-slave1 hadoop:base

docker run -itd —net=hadoop —name hadoop-slave2 —hostname hadoop-slave2 hadoop:base

(2) 进入Master容器的root目录:

docker exec -it hadoop-master bash

(3) 启动Hadoop:

HADOOP_HOME/sbin/start-dfs.sh

HADOOP_HOME/sbin/start-yarn.sh

Hadoop提供了NodeManager和ResourceManager的Web管理功能,地址分别为:http://MasterIP:50070/、http://MasterIP:8088/。

Hadoop容器运行流程如图2所示。

3.3 测试Hadoop集群

编写一个runWC.sh脚本,调用Hadoop自带的WordCount程序,测试Hadoop集群是否正常工作。

图2Hadoop Container运行流程

runWC.sh脚本代码如下:

mkdir input

echo "Hello Hadoop" >input/file1.txt

echo "Hello Docker" >input/file2.txt

hadoop fs -mkdir -p input

hdfs dfs -put ./input/* input

hadoop jar HADOOP_HOME/share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.7.2-sources.jar org.apache.hadoop.examples.WordCount input output

echo -e " WordCount output:"

hdfs dfs -cat output/part-r-00000

执行结果如图3所示。

图3runWC.sh脚本执行结果

3.4 配置开发环境[6]

编程实验课需要使用Eclipse进行Hadoop方面的程序开发。

安装Hadoop Eclipse插件:下载hadoop-eclipse-plugin-1.0.4.jar,将其放置在Eclipse安装目录的plugins文件夹内,重启Eclipse。如果在打开透视图对话框中能够看到“Map/Reduce”选项,表明插件安装成功。在“Map/Reduce”透视图中,右键点击“New Hadoop Location”,根据Hadoop的安装情况,填写正确的Map/Reduce、DFS配置信息。至此,Eclipse开发环境配置完毕,可以选择“Map/Reduce Project”来开发并行应用程序。

4 镜像的迁移

以往,受时间因素和实验环境的制约,学生只能在实验课上做实验。大数据课程的实验比较复杂,有时光靠实验课的时间是无法完成的。所以,很多学生有在自己计算机上安装Hadoop集群的需求。Docker在这方面提供了便利。

Docker具有标准的镜像格式、标准的容器运行环境、标准的构建方法。当需要在新环境部署应用时,只需要到Docker Hub上下载所需的镜像,启动容器即可,极大的简化了应用程序的安装和管理。

所以,学生私人计算机上部署Hadoop集群和实验室部署Hadoop集群的方法完全一致。

5 结 语

大数据实验室是大数据人才培养不可或缺的重要部分,为实验教学提供硬件支撑。通过在Windows平台下安装Docker软件运行容器,实现了多节点Hadoop集群在单PC上的部署。一方面,保持众多学生机的原有状况不变,没有给实验室的维护增加负担;另一方面,不需要使用高性能硬件或购置新设备,节省了实验室资金。该大数据实验室已实际运行在网络机房中,每次实验课有50-60名学生同时上机,经实践证明运行稳定、维护方便,可供大家在建设大数据实验室时参考与借鉴。

参考文献(References):

[1]何海地.美国大数据专业硕士研究生教育的背景、现状、特色与启示——全美23所知名大学数据分析硕士课程网站及相关信息分析研究[J].图书与情报,2014(2):48-56.

[2]孟小峰,慈祥. 大数据管理:概念、技术与挑战[J]. 计算机研究与发展,2013(1):146-169.

[3]蒋宁,李文,李鸿彬.基于Hadoop的云计算辅助教学平台研究[J].中国远程教育,2012(9):79-82.

[4]姚占雷,许鑫,叶德磊.云计算架构下经管类实验教学环境搭建与应用实践[J].现代教育技术,2013(7):111-116.

[5]孔艺权.面向开源软件的“云计算”仿真实验设计[J].实验技术与管理,2013(2):122-125.

[6]付伟,严博,吴晓平.云计算实验平台建设关键技术研究[J].实验室研究与探索,2013(11):78-81.

[7]何增颖.虚拟机技术的实验教学应用[J].实验科学与技术,2010(1):80-82,87.

[8]强焜.基于Docker的旧机房虚拟化改造探讨[J].科技创新与应用,2016(35):58.

[9]Xie B, Sun G, Ma G. Docker based overlay network performance evaluation in large scale streaming system[C]// Advanced Information Management, Communicates, Electronic and Automation Control Conference (IMCEC), 2016 IEEE. IEEE, 2016: 366-369.

[10]汪恺,张功萱,周秀敏.基于容器虚拟化技术研究[J].计算机技术与发展,2015(8):138-141.

[11]金海,廖小飞.面向计算系统的虚拟化技术[J].中国基础科学,2008(6):12-18.

[12]谢超群.Docker容器技术在高校数据中心的应用[J].贵阳学院学报(自然科学版),2015(4):27-29.

[13]伍阳.基于Docker的虚拟化技术研究[J].信息技术,2016(1):121-123,128.

[14]James Turnbull. 第一本Docker书[M]. 北京:人民邮电出版社, 2016.

猜你喜欢

镜像虚拟化容器
容器倒置后压力压强如何变
镜像
难以置信的事情
基于OpenStack虚拟化网络管理平台的设计与实现
镜像
对基于Docker的虚拟化技术的几点探讨
H3C CAS 云计算管理平台上虚拟化安全防护的实现
存储虚拟化还有优势吗?
取米
镜像