赵乐乐,黄 刚,马 越
(南京邮电大学计算机学院,江苏南京 210003)
基于Docker的Hadoop平台架构研究
赵乐乐,黄 刚,马 越
(南京邮电大学计算机学院,江苏南京 210003)
Hadoop作为云计算中重要的大数据处理平台,需要较高的读写速率。传统的虚拟化技术对于物理主机的资源利用率,无法达到真实物理主机的水平。同时,传统虚拟化技术难以灵活配置文件和自动化创建、部署机制。容器是基于共享Linux内核的一种虚拟化技术,能够达到接近物理主机的资源利用率。Docker是一种轻量级新兴的虚拟化容器技术,在复杂的集群系统的搭建方面,具有可移植、易使用、跨平台等优势。所以,在复杂的分布式应用集群的部署中,Docker能够快速、准确、标准化封装应用程序并自动化部署整个运行环境。因此,Docker是容器虚拟化技术下一个相对成熟的实现方案。通过实验验证了Docker相比传统虚拟化技术在读写性能上的优势,并构建了基于Docker的Hadoop平台,讨论了在Docker上构建Hadoop的优势。
Hadoop;虚拟化;容器;Docker
Hadoop作为一款优秀的PaaS软件,能够让开发者更有效率的开发与部署,而不需关注底层。对于Hadoop的部署,一般来说有两种选择:一种是直接部署在物理主机上,一种是部署在虚拟机上。当然,大多数时是根据情况,混合使用物理主机和虚拟机来部署Hadoop。对于商业公司来说,一般都会把Hadoop部署在IaaS提供的虚拟机上,以提高对单点故障等问题的处理速度,利于运维人员的管理维护,而不是直接部署在物理主机上。然而,由于虚拟机本身需要消耗一定资源来实现底层的虚拟化,所以势必会消耗物理主机的资源。
对于企业级的Hadoop部署,底层的虚拟化方案组成有很多,当前业界提供的虚拟机方案大致可分为三类:XEN、KVM以及Vmware。对于企业应用来说,可能会选择使用混合多种虚拟机方案的方式,也有很多厂商专门提供组合虚拟化技术的解决方案。但无论这些虚拟化解决方案是如何组成的,它们都可归类为使用全虚拟化技术或使用部分虚拟化技术,这些虚拟化技术都要提供一个完整的虚拟硬件环境,从而能让一个操作系统完整地安装在虚拟机中。现在各大云计算虚拟化厂商的IaaS层,无论是AWS、Google还是国内的BAT公司,基本都使用这种虚拟主机的方式。这种方式有其自身的优势,即能够充分利用物理机的资源,能够自由选择所要创建的主机的虚拟硬件,能够构建各种系统环境。但由于每台虚拟机都是完整地安装整个操作系统,虚拟机之间不能共享相同的底层操作系统的功能,并且在实际使用过程中,往往并不需要完整的操作系统支持,只需要其中的一些软件,只是因为安全与维护等因素才需要虚拟机。所以,一个完整的操作系统虽然功能强大,但也造成了一定的资源浪费。正是基于这一原因,近年来出现了新的轻量级的虚拟化技术—容器。
文中所指的容器技术是Linux容器(Linux Container,LXC)技术。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求[1]。容器的思想就是把一个进程(包括其子进程)独立打包在一个“集装箱”内,而不影响系统内的其他进程。这样做的最大好处就是,容器内的进程所运行的环境是独立于底层物理操作系统的,当容器启动的时候,也仅是通过进程间调度,而不需要引导整个系统,从而提高效率。
容器技术在Linux的2.6.29版本中就产生了,并且已有多种实现方案,但之前的技术并没有引起业界的关注。2013年Docker Inc公司发布了一个开源的基于LXC技术的容器引擎,使得容器技术获得了业界的重视。现在Docker技术已经被Google、IBM、RedHat、Amazon和微软等业界知名公司所支持。虚拟机和容器正在改变运行、设计、开发和部署应用程序的方式。
Docker受欢迎的原因是其主要解决了以下问题:
(1)快速部署。通常一款产品能够成功发布,开发者需要关心很多东西,从操作系统到中间件再到应用,而且这些东西都难于管理,这个问题在软件行业普遍存在。Docker则简化了这些工作,比如Web应用、后台应用、数据库应用、大数据应用,Hadoop集群、消息队列等都可以打包成一个镜像,然后再快速部署。
(2)软件管理。亚马逊的AWS之所以成功,是因为它让开发者将应用转移到云上,解决了硬件管理的问题,然而软件配置和管理相关的问题依然存在。Docker正好能帮助软件开发者使用新的软件管理方法来解决这个问题。
(3)虚拟化技术的改变。云计算使用标配的硬件来降低成本,采用虚拟化的手段来满足用户按需分配的资源需求以及保证可用性和隔离性。然而无论是KVM还是Xen,都存在一定的资源浪费,因为用户需要的是高效的运行环境而非一个操作系统,虚拟主机既浪费资源又难于管理,轻量级的LXC则更具灵活性和快速性。
(4)更高的便携性。LXC在Linux 2.6的内核里就已经存在了,但是其设计之初并不是为云计算考虑的,缺少标准化的描述手段和容器的可便携性,决定其构建出的环境难于分发和标准化管理。Docker则在这个问题上做出了实质性的创新方法[2]。
从模块化和整合化的方面来说,可以认为Docker被设计的初衷是在独立封装和在任何平台都可以同步运行。Docker将操作系统、虚拟机、物理机和基于上面的操作整合起来进行商品化,同时提供了一系列的API,使得其他人能够基于这些 API进行操作。但Docker不能商品化的部分是数据中心[3],这是其目前的缺陷。
从一个开发者的角度,把应用封装在Docker的意义在于,可以把整个云服务作为一个模块进行操作,这其中的模块只是一个可以被替代的商品。Docker的优势在于,可以任意地把应用进行迁移而无需做出其他改动。所以对于开发者而言,封装应用只需要Docker就够了。
软件工程从初期的独立主义到现在,已经发展成一个高度工程化的产业链形式。为了更好地交付软件和服务,人们认识到将开发和运营分隔开来的传统做法已不适合当前的软件服务开发需求,所以就要把开发与运营作为一个整体,这也就是所谓的DevOps思想。业界也随之有了对DevOps系统的需求,即希望有一套平台或软件能够整合开发和运营交付以及之后的管理工作。所以,从DevOps来看,云平台都是为了解决开发人员在开发测试过程中快速搭建环境以及后期运营支持过程中恢复升级监控系统所服务的。近年来,随着云计算产业的发展,DevOps的概念也在业界变得流行。第一代的DevOps系统是基于物理主机部署的,主要靠人工协调来进行业务的自动部署,第二代的DevOps系统则是基于IaaS进行部署的,借助云计算的资源监控特性,能够实现很好的智能感知等,能够快捷地通过迁移方便地解决硬件单点故障问题,自动做到负载均衡。这是目前很多云计算公司都在极力达到的目标,现在很多公司还不能很好地实现第二代DevOps系统。然而,随着容器技术的发展,DevOps系统有了一个新的方向,即基于容器的部署,容器能够实现应用的跨云迁移,使得应用不会被限定在固有的IaaS中。例如,搭建了一套集群,混合了Vmware和Xen技术,两套系统的虚拟机无法实现实时互相迁移,因为底层的系统存储格式是不一样的;而容器则不存在这种问题,只需要通过启用对应的容器镜像,就可以启动一个新的服务,这样做就无需关心底层的IaaS架构了。
另外,随着将DevOps实践引入应用程序生命周期管理,应用程序性能管理(APM)方案的出现则逐渐成为企业实现DevOps投资回报的重要前提[4]。对于应用程序的管理,在如今云应用程序普及的情况下,如何整合云应用则是IT团队所面临的严峻挑战,而容器技术则为其提供了一个比较好的解决方案。所以,从商业效益上来说,容器技术可以认为是云计算和DevOps发展的下一个重要方向。目前已有超过14 000个应用建立在 Docker上,eBay也正在测试建立在Docker上的数据中心软件[5]。
Docker也可以在虚拟机中运行的很好,这可以让它应用在已有的虚拟化框架中,如私有云和公有云。同样也有可能在容器中运行虚拟机,这有点像谷歌在其云平台中使用容器的方式。只要IaaS得到广泛应用,并可按需提供虚拟机服务,那么就有理由期待容器和虚拟机的应用可以并存。还有一种可能,即将容器管理和虚拟化技术进行融合以提供一种两全其美的方法[6]。因为容器能够很好地满足各类PaaS功能,所以形象的说,可以把IaaS领域的市场看作是苹果的应用程序商店,现在可以添加类似PaaS功能,这些功能可以“加载”到采用按需付费的订阅服务模式的IaaS产品上[7]。所以随着IaaS将各项类PaaS的服务添加到自己的服务组合中,PaaS和IaaS之间的界限会变得更为模糊,很有可能IaaS和PaaS最终会合成一体。
可以汇总出一套通用型解决模式,其中Docker分别充当以下几种角色:
(1)Docker提供经过认证的软件包,并保证其能够与稳定不变的现有基础设施模型顺利协作;
(2)Docker为微服务POD提供出色的容器化运行环境;
(3)在IaaS之上使用Docker,并将其作用于裸机环境等同的运行平台。
是否使用云基础设施仅仅是种自由选项而非强制要求。举例来说,如果出于DevOps的目的而考虑建立一套小型自动化开发与测试环境,那么在裸机环境上直接使用Docker机制更适合[8]。
虚拟主机技术能够让一台物理主机运行多个操作系统,物理主机系统称为Host OS,而在虚拟机中安装的操作系统则称为Guest OS。每个Guest OS都有自己的计算、存储和网络组件,这些可以通过硬件虚拟化,或者Host OS通过把Guest OS的指令翻译成物理机指令来实现。所以从理论上来说,Guest OS可以是任何一款操作系统,与底层的Host OS无关。
容器则是一款轻量级的操作系统,它运行在物理机的系统上,直接使用物理机的CPU指令,而不需要像虚拟机那样要对指令进行翻译。所以容器不需要像虚拟机那样有太多的开销,并能提供很好的隔离性。虽然虚拟机利用了RAM的过度承诺技术(RAM over commitment),容器也表现出比虚拟机更低的系统负载,所以同样的应用,在容器中相比在虚拟机中,性能通常会相当或者更好。经过实际测试,在Docker启动时不加载额外软件的话,即只使用基本的系统镜像,所占用的内存仅有几兆,甚至更少。因为Docker对于内存消耗主要是在所加载的程序上的,而不像虚拟机需要额外提供给一些系统级的服务,所以对于一台服务器,Docker能比虚拟机提供更多隔离的容器给用户使用,这样大大提高了物理主机的使用效率。
表1比较了虚拟机与容器在性能、隔离性、安全性、网络和存储上的不同之处[9]。
同时,由于容器也可以安装在IaaS所分配的虚拟机上,相比现有的PaaS,容器技术也更具灵活性。因为现有的PaaS,大部分都是厂商驱动的,例如Cloud Foundry(原先由Vmware开发)、OpenShift(红帽)等,这些厂商驱动的PaaS让广大开发人员和用户被某家厂商牢牢锁定,如果要将应用程序从厂商驱动的平台传送到另一个平台,将会非常麻烦。而容器则不会出现这种问题,因为容器底层就完全可以看作是一个操作系统,就如同一个虚拟机。也正因为如此,现在业界很看好把容器构建成一个分布式服务。目前比较成熟的就是Google的Kubernetes,这是一款开源的容器管理系统,Google最新的Container Engine就是基于Kubernetes设计的。
由于Docker本身也是一种虚拟化技术,在使用Docker作为Hadoop集群部署的环境时,需要保证其在读写性能上不低于现有的虚拟机技术。因为Hadoop集群需要存储处理大数据,所以对于I/O的读写性能要求很高。为了验证容器与KVM的性能,使用了一个测试案例,实验环境为:
硬件环境:4 G内存,双核CPU,200 G磁盘;
软件环境:sysbench 0.4.12,文件块为16 k。
sysbench是一款开源软件,主要用于多线程性能测试。
因为实验环境为Linux系统,Linux在实现文件系统时采用了两层结构:第一层是虚拟文件系统,它把各种实际文件系统的公共结构抽象出来,建立统一的以inode为中心的组织结构,为实际文件系统提供兼容性[10]。所以,虽然Docker使用了自己的一套文件系统,不像KVM的虚拟机可以保证使用标准的Linux文件系统,但对于实验的影响不大。同时,因为是随机读写的文件,所以为了取得更好的处理效果,把/sys/ block/sda/queue/scheduler的值设为deadline。该值是经过实验验证后确认的,将所产生的数据分别在deadline、anticipator、noop和cfq的调度算法下使用time命令进行了测试。结果显示,deadline是耗时最少的。所以为了提高效率,将实验环境都同样设定为相同的调度算法。
随机读写150 G的文件,将结果用gnuplot绘图,结果如图1~3所示。
从实验结果可以看出,使用Docker技术,在I/O的读写性能上都是优于KVM技术的,容器也表现出比虚拟机更低的系统负载。所以同样的应用,在容器中相比在虚拟机中,性能通常会相当或者更好。国外也有一些机构已经开始把Docker用于构建大数据处理平台了,例如罗马尼亚的Cluj-Napoca。Cluj-Napoca大学就把处理地球观测数据的平台构建在 Docker上[11],获得了较好的性能表现。所以说,Docker技术具有很好的I/O性能,能够作为大数据处理工具平台。
作为一种特殊的镜像软件,要制作特定的软件镜像,Docker有其自己的安装打包方式,主要有[12]:
(1)直接在基础镜像上安装软件,然后使用Docker命令将其封装成一个新的镜像;
(2)使用Dockerfile文件,拉取进出系统镜像后,让镜像根据Dockerfile文件的内容自己编译安装。
第1种方法的优点是所有操作与真实操作一台虚拟机一样,无需重新学习新内容;缺点是在部署这些镜像时,可能会由于所处环境的不同而造成需要重新修改部分内容,而且,下载完整的镜像所需要消耗的时间较多。
第2种方法则只需要在部署时下载该Dockerfile文件,然后让系统自己去拉取数据,这样能够减少所需下载的内容,且由于镜像完全是按照Dockerfile文件的内容来制作的,所以能够减少人为的干预,从而减少出错;但其缺点是需要花费时间去学习Dockerfile文件的机制。
文中使用第2种方法来部署Hadoop,使用的Hadoop版本是2.5.2。
主要完成如下几步:
(1)下载基础系统镜像;
(2)使用Dockerfile的内建指令下载安装软件;
(3)使用 Dockerfile内建指令加载对应的配置文件。
同时,由于Docker技术本身还在发展过程中,要使用Docker创建能够被外网访问的容器,需要进行一些额外设置。利用容器的底层实现原理,通过脚本动态地为每个容器创建对应的桥接网口。这样能够实现跨服务器间的容器间的互相访问,也更接近真实的应用环境。
通过使用Dockerfile文件,完成构建基于Docker 的Hadoop环境。经过测试,Hadoop能够正常使用。把其与安装在物理主机上的Hadoop进行比较,通过time命令测试两者运行时间,结果显示两者耗时相差不大,部分情况下Docker下的耗时才略高一些。虽然部署的Docker数量不多,但能够看出在Docker上部署的Hadoop在数据读写上的表现非常优异。
Hadoop作为需要大量读写数据的云计算平台,部署在Docker下比部署在传统的虚拟机上有更好的性能表现。文中验证了在Docker上读写数据的性能比KVM的更高,同时,在Docker上部署Hadoop具有接近物理主机的资源利用率。并且,由于Docker把数据与运行环境进行了分离,所以可以把构建好的Hadoop平台作为镜像发布,方便随时添加或替换Hadoop节点,这能够提高部署Hadoop时的工作效率。Docker作为容器技术的最佳实践,其性能优势使得其能够替换现有的虚拟化技术。现在国内已经有结合 Docker与OpenStack的研究(如文献[13])和基于 Docker的PaaS平台研究(如文献[14]),这将使得IaaS与PaaS的界限变得更加模糊,Docker势必会引领下一场云计算技术的浪潮。
[1] 杨保华,戴王剑,曹亚仑.Docker技术入门与实战[M].北京:机械工业出版社,2014.
[2] 肖德时.深入浅出Docker[EB/OL].[2015-01-05].http:// www.infoq.com/cn/articles/docker-core-technology-preview?utm_source=infoq&utm_medium=related_content_ link&utm_campaign=relatedContent_articles_clk.
[3] Compton D.Why Docker and CoreOS’split was predictable [EB/OL].[2015-01-05].http://danielcompton.net/2014/ 12/02/modular-integrated-docker-coreos.
[4] Lowy G.Application performance management enables DevOps ROI[EB/OL].[2015-01-05].http://www.apmdigest. com/application-performance-mangent-apm-devops-roi.
[5] Garber L.News briefs[J].IEEE Security and Privacy,2011,9 (6):9-11.
[6] Swan C.Docker:present and future[EB/OL].[2015-01-05].http://www.infoq.com articles/docker-future.
[7] Kavis M.Blurring the line between PaaS and IaaS[EB/OL]. [2015-01-05].http://www.forbes.com/sites/mikekavis/ 2014/06/02/blurring-the-line-between-paas-and-iaas/.
[8] Shalom N.Do I need OpenStack if I use Docker[EB/OL]. [2015-01-05].http://pensource.com/business/14/11/do-i -need-openstack-if-i-use-docker.
[9] Dua R,Raja A R,Kakadia D.Virtualization vs containerization to support PaaS[C]//Proc of IEEE international conference on cloud engineering.Boston,MA:IEEE,2014:610-614.
[10]黄 刚,徐小龙,段卫华.操作系统教程[M].北京:人民邮电出版社,2009.
[11]Bica M,Bacu V,Mihon D,et al.Architectural solution for virtualized processing of big earth[C]//Proc of IEEE international conference on ICCP.Cluj Napoca:IEEE,2014:399-404.
[12]Turnbull J.The Docker book[M].[s.l.]:Amazon Digital Services,Inc.,2014.
[13]张忠琳,黄炳良.基于OpenStack云平台的Docker应用[J].软件,2014,35(11):73-76.
[14]鞠春利,刘印锋.基于Docker的私有PaaS系统构建[J].轻工科技,2014(10):80-80.
Research on Hadoop Platform Based on Docker
ZHAO Le-le,HUANG Gang,MA Yue
(School of Computer,Nanjing University of Posts and Telecommunications,Nanjing 210003,China)
Hadoop,as an important big data processing platform,needs higher I/O rate.For the resource utilization of physical host,the traditional virtualization technology cannot reach the level of real physical host.Meanwhile,it is difficult to configure the files flexibly and create and deploy mechanisms automatically.The container is a virtualization technology based on sharing Linux kernel,which can reach the resource utilization close to the physical host.Docker emerging is a lightweight container of virtualization technology,and in the complex cluster system construction,it is portable and easy to use,with cross-platform.So,in the complicated distributed deployment of application clusters,Docker can be rapid,accurate,and standardized packaged applications and deploy automatically whole runtime environment.Therefore,Docker is one of the mature implementation scheme of the container virtualization technology.It is verified by the experiment that the Docker is better than traditional virtualization technology in reading/writing performance,and the Hadoop platform based on the Docker is established and the advantage of Hadoop on Docker is discussed.
Hadoop;virtualization;container;Docker
TP31
A
1673-629X(2016)09-0099-05
10.3969/j.issn.1673-629X.2016.09.023
2015-12-03
2016-04-06< class="emphasis_bold">网络出版时间:
时间:2016-08-01
国家自然科学基金资助项目(61171053);南京邮电大学基金(SG1107)
赵乐乐(1992-),男,研究方向为计算机云计算与大数据应用;黄 刚,教授,研究方向为计算机软件理论及应用。
http://www.cnki.net/kcms/detail/61.1450.TP.20160801.0909.072.html