您好,欢迎来到要发发知识网。
搜索
您的当前位置:首页正文

武汉理工云计算重点

来源:要发发知识网
一、云计算

1. 云计算定义:云计算是一种商业计算模型。它将计算任务分布在大量计算机构成的资源

池上,使各种应用系统能够根据需要获取计算力、存储空间和信息服务。 2. 云计算特点:

1)超大规模:服务器群;

2)虚拟化:可以看作是一片用于计算的云; 3)高可靠性:冗余副本、负载均衡; 4)通用性:支撑千变万化的实际应用; 5)高可扩展性:灵活、动态伸缩; 6)按需服务:按需购买;

7)极其廉价:不再需要一次性购买超级电脑; 8)安全:摆脱数据丢失、病毒入侵 ; 9)方便:支持多终端、数据共享。 云计算分类:

1、SaaS(Software as a Service):将软件作为服务 2、PaaS(Platform as a Service):将平台作为服务 3、IaaS(Infrastructure as a Service):将基础设施作为服务 并行计算:同时使用多种计算资源解决计算问题的过程

分布式计算:将需要巨大计算能力的问题分成许多小部分进行处理,最后综合结果 网格计算:在动态、多机构参与的虚拟组织中协同共享资源和求解问题 云计算与网格计算比较:(考简答可能性低)

二、谷歌云平台

(一)GFS

1. 设计目标

(1)高性能(performance);(2)可扩展(scalability); (3)高可靠性(reliability);(4)高可用(availability); 2. 系统架构

Client客户端:应用程序的访问接口

Master主服务器:管理节点,在逻辑上只有一个,保存系统的元数据,负责整个文件系统的管理

Chunk Server数据块服务器:负责具体的存储工作。数据以文件的形式存储在Chunk Server上

3. 特点(成本、可靠性、性能的平衡)

4. 容错: 1.Master容错

1) 2) 3)

单个Master,对于前两种元数据,GFS通过操作日志来提供容错功能 第三种元数据信息保存在各个Chunk Server上,Master故障时,磁盘恢复 GFS还提供了Master

远程的实时备份,防止Master彻底死机的情况 2.Chunk Server容错 1)每一个Chunk有多个存储副本(默认为三个),分布存储在

不同的Chunk Server上用户态的GFS不会影响Chunk Server的稳定性

2)副本的分布策略需要考虑多种因素,如网络的拓扑、机架的分布、磁盘的利用率等 3)对于每一个Chunk,必须将所有的副本全部写入成功,才视为成功写入

尽管一份数据需要存储三份,好像磁盘空间的利用率不高,但综合比较多种因素,加之磁盘的成本不断下降,采用副本无疑是最简单、最可靠、最有效,而且实现的难度也最小的一种方法。

(二)Chubby Lock

1. Chubby系统提供粗粒度的分布式锁服务,它基于松耦合分布式系统的可靠设计。 2. Chubby的使用者不需要使用复杂的同步协议,二是直接调用Chubby的锁服务,即可

保证数据操作的一致性。

同时这种锁服务是建议性的,而非强制性的,这样能带来更大的灵活性。 3. Chubby具有广泛的应用场景,例如:(1)GFS选主服务器;(2)BigTable中的表锁; 4. Chubby系统分为两个重要组件:

(1)Chubby库:客户端通过调用Chubby代码库,申请锁服务,并获取相关信息,同时通过租约保持与服务器的连接;

(2)Chubby服务器组:一个服务器组一般由五台服务器组成,其中一台master,服务维护与客户端的所有通信;

其他服务器不断和主服务器通信,获取用户操作。Chubby服务器组的所有机器都会执行用户操作,并将数据存放到文件系统。

5. Chubby文件系统类似于简单的unix文件系统,但它不支持文件移动操作与硬连接。

文件系统由许多Node组成,每个Node代表一个文件,或者一个目录。 文件系统使用Berkeley DB来保存每个Node的数据。 (三)Bigtable

BigTable是一个分布式的结过婚数据存储系统,它存储着PB级别的数据。 BigTable的设计目标是:(1)适用性广;(2)扩展方便;(3)简单性;(4)高可用; 在Bigtable中Chubby主要有以下几个作用:

(1)选取并保证同一时间内只有一个主服务器(Master Server)。 (2)选取子表的位置信息

(3)保存Bigtable的模式信息及访问控制列表。

三、AWS

Amazon云计算核心技术

1. 弹性计算云EC2 2. 简单存储服务S3

3. 简单数据库服务Simple DB 4. 简单队列服务SQS 5. 弹性MapReduce服务 6. 内容推送服务CloudFront 7. 电子商务服务DevPay 8. 灵活支付服务FPS

(一)Dynamo

核心思想:

