资源描述
云计算与分布式系统期末复习
1. 云计算的概念,来源以及与并行计算的关系
云计算的概念从集群、网格和效用计算发展而来。
云是虚拟计算机资源池。云可以处理各种不同的负载,包括批处理式后端作业和交互式用户界面应用。云通过迅速提供虚拟机或物理机允许负载被快速配置和划分.云支持冗余,自恢复,高可扩展编程模型,以允许负载从许多不可避免的硬件/软件错误中恢复。最终,云计算系统可以通过实时监视资源来确保分配在需要时平衡。
来源:数据爆炸促发了云计算的思想。
集群和网格计算并行使用大量计算机可以解决任何规模的问题。效用计算和SaaS(Softwareas a Service)将计算资源作为服务进行按需付费.云计算利用动态资源为终端用户传递大量服务.
云计算是一种高吞吐量计算范式,它通过大的数据中心或服务器群提供服务。云计算模型使得用户可以随时随地通过他们的互连设备访问共享资源。
云计算避免了大量的数据移动,可以带来更好的网络带宽利用率.而且,机器虚拟化进一步提高了资源利用率,增加了应用程序灵活性降
低了使用虚拟化数据中心资源的总体成本。
云计算使用虚拟化平台,通过按需动态配置硬件、软件和数据集,将弹性资源放在一起,主要思想是使用数据中心中的服务器集群和大规模数据库,将桌面计算移向基于服务的平台,利用其对提供商和用户的低成本和简单性.
云应用的所有计算任务被分配到数据中心的服务器上。这些服务器主要是虚拟集群的虚拟机,由数据中心资源产生出来。
云平台是通过虚拟化分布的系统。
公有云和私有云都是在互联网上开发的。
公有云构建在互联网之上,任何已付费的用户都可以访问。公有云属于服务提供商,用户通过订阅即可访问.
私有云构建在局域网内部,属于一个独立的组织。由客户管理,而且其可访问范围限制在所属客户及其合作者之中。
混合云由公有云和私有云共同构成
公有云促进了标准化,节约了资金投入,为应用程序提供了很好的灵活性;私有云尝试进行定制化,可以提供更高的有效性、弹性、安全性和隐私性;混合云则处于两者中间,在资源共享方面进行了折中。
云的核心是服务器集群(或虚拟机集群)。集群节点用作计算节点,少量的控制节点用于管理和监视云活动。用户作业的调度需要为用户创建的虚拟集群分配任务。
数据中心和超级计算机在网络需求方面也不相同.超级计算机使用客户设计的高带宽网络,如胖树或3D环形网络;数据中心网络主要是基于IP的商业网络
云平台设计目标: 可扩展性、虚拟化、有效性和可靠性
2. 云平台提供的服务类型
6层的云服务,范围从硬件、网络和配置到基础设施、平台和软件应用
上三层
Iaas(基础设施即服务)Paas(平台即服务) Saas(软件即服务)
硬件即服务(HaaS) 网络即服务(NaaS ) 位置即服务(配置即服务)(LaaS)。
数据中心的虚拟化资源形成互联网云,向付费用户提供硬件,软件,存储,网络和服务以运行他们的应用。
云计算提供了一个虚拟化的按需动态供应硬件,软件和数据集的弹性资源平台。
①基础设施即服务(IaaS):这个模型将用户需要的基础设施(即服务器,存储,网络和数据中心构造)组合在一起。用户可以在使用客户机操作系统的多个虚拟机上配置和运行指定的应用。
②平台即服务(PaaS):这个模型使用户能够在一个虚拟的平台上配置用户制定的应用。PaaS包括中间件,数据库,开发工具和一些运行时支持(如Web 2。0和Java).
3。软件即服务(SaaS):这是指面向数千付费云用户的初始浏览器的应用软件。SaaS模型应用于业务流程,工业应用,客户关系管理,企业资源计划,人力资源和合作应用。
3. Google的核心技术(……包括默认文件??大小)
谷歌的云计算应用程序的构成要素包括存储大量数据的GFS、为应用程序开发者提供的MapReduce编程框架、用于分布式应用程序锁服务的Chubby和为访问结构化或半结构化数据的BigTable存储服务。
Google MapReduce(Map:对一组数据元素进行某种重复式的处理,Reduce:对Map中间结果进行某种进一步的结果整理)(MapReduce把what need to do 与how to do 分开了)
(设计思想:scale out not up,assume failures are common,moving processing to data,process data sequentially and avoid random access)上升到架构:统一架构,为程序员隐藏系统层细节。
Google GFS google gfs 是一个基于分布式集群的大型分布式文件系统,为MapReduce计算框架提供底层数据存储和数据可靠性支撑。
Master 上保存了GFS文件系统的三种元数据:①命名空间,即整个分布式文件系统的目录结构。②Chunk 与文件名的映射表 3。Chunk副本的位置信息,每个Chunk 默认有3个副本.
GFS中每个数据块划分缺省为64MB。每个数据块会分别在3个不同的地方复制副本;每一个数据块,仅当3个副本都成功时,才认为数据保存成功。每个数据块再划分为64KB的子块,每个子块有一个32位的校验和.
BigTable:GFS是一个文件系统,难以提供对结构化数据的存储和访问管理。为此Google在GFS之上又设计了一个结构化数据存储和访问管理系统-——--BigTable,为应用程序提供比单纯文件系统更方便,更高层的数据操作能力。
BigTable对存储在表中的数据不做任何解释,一律视为字符串,具体数据结构的实现由用户自行定义。
BigTable查询模型(row:string,column:string,time:int64)—〉结果数据字符串。支持查询,插入和删除操作.
4. 怎样分析与计算系统的可用性
可用性表示系统对用户可用的时间百分比,即系统正常运行的时间百分比。
可用性分析:
HA(high accessibility)是所有集群,网络,P2P网络和云计算系统所期望的。如果系统有一个长的平均故障时间(Mean Time To Failure,MTTF)和短的修复时间(Mean Time To Repair,MTTR),那么这个系统就是高度可用的。系统可用性形式化定义如下:
系统可用性=MTTF/(MTTF+MTTR)(大多数集群通过转移故障节点来达到高可用性的目的)。
5. 虚拟化的基本概念,硬件虚拟化的基本类型,虚拟化软件,目前市场上开源的vmare版本所支持的指令集
虚拟化:
虚拟化是一种计算机体系结构技术,其中,多个虚拟机共享同一台物理硬件机器。虚拟化的思想是分离软硬件以产生更好的系统性能.
虚拟化技术通过在同一个硬件主机上多路复用虚拟机的方式来共享昂贵的硬件资源
硬件虚拟化:
硬件虚拟化分为:全虚拟化和基于主机的虚拟化.
全虚拟化不需要修改主机操作系统。它依赖于二进制翻译来陷入和虚拟化一些敏感,不可虚拟化的指令执行。客户操作系统和他们的应用由非临界和临界指令构成。
在基于主机的系统虚拟化中,主机操作系统和客户操作系统同时存在,虚拟化软件层处于两者之间。主机操作系统仍旧负责管理硬件。客户操作系统安装并运行在虚拟化层之上。特定的应用可运行在虚拟机中。
半虚拟化:
半虚拟化需要修改客户操作系统。半虚拟化虚拟机在用户程序中提供了特殊的API,要求真正修改操作系统.
完全虚拟化:
xen的完全虚拟化与半虚拟化的区别是,完全虚拟化需要cpu支持硬件虚拟化,而半虚拟化不需要cpu支持硬件虚拟化。
也就是,cpu支持了硬件虚拟化,xen配置完成后就是完全虚拟化,cpu不支持就是半虚拟化。
三种实现技术:1、模拟软件 emulation 通过模拟器模拟所有的指令,不通知虚拟化出来的操作系统 它的运行环境.
2、虚拟化一部分特权指令或者使用二进制日志转换技术。
3、让cpu支持硬件虚拟化。
被虚拟化出来的操作系统上执行的指令,会运行在被虚拟化出来的硬件上,就是完全虚拟化。
CPU,内存和I/O设备的虚拟化
VMM(虚拟机监视器),它负责管理计算机系统的硬件资源.每次应用程序访问硬件时,VMM都会捕获该访问请求
CPU、内存和I/O设备的虚拟化
为支持虚拟化,处理器利用硬件辅助虚拟化,引入一种特殊的运行模式和指令,使得 VMM和客户操作系统可运行在不同模式中,客户操作系统及其应用程序的所有敏感指令会陷入到VMM中。
虚拟化的硬件支持
现代操作系统和处理器允许多个进程同时运行.如果处理器中没有保护机制,那么不同进程的所有指令都可以直接访问硬件,很容易导致系统崩溃.因此,所有处理器都至少需要两种模式(用户模式和管理模式)来确保对临界区硬件的受控访问.运行在管理模式的指令称为特权指令,其他指令为非特权指令。
CPU虚拟化
虚拟机的非特权指令直接在物理主机中运行
关键指令可以分为三类:特权指令、控制敏感指令和行为敏感指令.特权指令需要在特权模式中执行,当在特权模式之外执行特权指令时会发生陷入。控制敏感指令尝试改变使用资源的配置.行为敏感指令根据资源的配置情况会有不同的行为,包括在虚拟内存中进行的负载和存储操作.
VMM运行在管理模式时,CPU支持在用户模式运行虚拟机的特权指令和非特权指令,则该CPU体系结构是可虚拟化的。RISC的所有控制敏感指令和行为敏感指令都是特权指令,RISC的CPU体系结构是天然可虚拟化的。
内存虚拟化
客户操作系统和VMM分别维护从虚拟内存到物理内存的映射和从物理内存到机器内存的映射,共两级映射.客户操作系统仍旧负责从虚拟地址到虚拟机的物理内存地址的映射,VMM负责将客户物理内存映射到实际的机器内存上
I/O虚拟化
I/O虚拟化包括管理虚拟设备和共享的物理硬件之间I/O请求的路由选择.
实现I/O虚拟化有三种方式:
全设备模拟: 一个设备的所有功能或总线结构(如设备枚举、识别、中断和DMA)都可以在软件中复制。
半虚拟化: 是Xen所采用的方法,是广为熟知的分离式驱动模型,由前端驱动和后端驱动两部分构成.前端驱动运行在Domain U中,而后端驱动运行在Domain 0中,它们通过一块共享内存交互。
直接I/O虚拟化: 让虚拟机直接访问设备硬件.它能获得近乎本地的性能,并且CPU开销不高。
6. KVM实现原理(怎样实现硬件虚拟化的监控),内存虚拟化的基本机制,I/O虚拟化实现方式
KVM的实现原理:
KVM是一个基于Linux的半虚拟化系统,是Linux2。6.20内核的一部分。内存管理和调度由存在的Linux内核执行,KVM则负责其余部分,这使得KVM比其他需要控制整个机器的hypervisor简单许多。KVM是一个基于硬件辅助的半虚拟化工具,对性能进行了改进,且支持未修改的客户操作系统,如Windows,Linux,Solaris和其他Unix变种。
CPU,内存和I/O设备的虚拟化
VMM(虚拟机监视器),它负责管理计算机系统的硬件资源。每次应用程序访问硬件时,VMM都会捕获该访问请求
CPU、内存和I/O设备的虚拟化
为支持虚拟化,处理器利用硬件辅助虚拟化,引入一种特殊的运行模式和指令,使得 VMM和客户操作系统可运行在不同模式中,客户操作系统及其应用程序的所有敏感指令会陷入到VMM中。
虚拟化的硬件支持
现代操作系统和处理器允许多个进程同时运行。如果处理器中没有保护机制,那么不同进程的所有指令都可以直接访问硬件,很容易导致系统崩溃。因此,所有处理器都至少需要两种模式(用户模式和管理模式)来确保对临界区硬件的受控访问。运行在管理模式的指令称为特权指令,其他指令为非特权指令。
CPU虚拟化
虚拟机的非特权指令直接在物理主机中运行
关键指令可以分为三类:特权指令、控制敏感指令和行为敏感指令。特权指令需要在特权模式中执行,当在特权模式之外执行特权指令时会发生陷入。控制敏感指令尝试改变使用资源的配置。行为敏感指令根据资源的配置情况会有不同的行为,包括在虚拟内存中进行的负载和存储操作。
VMM运行在管理模式时,CPU支持在用户模式运行虚拟机的特权指令和非特权指令,则该CPU体系结构是可虚拟化的。RISC的所有控制敏感指令和行为敏感指令都是特权指令,RISC的CPU体系结构是天然可虚拟化的.
I/O虚拟化
I/O虚拟化包括管理虚拟设备和共享的物理硬件之间I/O请求的路由选择。
内存虚拟化
客户操作系统和VMM分别维护从虚拟内存到物理内存的映射和从物理内存到机器内存的映射,共两级映射。客户操作系统仍旧负责从虚拟地址到虚拟机的物理内存地址的映射,VMM负责将客户物理内存映射到实际的机器内存上
内存虚拟化机制
客户操作系统和VMM分别维护从虚拟内存到物理内存的映射和从物理内存到机器内存的映射,共两级映射。进一步,也应该支持MMU虚拟化,并且对客户操作系统透明,客户操作系统仍旧负责从虚拟地址到虚拟机的物理内存地址的映射,但是客户操作系统并不能直接访问实际硬件内存,VMM负责将客户物理内存映射到实际的机器内存上。
8、I/O虚拟化实现方式
I/O虚拟化包括管理虚拟设备和共享的物理硬件之间I/O请求的路由选择.
实现I/O虚拟化有三种方式:
全设备模拟: 一个设备的所有功能或总线结构(如设备枚举、识别、中断和DMA)都可以在软件中复制。
半虚拟化: 是Xen所采用的方法,是广为熟知的分离式驱动模型,由前端驱动和后端驱动两部分构成.前端驱动运行在Domain U中,而后端驱动运行在Domain 0中,它们通过一块共享内存交互.
直接I/O虚拟化: 让虚拟机直接访问设备硬件。它能获得近乎本地的性能,并且CPU开销不高。
内存虚拟化的页表机制
由于客户操作系统的每个页表在VMM中都有一个独立页表与之对应,VMM中的页表称为影子页表。嵌套的页表在虚拟内存系统中额外增加了一层映射。MMU负责由操作系统定义的虚拟地址到物理地址的转换。然后,使用Hypervisor定义的其他页表将物理内存地址转换为机器地址.VMware使用影子页表进行虚拟内存到机器内存的地址转换.当客户操作系统修改了虚拟内存到物理内存的映射时,VMM会及时更新影子页表.
4. 内存迁移的实现功能
内存的迁移实现的功能
内存迁移在虚拟机迁移时很重要,因此内存迁移一个重要的功能是实现虚拟机的迁移,可以将虚拟机的内存实例从一个物理节点迁移至另一个物理节点
5. 云平台处理的应用类型
6. 互联网配置云系统的方式(……私有云,)
公有云、私有云、混合云
7. 单一系统镜像包括哪些内容
(1) 单系统镜像特征:单一系统 、单一控制、对称性、位置透明性
(2) 单系统镜像(SSI)包括单一入口、单文件层次、单一I/O空间、单一网络机制、单一控制点、单一作业管理系统、单一内存空间和单一进程空间.
(3) SSI额外特征:
单一作业管理系统 所有集群作业能够由任意节点提交到单一作业管理系统.
单一用户接口 用户通过单一图形界面使用集群。
单一进程空间 各节点的所有用户进程形成单一进程空间,并且共享统一进程认证机制。
SSI集群化的中间件 在集群应用的三个层次上,中间件支持各种SSI特征.
管理级 该级处理用户应用程序,并且提供
作业管理系统。
编程级 该级提供单一文件层次(NFS、xFS、
AFS、Proxy)和分布式共享内存
实现级 该级支持单一进程空间、检查点机
制、进程迁移和单一I/O空间.
8. 虚拟化软件层的基本功能
虚拟化实现的层次
引入虚拟化后,不同用户应用程序由自身的操作系统(即客户操作系统)管理,并且那些客户操作系统可以独立于主机操作系统同时运行在同一个硬件上,这通常是通过新添加一个称为虚拟化层的软件来完成,该虚拟化层称为hypervisor或虚拟机监视器(Virtual Machine Monitor,VMM)
指令集体系结构级:代码解释和动态二进制翻译
硬件抽象级:虚拟化一个计算机硬件资源
操作系统级:在单一物理服务器上创建隔离的容器和操作系统实例
库支持级:库接口的虚拟化
应用程序级:进程级虚拟化、高级语言
(High Level Language,HLL)虚拟机
虚拟化软件层的主要功能是将一个主机的物理硬件虚拟化为可被各虚拟机互斥使用的虚拟资源。(这可以在不同的操作层实现)
虚拟化软件通过在计算机系统的不同层插入虚拟化层来创建虚拟机抽象.通常的虚拟化层包括指令集体系结构(Instruction Set Architecture,ISA)级、硬件抽象级、操作系统级、库支持级和应用程序级
编程题
Word count传统串行处理方式
//没有读取文件
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package wordcount;
import java。util.*;
/**
*
* @author PANJINTIAN
*/
public class WordCount {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String[]text=new String[]{”hello world","hello every one”,
”say hello to every one in the world"
};
Hashtable ht=new Hashtable();
for(int i=0;i<3;i++)
{
StringTokenizer st=new StringTokenizer(text[i]);
while(st.hasMoreTokens())
{
String word=st。nextToken();
if(!ht。containsKey(word))
{
ht。put(word, new Integer(1));
}
else
{
int wc=((Integer)ht。get(word))。intValue()+1;
ht。put(word, new Integer(wc));
}
}
}
for(Iterator itr=ht。keySet()。iterator();itr.hasNext();)
{
String word=(String)itr.next();
System。out。print(word+":"+(Integer)ht。get(word)+”; ”);
}
}
}
读取文件并且打印数量最多的前三个:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor。
*/
package wordcount;
import java。util。*;
import java。io。*;
/**
*
* @author PANJINTIAN
*/
public class WordCount {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
FileReader fr=null;
try{
fr=new FileReader(”C:\\Users\\PANJINTIAN\\Desktop\\wordCount。txt”);
}
catch(IOException e)
{
System。out。println("can not read the file。”);
}
BufferedReader bf=new BufferedReader(fr);
Hashtable ht=new Hashtable();
String s=null;
try{
while((s=bf。readLine())!=null)
{
StringTokenizer st=new StringTokenizer(s);
while(st。hasMoreTokens())
{
String word=st。nextToken();
if(!ht。containsKey(word))
{
ht.put(word, new Integer(1));
}
else
{
int wc=((Integer)ht.get(word))。intValue()+1;
ht。put(word, new Integer(wc));
}
}
}
int max=0;
int fmax[]=new int[3];
String fword[]=new String[3];
int number;
String key=null;
String Mword=null;
for(int i=0;i<3;i++)
{
for(Iterator itr=ht。keySet()。iterator();itr。hasNext();)
{
key=(String)itr。next();
number=(Integer)ht.get(key);
if(number〉=max)
{
max=number;
Mword=key;
}
}
fmax[i]=max;
fword[i]=Mword;
ht。remove(Mword);
max=0;
}
for(int i=0;i〈3;i++)
{
System.out。println(fword[i]+":”+fmax[i]);
}
}
catch(IOException e)
{
System。out。println("error happens in reading file");
}
}
}
从文件读入文本并将结果写入另外一个文件中
/*
* To change this template, choose Tools | Templates
* and open the template in the editor。
*/
package wordcount;
import java.util.*;
import java。io。*;
/**
*
* @author PANJINTIAN
*/
public class WordCount {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
FileReader fr=null;
FileWriter fw=null;
String key=null;
String value=null;
String record=null;
try{
fr=new FileReader("C:\\Users\\PANJINTIAN\\Desktop\\wordCount。txt”);
}
catch(IOException e)
{
System。out.println(”can not read the file。");
}
try
{
fw=new FileWriter(”C:\\Users\\PANJINTIAN\\Desktop\\result。txt”,true);
}
catch(IOException e)
{
System。out。println(”could not open the file");
}
BufferedReader bf=new BufferedReader(fr);
BufferedWriter bw=new BufferedWriter(fw);
Hashtable ht=new Hashtable();
String s=null;
try{
while((s=bf。readLine())!=null)
{
StringTokenizer st=new StringTokenizer(s);
while(st。hasMoreTokens())
{
String word=st。nextToken();
if(!ht。containsKey(word))
{
ht。put(word, new Integer(1));
}
else
{
int wc=((Integer)ht.get(word)).intValue()+1;
ht.put(word, new Integer(wc));
}
}
}
for(Iterator itr=ht.keySet()。iterator();itr。hasNext();)
{
key=(String)itr.next();
value=ht.get(key)。toString();
record=key+” ”+value;
bw.write(record);
bw。newLine();
bw.flush();
}
bf。close();
bw。close();
fr。close();
fw。close();
}
catch(IOException e)
{
System。out。println(”error happens in reading file”);
}
}
}
并行运算:
import java.io。IOException ;
import java.util。String Tokenizer;
import org.apache.hadoop.conf。Configuration
import org。apache.hadoop。fs。Path;
import org.apache。hadoop.io。IntWritable;
import org。apache。hadoop。io。Text;
import org.apache.hadoop.mapreduce。Job;
import org。apache。hadoop.mapreduce。Mapper;
import org.apache。hadoop.mapreduce。Reducer;
import org.apache.hadoop.mapreduce。lib。input。FileInputFormat;
import org。apache。hadoop。mapreduce。lib。output。FileOutputFormat;
import org。apache.hadoop。util。GenericOptionsParser;
public class WordCount
{
public static class TokenizerMapper extends Mapper〈Object,Text,Text,IntWritable〉
{
private final static IntWritable one=new IntWritable(1);//建立一个int变量one,初值为1
private Text word=new Text();//建立一个String 变量Word,用于接收传入的文本
public void map(Object key,Text value,Context context)throws IOException,InterruptedException
{//实现map函数
StringTokenizer itr=new StringTokenizer(value。toString());//将输入的文本转换为字符串类型
while(itr。hasMoreTokens()){
word。set(itr。nextToken());//word(Text)对象赋值
context。write(word,one);//将分析结果对写入
}
}
}
public static class IntSumReducer extends Reducer〈Text,IntWritable,Text,IntWritable〉{
private IntWritable result=new IntWritable();
public void reduce(Text key,Iterable〈IntWritable〉values,Context context)throws IOException,InterruptedException{
int sum=0;
for(IntWritable val:values)
{
sum=sum+val。get();
}
result.set(sum);
context。write(key,result);
}
}
public void main(String []args)throws Exception{
Configuration conf=new Configuration();
String[]otherArgs=new GenericOptionsParser(conf,args)。getRemainingArgs();
if(otherArgs。length!=2)
{
System。err.println(“Usage:wordcount〈in〉〈out>”);
System。exit(2);
}
Job job=new Job(conf,"word count”);//建立新Job
job。setJarByClass(WordCount。class);//注册类
job。setMapperClass(TokenizerMapper。class);
job.setCombinerClass(IntSumReducer.class);
job。setReducerClass(IntSumReducer。class);
job。setOutputKeyClass(Text。class);
job。setOutputValueClass(IntWritable。class);
FileInputFormat。addInputPath(job,new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job,new Path(otherArgs[1]));
System。exit(job。waitForCompletion(true)?0:1);//主方法等待任务完成
}
}
展开阅读全文