1.什么是云计算?
云=海量存储+规模计算。
云计算是一种按使用量付费的模式,提供可用的,便捷的,按需的网络访问,进入可配置的资源池(包括服务器,存储,网络,应用程序,服务),这些资源能够快速提供,只需要投入少量的管理工作,或与服务商进行很少的交互。
2.云计算的基本特征
(1)按需,自服务:根基自己的实际需求请求云服务时间和容量,无需与云服务商进行交互。
(2)泛在网络访问:云端服务通过互联网向客户提供。
(3)资源池:大规模数据中心的计算,存储和网络资源。
(4)快速弹性服务:云端服务内容可自动,快速满足客户的弹性请求增加或减少。
(5)服务可计量:云服务提供商优化管理利用效率,并向客户按照一定的标准收费
3.云计算的三种模式
(1)软件即服务:用户直接使用云服务商提供的基于云基础设施上的应用程序。如Gmail
(2)平台即服务:用户使用云服务商提供的工具和库创建开发云应用程序,如goole app
(3)基础架构即服务:直接提供计算、存储、网络等基础计算资源,如阿里云
4.云计算部署模型
(1)公有云:云资源由云服务商所拥有,并允许公众使用。
(2)私有云:云资源仅供单个组织内部成员使用,资源管理者可以是组织本身也可以是第三方。
(3)社区云:通过对区域内部各种计算能力进行统一服务形式的整合,结合社区内的用户需求共性,实现面向区域用户需求的云计算服务模式。
(4)混合云:融合了公有云和私有云,由于安全性和控制原因,并非所有企业信息都能放在公有云上,这样大部分应用云计算的企业将会使用混合云模式。
5.SDN(software define networking)软件定义网络:
SDN是Emulex网络一种新型网络创新架构,是网络虚拟化的一种实现方式,其核心技术OpenFlow通过将网络设备控制面与数据面分离开来,从而实现了网络流量的灵活控制,使网络作为管道变得更加智能。
SDN(Software Defined Network)即软件定义网络,是一种网络设计理念,或者一种推倒重来的设计思想。只要网络硬件可以集中式软件管理,可编程化,控制转发层面分开,则可以认为这个网络是一个SDN网络。
(1)实现了数据平面和控制平面的分离
(2)提供了可控制数据平面的可编程接口
(3)实现中心式控制和更高级的抽象能力,使得网络系统控制变得简单。
6.多播排序
先入先出排序:从同一发送方发出的多播消息以发送顺序被接收,不考虑不同发送方发出的多播消息的顺序,
因果排序:存在因果关系的多播消息必须因果顺序被接收方交付,因果排序一定是先入先出排序。
全序排序:所有节点按照相同顺序接收消息。
7异步系统一致性问题
异步系统的一致性问题是不可解的问题,因为异步系统中无法区分一个节点是发生了故障还是只是非常慢而已。
(1)n个节点
(2)每个节点p:
输入变量Xp:初始化为0或者1
输出变量Yp :仅被赋值一次,0或者1.
(3)一致性问题,是否能设计分布式协议,最终使得:
要么所有节点都设置其输出变量为0。
要么所有节点都设置其输出变量为1.
8.为什么基于“推”的Gossip传播比基于”拉”的慢?
在第r轮,K个临近节点
P(r):第r轮未被感染的概率。
基于拉的:P(r+1)=p(r)*p(r)^k=p^k+1(r+1)
基于推的:P(r+1)=p(r)*(1-k/n)^n(1-p(r))
很明显基于推的比基于了拉的收敛的慢,基于“推”的Gossip传播比基于”拉”的慢。
9时间戳:
Lamport时间戳:目的:为每个事件分配逻辑时间戳,时间戳满足先后顺序。(不能识别并发事件)
Vector时间戳:每个处理节点使用整型向量时间戳。(遵循发生顺序,能识别并发事件)
10.Paxos协议
(1)多轮->每轮三阶段
(2)广泛使用于异步系统
(3)提供安全性和最终活性:
安全:任何了俩个节点不会做出不同的决定,坏事不会发生
最终活性:如果一切顺利一段时间后,很可能使各个节点最终达成一致。(不做保证,好事可能会最终发生)
-
每一轮都有计数id
-
不要求时间严格的同步
如果你正处在第J轮,却收到第J+1轮的消息,那么放弃一切操作,直接进入第j+1轮,使用超时机制。
-
每轮被分为三个阶段(同样是异步)
阶段一:选举:选取一个leader(id最大的超过一半节点ok)。
阶段二:提案:leader多播一个提案,其他节点收到消息后确认。
阶段三:决定:leader多播最终决定。
11.hadoop调度问题:FIFO调度器和Fair调度器
(1)FIFO是hadoop默认的调度算法
它支持5个优点等级,任务按照优先等级和提交时间顺序排序。第一步先选择最高等级的任务列表,第二步选择该列表下最早提交的任务。选择任务后将map任务调度到离目标最近的Datanode上。
任务调度的目标位置:提高数据的本地行以减少通信时间。缺点是当出现大任务时短任务响应时间过慢。
(2) Fair调度器 :设计动机是,在多用户共享的hadoop环境下,使得短任务也可以获得较快的响应时间。
-
任务分组形成pools
-
每个pools被分配一个最低资源分配量(按照一定的分配策略分配)
-
多余的资源被平均分配给各个资源pool
新任务提交时,新到的任务被调度到空闲机器上。
为保证每个任务都得到相应的资源,Fair调度器使用俩个计时器:
Tmin:用于保证得到最小资源分配量
Tfair : 用于保证得到公平资源分配量(Tmin<Tfair)
如果在时间Tmin到期之前不能得到最低资源分配量,则强制停止其他pool中的某任务。重新分配资源。
强制停止任务时,如果在时间Tfair到期之前不能得到公平资源分配量。则强制停止更多任务,重新分配资源。
强制停止任务时,一般选择超过资源分配额度的pool最后被提交执行的任务,以减少计算的浪费。
Fair调度器的问题:严格的fair调度器的实现会降低数据本地行。同时因为reduce的任务需要等待map的输出结果才能开始运行,长时间的等待会导致资源的空闲,因此导致资源的浪费。
12.FAT_TREE胖树
三层:核心层 聚合层 服务器层
俩种扩展网络拓扑规模的方法:1.增加层数2.增加每个交换机的端口数
假设每个交换机96个端口
则服务器数:48*48*96
聚合层交换机数:48*2*96
核心层交换机数:48*48*96/96
13. GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务。
(假设与目标:
硬件出错是正常而非异常,主要用于程序处理批量数据,而非与用户的小量和随机读写,需要存储大尺度的文件)。
GFS将整个系统的节点分为三类角色:Client(客户端)、Master(主服务器)和Chunk Server(数据块服务器)
Client客户端:应用程序访问接口,与主服务器和数据块服务器通信。
Master主服务器:管理节点,控制中枢,存储元数据
ChunkServer数据块服务器:以普通linux文件的形式存储数据。
实现机制:客户端首先访问Master节点,获取交互的chunk server信息,然后访问这些chunk server,完成数据存取工作。这种设计方法实现了控制流和数据流分离。
Client与master之间只有控制流,而无数据流,极大的降低了Master的负载。
Client与chunk server 之间直接传输数据流,同时由于文件被分成多个chunk 进行分布式存储,client可以同时访问多个chunk server ,从而使整个系统的i/o高度并行,系统整体性能得到提高。
最小化主服务器参与度:
数据传输和控制流分离,提高网络利用效率。
数据块大小64mb大数据快能减少寻址开销;能保持较长时间的tcp连接通信,减少网络开销;减少主服务器上的元数据存储量。
设计特点:
1采用中心服务器模式
2数据副本提高可靠性(默认3副本)
3在用户态下实现、
4只提供专用接口
publicvoid map(Object key, Text value, Context context) throws IOException,InterruptedException {
StringTokenizer stk = newStringTokenizer(value.toString(),delimiters);
while(stk.hasMoreTokens()){
String e =stk.nextToken().trim().toLowerCase();
if(stopWords.contains(e) ==false){
context.write(newText(e),new IntWritable(1));
}
}
}
publicvoid reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException {
int sum = 0;
for(IntWritable e : values){
sum += e.get();
}
context.write(key, newIntWritable(sum));
}
packageorg.jediael.hadoopdemo.wordcount;
importjava.io.IOException;
importjava.util.StringTokenizer;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.IntWritable;
importorg.apache.hadoop.io.LongWritable;
importorg.apache.hadoop.io.Text;
importorg.apache.hadoop.mapreduce.Job;
importorg.apache.hadoop.mapreduce.Mapper;
importorg.apache.hadoop.mapreduce.Reducer;
importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
importorg.apache.hadoop.mapreduce.lib.input.TextInputFormat;
importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
publicclass WordCount {
public static class WordCountMapextends
Mapper<LongWritable, Text, Text,IntWritable> {
private final IntWritable one = newIntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Textvalue, Context context)
throws IOException,InterruptedException {
String line =value.toString();
StringTokenizer token = newStringTokenizer(line);
while (token.hasMoreTokens()){
word.set(token.nextToken());
context.write(word, one);
}
}
}
public static class WordCountReduceextends
Reducer<Text, IntWritable, Text,IntWritable> {
public void reduce(Text key,Iterable<IntWritable> values,
Context context) throwsIOException, InterruptedException {
int sum = 0;
for (IntWritable val : values){
sum += val.get();
}
context.write(key, newIntWritable(sum));
}
}
public static void main(String[] args)throws Exception {
Configuration conf = newConfiguration();
Job job = new Job(conf);
job.setJarByClass(WordCount.class);
job.setJobName("wordcount");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(WordCountMap.class);
job.setReducerClass(WordCountReduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, newPath(args[0]));
FileOutputFormat.setOutputPath(job, newPath(args[1]));
job.waitForCompletion(true);
}
}