Dynamo是一个去中心化的系统,它只需要很少很少的人工管理。存储节点的添加、删除,不需要任何手工划分或重新分配并提供最终一致性(eventually-consistent)保证。 Dynamo需要解决的主要问题及先关技术:

数据均衡分布:Dynamo采用改进的一致性哈希算法,每个节点只需处理落在它和它的前驱节点之间的数据,这样增/删节点时系统震荡少。Dynamo中冗余存储(备份)数据保存在环上顺时针方向的后继节点中。写操作的时候采用了优化的方式,保证一个副本必须写入硬盘,其他副本只要写入节点内存即返回成功。这样既保证了副本的数量又减少了延时。 数据冲突问题:Dynamo牺牲一致性来换取系统的可靠性和可用性,因此Dynamo采用了一致性模型来解决数据冲突(不在意数据更新过程中的一致性问题,只要最终所有数据副本能保证一致即可) 容错机制:

临时故障处理:Hinted Handoff

Dynamo为了提高系统可用性,使用乐观方式仲裁读写。

读写都不会因为节点失效或网络故障而失败,只有所有节点都失效时读写才会被拒绝。 永久性故障处理:副本同步

Dynamo实现了反熵(anti-entropy)或叫副本同步的协议。

Dynamo采用MerkleTree,一种哈希树来存储key的信息,树的比对能轻易的了解副本是否同步;

每个节点维护一个单独的MerkleTree,树的比对也能轻易的找出不同步的key;方案的缺点是,当有节点加入或离开系统时,许多key会发生变化,需要对树进行重新计算。

(二)S3

对象:数据和元数据(描述数据的数据:last-modified,E-tag,Content-Type,Content-Length)

键:对象的唯一标识符

桶:存储对象容器(最多创建100个桶,不限桶中文件数量) S3系统采用冗余存储

优势:某些服务器出现故障时用户仍然可以对其数据进行操作 弊端:用户在操作时可能会出现如下几种情况 (读脏数据)

1. 一个进程写入一个新的对象并立即尝试读取它,但在该改变被传送到S3的多个服务器前,服务器对该操作可能返回“键不存在”

2. 一个进程写入一个新的对象并立即尝试列出桶中已有的对象,但在该改变被传送到S3的多个服务器前,该对象很可能不会出现在列表中

3. 一个进程用新数据替换现有的对象并立即尝试读取它,但在该改变被传送到S3的多个服务器前,S3可能会返回以前的数据

4. 一个进程删除现有的对象并立即尝试读取它,但在该改变被传送到S3的多个服务器前,S3可能会返回被删除的数据

5. 一个进程删除现有的对象并立即尝试列出桶中的所有对象,但在该改变被传送到S3的多个服务器前,S3可能会列出被删除的对象

出现这些现象是因为S3为了保证用户数据的一致性而采取的一种折中手段,即在数据被充分传播到所有的存放节点之前返回给用户的仍是原数据

安全措施:

1)身份认证:基于HMAC-SHA1的数字签名方式来确定用户身份

2)访问控制列表ACL :S3提供的可供用户自行定义的访问控制策略列表

(三)CloudFront

CloudFront——一个基于Amazon云计算平台实现的内容分发网络(Content Delivery Network,CDN)

CDN通过将网站内容发布到靠近用户的边缘节点,使不同地域的用户在访问相同网页时可以就近获取。这样既可以减轻源服务器的负担,也可以减少整个网络中流量分布不均的情况,进而改善整个网络性能

四、Windows Azure

1. Windows Azure 属于PaaS模式 2. Windows Azure平台组成部分:

1) Windows Azure:最底层,提供了一个在微软数据中心服务器上运行应用程序和存储数据的Windows环境

2) SQL Azure:云中关系数据库,为云中基于SQL Server的关系型数据提供服务 3) Windows Azure AppFabric:为在云中或本地系统中的应用提供基于云的基础架构服务。部署和管理云基础架构的工作均由AppFabric完成,开发者只需要关心应用逻辑。 4) Windows Azure Marketplace:为购买云计算环境下的数据和应用提供在线服务 3. Windows Azure操作系统组成部分:

计算服务、存储服务、Fabric控制器、内容分发网络CDN、Windows Azure Connect 4. SQL Azure关键技术:

1) SQL Azure数据库:SQL Azure支持TDS和Transact-SQL,核心的数据库功能 2) SQL Azure数据报表服务:

3) SQL Azure数据同步:提高存储数据的访问性能,同时确保网络发生故障时应用仍然能够访问数据库

五、VMWare

1. VMware云战略三层架构 云基础架构及管理层(IaaS)

云基础架构及管理层由数据中心与云基础架构、安全产品、基础架构和运营管理三大部分组成。数据中心和基础架构是VMware云计算解决方案的基石

云应用平台层(PaaS)

