Get-to-know-Cloud
基本概念
SaaS(Software-as-a-service) 软件即服务
- 为客户提供各种应用软件服务,即以服务的方式将应用程序提供给互联网最终用户
- 它是用户获取软件服务的一种新形式,不需要用户将软件产品安装在自己的电脑或服务器上,而是按某种服务水平协议(SLA)直接通过网络向专门的提供商获取自己所需要的、带有相应软件功能的服务。
- 本质上而言,软件即服务就是软件服务提供商为满足用户某种特定需求而提供其消费的软件的计算能力。
- 应用实例Salesforce Sales Cloud,Google Apps,Zimbra,Zoho和IBM Lotus Live、网易企业邮箱、亦群协作云平台等
- CRM软件领域,如Salesforce 公司提供的在线客户关系管理CRM服务
- 工具化SaaS,比如视频会议租用,企业邮箱等
- 在线进销存,物流软件等
PaaS(Platform-as-a-service) 平台即服务
- 通过平台为客户提供一站式服务
- 以服务的方式提供应用程序开发和部署平台。就是指将一个完整的计算机平台,包括应用设计、应用开发、应用测试和应用托管,都作为一种服务提供给客户
- 应用实例Google App Engine,force.com,heroku和Windows Azure Platform等
- 谷歌App Engine平台。App Engine是Google提供的基于Google数据中心的开发、托管网络应用程序的平台,每个 Google App Engine 应用程序都可使用500MB存储空间,以及可支持每月约500万页面浏览量的CPU和宽带。目前每个用户可以免费创建十个应用。
- 微软的Azure平台。 The Azure™ Services Platform (Azure) 主机位于微软的数据中心,是一个基于Internet的云服务平台。提供操作系统和一系列的开发服务,各种服务可进行自由组合。
IaaS(Infrastructure-as-aservice) 基础设施即服务
- 为客户提供网络、计算和存储一体化的基础架构服务.
- 将硬件设备等基础资源封装成服务供用户使用。它是指企业或个人可以使用云计算技术来远程访问计算资源,这包括计算、存储以及应用虚拟化技术所提供的相关功能。
- 应用实例Amazon EC2,Linode,Joyent,Rackspace,IBM Blue Cloud和Cisco UCS等
- 当你想运行成批的程序组,但是没有合适的软硬件环境,可使用 Amazon 弹性计算云 EC2。
- 当你想在网络上存储大量的文档,但是你没有足够的存储空间,可使用Amazon 简单存储服务 S3。
- 当你想在网络上发布一个短期(几天到几个月)的网站,可使用Flexiscale。
多租户( Multi-tenant)
特性:
- 服务要能够支持不同租户之间数据和配置的隔离,从而保证每个租户数据的安全与隐私,以及用户对诸如界面、业务逻辑、数据结构等的个性化需求。
- 多租户大大增强了软件的可靠性和可扩展性(Scalability) 、降低了维护和升级成本
现在SaaS Multi-Tenant在数据存储上存在三种主要解决方案:(pdf)
- 独立数据库(这种方案的用户数据隔离级别最高,安全性最好,但成本也高。)
- 共享数据库,隔离数据架构(多个或所有租户共享Database,但一个Tenant一个Schema)
- 共享数据库,共享数据架构(租户共享同一个Database、同一个Schema,但在表中通过TenantID区分租户的数据。这是共享程度最高、隔离级别最低的模式
Hypervisor
Hypervisor型(硬件虚拟化、半虚拟化)建立在硬件基础上,对硬件有依赖性
Full Virtualization
- VMM 即Hypervisor在客户操作系统和裸硬件之间提供协调。
- 底层硬件并不由操作系统所拥有,而是由操作系统通过 Hypervisor 共享。
- 完全虚拟化的最大优点是操作系统无需任何修改就可以直接运行。
- 惟一的限制是操作系统必须要支持底层硬件。
Para Virtualization
- 使用了一个 Hypervisor 来实现对底层硬件的共享访问,还将与虚拟化有关的代码集成到了操作系统本身中。
- 半虚拟化有一个缺点是必须修改客户操作系统,因为半虚拟化为了提高效率,必须要让Guest OS本身意识到自己运行在虚拟机上,在Guest OS的内核中需要有方法来与Hypervisor进行协调,这个缺点很大的影响了半虚拟化技术的普及,因为Linux等系统可以修改,而其它不能修改的系统就不能用了。
Xen完全虚拟化Full virtualization
提供底层物理系统的全部抽象化,且创建一个新的虚拟系统,客户机操作系统可以在里面运行。不需要对客户机操作系统或者应用程序进行修改(客户机操作系统或者应用程序像往常一样运行,意识不到虚拟环境的存在)。Xen半虚拟化Para virtualization
需要对运行在虚拟机上的客户机操作系统进行修改(这些客户机操作系统会意识到它们运行在虚拟环境里)并提供相近的性能,但半虚拟化的性能要比完全虚拟化更优越。
Xen的结构与原理
域(domain)
- 在Xen中,一个独立的虚拟机被称之为一个域(domain),Xen调度各个虚拟机以充分利用CPU资源。
- 通过域的概念,各个操作系统运行在独立的虚拟机中,彼此互不干扰。
运行Xen的计算机一般包括以下三个部分:
- Xen管理程序(Xen Hypervisor).
- 0域(Domain 0),即特权域.
- 多个U域,即用户域.
Xen管理程序直接运行在硬件上,是硬件(CPU 、内存、I/O)与各个操作系统的接口。将硬件资源逻辑化,负责CPU的调度与内存分配,控制各个虚拟机的执行。
在Hypervisor中没有实现网络连接与硬盘的读写,相关功能“下放”到了Domain 0
0域(特权虚拟机Domain 0)
- 系统启动时自动创建,由Xen管理程序在初始化系统时加载。
- 理论上可以运行除windows以外的任何其它开源操作系统。
- 有唯一的特权直接访问Xen管理程序、操纵物理设备,可以启动、中止其它用户域,同时也可以响应其它用户域的请求。
- Xen自身没有任何设备驱动和用户接口。这些都是由运行在Domain 0下的操作系统和工具所提供的。
- 因为上述原因,Domain 0运行的操作系统的安全性是致关重要的。
- 具有代表性的Domain0 Guest OS是Linux,而NetBSD 和Solaris也可以作为Domain0 的Guest OS使用,将来可能支持 FreeBSD。
- Linux是Xen的开发者使用得最多的,因为它们都是在GNU(General Public License)下发布的。
U域(客户虚拟机Domain U)
- 由Domain 0加载和控制,并独立运行在系统上的虚拟机。
- 它们可以是完全虚拟化(运行未修改操作系统)的客户虚拟机,也可以是半虚拟化(运行经修改过的操作系统)的客户虚拟机。
- 不能直接访问物理硬件,需要借助Domain 0特权虚拟机进行访问。
MapReduce运行
Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出。Reducer任务会接收Mapper任务输出的数据,作为自己的输入数据,调用自己的方法,最后输出到HDFS的文件中。
Mapper任务的执行过程
每个Mapper任务是一个java进程,它会读取HDFS中的文件,解析成很多的键值对,经过我们覆盖的map方法处理后,转换为很多的键值对再输出。整个Mapper任务的运行过程分为六个阶段。
第一阶段是把输入文件按照一定的标准分片(InputSplit),每个输入片的大小是固定的。默认情况下,输入片(InputSplit)的大小与数据块(Block)的大小是相同的。如果数据块(Block)的大小是默认值64MB,输入文件有两个,一个是32MB,一个是72MB。那么小的文件是一个输入片,大文件会分为两个数据块,那么是两个输入片。一共产生三个输入片。每一个输入片由一个Mapper进程处理。这里的三个输入片,会有三个Mapper进程处理。
第二阶段是对输入片中的记录按照一定的规则解析成键值对。有个默认规则是把每一行文本内容解析成键值对。“键”是每一行的起始位置(单位是字节),“值”是本行的文本内容。
第三阶段是调用Mapper类中的map方法。第二阶段中解析出来的每一个键值对,调用一次map方法。如果有1000个键值对,就会调用1000次map方法。每一次调用map方法会输出零个或者多个键值对。
第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。比较是基于键进行的。比如我们的键表示省份(如北京、上海、山东等),那么就可以按照不同省份进行分区,同一个省份的键值对划分到一个区中。默认是只有一个区。分区的数量就是Reducer任务运行的数量。默认只有一个Reducer任务。
第五阶段是对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对
<2,2>、<1,3>、<2,1>
,键和值分别是整数。那么排序后的结果是<1,3>、<2,1>、<2,2>
。如果有第六阶段,那么进入第六阶段;如果没有,直接输出到本地的linux文件中。第六阶段是对数据进行归约处理,也就是reduce处理。键相等的键值对会调用一次reduce方法。经过这一阶段,数据量会减少。归约后的数据输出到本地的linxu文件中。本阶段默认是没有的,需要用户自己增加这一阶段的代码。
Reducer任务的执行过程
每个Reducer任务是一个java进程。Reducer任务接收Mapper任务的输出,归约处理后写入到HDFS中,可以分为三个阶段。
- 第一阶段是Reducer任务会主动从Mapper任务复制其输出的键值对。Mapper任务可能会有很多,因此Reducer会复制多个Mapper的输出。
- 第二阶段是把复制到Reducer本地数据,全部进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
- 第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对。最后把这些输出的键值对写入到HDFS文件中。
在整个MapReduce程序的开发过程中,我们最大的工作量是覆盖map函数和覆盖reduce函数。