VMware的云应用平台以SpringSource应用和VMware vSphere为基础,采用高级消息队列协议AMQP,具有无缝扩展的弹性数据管理技术和跨物理/虚拟环境可见性的性能监控和应用管理机制,并能实现私有云和公有云之间的迁移 桌面虚拟化产品(SaaS)

主要是基于桌面和应用程序虚拟化,提供了VMware ThinApp、VMware Workstation、VMware Fusion、Zimbra、VMware Player、WMware移动虚拟平台(MVP)及VMware ACE等产品 2. 虚拟化分类

虚拟化从结构上可以分为寄居架构和裸金属架构

寄居架构:在操作系统的层面之上进行虚拟机实现,如VMware Workstation 裸金属架构:在计算机硬件上直接进行虚拟化,是架设在计算机硬件和操作系统之间的虚拟化 ,如ESX Server

3. 三种虚拟化软件(参考)

Citrix XenServer,微软 Windows Server 2008 Hyper-V,VMware ESX Server VMware ESX重点于服务器虚拟化,技术较成熟,功能也多,支持虚机系统多; Xenserver重点在于桌面虚拟化,性价比高,网络性能好,适用于快速与大规模部署,支持系统也不少,但做桌面能发布出来的只有MS系统;

Hyper-V起步的最晚,目前貌似只支持MS自家的系统,属于服务器级的,Server08版自带功能,起步晚,但背靠大树好乘凉;

六、Hadoop

1. 定义

Apache开源组织的一个分布式计算框架,可以在大量廉价的硬件设备组成的集群上运行应用程序,为应用程序提供了一组稳定可靠的接口,旨在构建一个具有高可靠性和良好扩展性的分布式系统. 2. 组件

3. 起源(如图)

4. HDFS保障可靠性的措

施(简答)P192 1)冗余备份

每个文件存储成一系列数据块(Block),默认块大小为64MB(可配置)。为了容错,文件的所有数据块都会有副本(副本数量即复制因子,可配置) 2)副本存放

采用机架感知(Rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率 3)心跳检测

NameNode周期性地从集群中的每个DataNode接受心跳包和块报告,收到心跳包说明该DataNode工作正常 4)安全模式

系统启动时,NameNode会进入一个安全模式。此时不会出现数据块的写操作 5)数据完整性检测

HDFS客户端软件实现了对HDFS文件内容的校验和(Checksum)检查 6)空间回收

文件被用户或应用程序删除时,先把它移动到/trash目录里;只要还在这个目录里,文件就可以被迅速恢复 7)元数据磁盘失效

NameNode可以配置为支持维护映像文件和事务日志的多个副本,任何对映像文件或事务日志的修改,都将同步到它们的副本上 8)快照

快照支持存储某个时间的数据复制,当HDFS数据损坏时,可以回滚到过去一个已知正确的时间点。HDFS目前还不支持快照功能 5. Hadoop工作模式

1) 单机模式:默认情况下,Hadoop被配置成一个非分布式模式运行的独立Java进程,适合开始时做调试工作。

2) 伪分布式模式:可以在单节点上以伪分布式模式运行,用不同的Java进程模拟分布式运行中各类节点(NameNode、DataNode、JobTracker、TaskTracker、Secondary NameNode) 3) 完全分布式模式:在HDFS看来,节点分为NameNode和DataNode,其中NameNode只有一个,DataNode可以有多个;在MapReduce看来,节点又分为JobTracer和TaskTracker,其中JobTracer只有一个,TaskTracker可以有多个.NameNode和JobTracker可以部署在不同的机器上,也可以部署在同一台机器上,部署NameNode和JobTracker的机器是主服务器(master),其余都是从服务器(slaves)。

6. HDFS是一个主从结构的体系,HDFS集群有一个NameNode和很多个DataNode组成。

NameNode管理文件系统的元数据,DataNode存储实际的数据。P191 7. 两类调度服务P196

MapReduce框架是由JobTracker和TaskTracker这两类服务调度的。JobTracker是主控服务,只有一个,负责调度和管理TaskTracker,把Map任务和Reduce任务分配给空闲的TaskTrcker,让这些任务并行运行,并负责监控任务的运行情况。TskTracker可以有多个,负责执行任务。

8. MapReduce程序设计 1.

1) 对 2) 数据输入 3) Mapper阶段 4) Reducer阶段 5) 数据输出

package org.apache.hadoop.examples; import java.io.IOException; import java.util.*;

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{ private final static IntWritable one = new IntWritable(1); private Text word = new Text();

public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } }

public static class IntSumCombiner extends Reducer { private IntWritable result = new IntWritable();

public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { int sum = 0;

for (IntWritable val : values) { sum += val.get(); }

result.set(sum);

context.write(key, result); } }

public static class IntSumReducer extends Reducer {

Collection most = new hashSet(); int len;

private IntWritable result = new IntWritable();

public void setup(Context text) throws IOException,InterruptedException { }

public void reduce(Text key, Iterable values, Context context) throws

int sum = 0;

for (IntWritable val : values) { }

sum += val.get();

len = context.getConfigutation().getInt(\"N\读取TOP N

IOException, InterruptedException {

}

}

result.set(sum);

if(most.size < len) most.add(key,result);

for(Iterator i : most.iterator()) {//前N保存到HashSet }

IntWritable temp = (IntWritable) i; if(i.get() < result.get()) { }

most.remove(i.getKey()); most.add(key,result);

public void cleanup() { //收尾工作 排序并输出TOP N

Text[] keys = new Text[3];

IntWritable[] values = new IntWritable[3]; int i = 0; int j=len;

for(Iterator k:most.iterator()) { }

while (j-->0) { //冒泡排序 }

for (i=0;icontext.write(keys[i],values[i]); for(i=0;iif(values[i]IntWritable temp = values[i]; Text tempt = keys[i]; values[i] = values [i+1]; keys[i] = keys[i+1]; values[i+1] = temp; keys[i+1] = tempt;

keys[i] = (Text)k.getKey(); values[i] = (IntWritable)k; i++;

}

}

public static void main(String[] args) throws Exception { Configuration conf = new Configuration();

conf.setInt(\"N\定义

String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 2) {

System.err.println(\"Usage: WordCount \"); System.exit(2); }

Job job = new Job(conf, \"word count\"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumCombiner.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); } }

2. 矩阵相乘(整数矩阵)

左矩阵的一行和右矩阵的一列组成一个InputSplit,其存储b个对,key存储积矩阵元素位置,value为生成一个积矩阵元素的b个数据对中的一个;Map方法计算一个对的value中数据对的积;而Reduce方法计算key值相同的所有积的和 public class MatrixVectorCompute { public static class TokenizerMapper extends Mapper {

private Text lineNumber = new Text(); // 矩阵行序号 private static int i = 0;

private final static int[] vector = {2, 3, 4}; // 向量值

public void map(Object key, Text value, Context context) hrows IOException,

StringTokenizer itr = new StringTokenizer(value.toString());

InterruptedException {

int j = 0; // 向量序号 lineNumber.set(i + \"\"); while (itr.hasMoreTokens()) {

int result = vector[j] * Integer.parseInt(itr.nextToken()); IntWritable one = new IntWritable(result); context.write(lineNumber, one); j ++; }

i ++; } }

public static class IntSumReducer extends

Reducer { private IntWritable result = new IntWritable();

public void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException { int sum = 0;

for (IntWritable val : values) { sum += val.get(); }

result.set(sum);

context.write(key, result); } }

public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = new Job(conf, \"word count11\"); job.setJarByClass(MatrixVectorCompute.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(\"input\")); FileOutputFormat.setOutputPath(job, new Path(\"output\")); System.exit(job.waitForCompletion(true) ? 0 : 1); } }

3. 程序中的类

(1)matrix类用于存储矩阵

(2)IntPair类实现WritableComparable接口用于存储整数对

(3)matrixInputSplit类继承了InputSplit接口,每个matrixInputSplit包括b个对,用来生成一个积矩阵元素。key和value都为IntPair类型,key存储的是积矩阵元素的位置,value为计算生成一个积矩阵元素的b个数据对中的一个 (4)继承InputFormat的matrixInputFormat类,用来数据输入

(5)matrixRecordReader类继承了RecordReader接口,MapReduce框架调用此类生成对赋给map方法

(6)主类matrixMulti,其内置类MatrixMapper继承了Mapper重写覆盖了Map方法,类似地,FirstPartitioner、MatrixReducer也是如此。在main函数中,需要设置一系列的类,详细内容参考源码

(7)MultipleOutputFormat类用于向文件输出结果

(8)LineRecordWriter类被MultipleOutputFormat中的方法调用,向文件输出一个结果对 4. 程序的运行过程

(1)程序从文件中读出数据到内存,生成matrix实例,通过组合左矩阵的行与右矩阵的列生成a×c个matrixInputSplit

(2)一个Mapper任务对一个matrixInputSplit中的每个对调用一次Map方法对value1中的两个整数相乘。输入的对中key1和value1的类型均为IntPair,其输出为对,key1不变,value2为IntWritable类型,值为value1中的两个整数的乘积

(3)MapReduce框架调用FirstPartitioner类的getPartition方法将Map的输出< key1,value2>对分配给指定的Reducer任务

(4)Reducer任务对key1值相同的所有value2求和,得出积矩阵中的元素k的值。其输入为对,输出为对,key1不变,value3为IntWritable类型,值为key1值相同的所有value2的和。

(5)MapReduce框架实例化一个MultipleOutputFormat类,将结果输出到文件

因篇幅问题不能全部显示,请点此查看更多更全内容