1、分布式存储:是数据存储技术。它通过网络使用企业中每台机器的磁盘空间。这些分散的存储资源构成了虚拟存储设备,数据分布在企业的各个角落。分布式存储系统,它可以在多个独立的设备上分布数据。传统的网络存储系统采用集中式存储服务器来存储所有数据。存储服务器已成为制约系统性能的瓶颈和可靠性、安全性的焦点,已不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多个存储服务器共享存储负载,利用位置服务器定位存储信息,不仅提高了系统的可靠性、可用性和访问效率,而且易于扩展。
分布式系统:分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。 在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。系统中存在一个以全局的方式管理计算机资源的分布式操作系统。通常,对用户来说,分布式系统只有一个模型或范型。在操作系统之上有一层软件中间件(middleware)负责实现这个模型。一个著名的分布式系统的例子是万维网(World Wide Web),在万维网中,所有的一切看起来就好像是一个文档(Web页面)一样。
分布式系统和计算机网络系统的共同点是:多数分布式系统是建立在计算机网络之上的,所以分布式系统与计算机网络在物理结构上是基本相同的。
他们的区别在于:分布式操作系统的设计思想和网络操作系统是不同的,这决定了他们在结构、工作方式和功能上也不同。网络操作系统要求网络用户在使用网络资源时首先必须了解网络资源,网络用户必须知道网络中各个计算机的功能与配置、软件资源、网络文件结构等情况,在网络中如果用户要读一个共享文件时,用户必须知道这个文件放在哪一台计算机的哪一个目录下;分布式操作系统是以全局方式管理系统资源的,它可以为用户任意调度网络资源,并且调度过程是“透明”的。当用户提交一个作业时,分布式操作系统能够根据需要在系统中选择最合适的处理器,将用户的作业提交到该处理程序,在处理器完成作业后,将结果传给用户。在这个过程中,用户并不会意识到有多个处理器的存在,这个系统就像是一个处理器一样。
2、传统架构与SOA架构的区别和特点:
传统架构存在问题:1.模块之间耦合度太高,其中一个升级其他都得升级2.开发困难,各个团队开发最后都要整合一起3.系统的扩展性差4.不能灵活的进行分布式部署。5.不能有效的支持高并发。
分布式架构:与传统架构相比即把各个模块拆分成独立的子系统。优点:1.把模块拆分,使用接口通信,降低模块之间的耦合度2.把项目拆分成若干个子项目,不同的团队负责不同的子项目 3.增加功能时只需要在增加一个子项目,调用其它系统的接口就可以4.可以灵活的进行分布式部署。缺点: 系统之间交互需要使用远程通信,接口开发增加工作量
3、传统DC与SDDC区别:
1. 传统数据中心:
在这个网络技术快速发展的年代,设备更新迭代速度快,而传统的数据中心正在消耗大量的能源、空间和成本。对于传统的数据中心而言,数据中心运行时产生的高能耗、高成本、低效率、拓展性差成为现在面临的主要问题。拓展性也是一个不容忽视的问题,如添加新设备、应用增加、机房扩大、空调制冷增加等。所谓牵一发而动全身,如又增加了用电消耗,技术人员增加等问题也让随之而来。
2. 软件定义数据中心:
软件定义中心从最直观的定义来看,就是虚拟化软硬件资源、软件化数据中心的一切资源。软件定义数据中心就是在各种底层硬件架构上面搭建一个虚拟的基础硬件层(CPU、内存、网络等)。极大的提高了数据中心的伸缩性和性能问题,实现了数据中心的高效率、低成本、动态化、软件化。而随着数据库中心IT系统经历的一系列动态变化,网络、存储、硬件的虚拟化也是迅速崛起,随之出现了软件定义存储、网络等。软件定义数据中心在硬件资源上超越传统的抽象层,创建了一个包括云计算的简单工具包,软件定义数据中心为企业或个体提供自己的私有云,在托管数据时有更多的控制权。
传统数据中心的主要好处是
1、维护,
2、可用性,
3、用电管理,
4、使用电源,
5、数据备份
软件定义的数据中心的主要优势是:
1、节省时间,
2、灵活性和灵活性,
3、分析,
4、节约成本,
5、可靠性,
6、可扩展性
如果设备出现故障,传统数据中心及其技术生态系统很难处理。调试它需要很长时间。而SDDC是一台虚拟计算机,可帮助您快速定位和恢复控制器处理的所有项目以及丢失的数据。
Openstack:OpenStack 是一系列开源工具(或开源项目)的组合,主要使用池化虚拟资源来构建和管理私有云及公共云。其中的六个项目主要负责处理核心云计算服务,包括计算、网络、存储、身份和镜像服务。还有另外十多个可选项目,用户可把它们捆绑打包,用来创建独特、可部署的云架构。
Openstack逻辑架构: OpenStack包括若干个称为OpenStack服务的独立组件。所有服务均可通过一个公共身份服务进行身份验证。除了那些需要管理权限的命令,每个服务之间均可通过公共API进行交互、每个OpenStack服务又由若干组件组成。包含多个进程。所有服务至少有一个API进程,用于侦听API请求,对这些请求进行预处理,并将他们传送到该服务的其他组件。除了认证服务,实际工作都是由具体的进程完成的,至于一个服务的进程之间通信,则使用AMQP消息代理。服务的状态存储在数据库中。
4、虚拟机和容器的区别:
容器与虚拟机拥有着类似的使命:对应用程序及其关联性进行隔离,从而构建起一套能够随处运行的自容纳单元。此外,容器与虚拟机还摆脱了对物理硬件的需求,允许我们更为高效地使用计算资源,从而提升能源效率与成本效益。
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程,容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。
简单来说,容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。而容器的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更轻便。
容器是一个应用层抽象,用于将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行。与虚拟机相比,容器占用的空间较少,瞬间就能完成启动。
虚拟机是一个物理硬件层抽象,用于将一台服务器变成多台服务器。管理程序允许多个VM在一台机器上运行。每个VM都包含一整套操作系统,一个或多个应用,必要的二进制文件和库资源,因此占用大量空间。而VM启动也非常缓慢。
5、虚拟化技术的两种实现架构
目前分为两种,寄居架构(Hosted Architecture)和裸金属架构 (“Bare Metal” Architecture)。
寄居架构就是在操作系统之上安装和运行虚拟化程序,依赖于主机操作系统对设备的支持和物理资源的管理; 优点:简单,便于实现 缺点:安装和运行应用程序依赖于主机操作系统对设备的支持举例:VmwareWorkstation、 Citrix Virtualbox
裸金属架构就是直接在硬件上面安装虚拟化软件,再在其上安装操作系统和应用,依赖虚拟层内核和服务器控制台进行管理。优点:虚拟机不依赖于操作系统,可以支持多种操作系统,多种应用,更加灵活
缺点:虚拟层内核开发难度较大 举例: KVM、Vmware ESX等
6、SDN 相对于传统网络有些什么优势?
1、SDN可以改变传统网络下应用与网络紧耦合的烟囱式架构,提升网络资源池化的水平。
2、SDN网络与云平台对接,实现自动化部署配置,支持业务快速上线和灵活拓展
3、通过软件代替手工编排,实现网络服务自动化。
SDN 是将网络由硬变软,提升网络的集中控制能力,增强网络对虚拟化、云计算等新技术的适应性和支持度,最终提升网络对业务的服务、支撑能力
7、微服务架构
微服务( Microservices )架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制,这些服务围绕业务能力构建并可通过自动部署机制独立部署。微服务架构本质上仍然是一种分布式架构,也是面向服务架构的一种扩展。
软件架构的发展:从单体架构,垂直架构,SOA架构到微服务架构
单体架构:
特点:
1、所有的功能集成在一个项目工程中。2、所有的功能打一个war包部署到服务器。3、应用与数据库分开部署。4、通过部署应用集群和数据库集群来提高系统的性能。
优点:
1、项目架构简单,前期开发成本低,周期短,小型项目的首选。
缺点:
1、全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。2、系统性能扩展只能通过扩展集群结点,成本高、有瓶颈。3、技术栈受限。
垂直架构:
特点:
1、以单体结构规模的项目为单位进行垂直划分项目即将一个大项目拆分成一个一个单体结构项目。2、项目与项目之间的存在数据冗余,耦合性较大,比如上图中三个项目都存在客户信息。3、项目之间的接口多为数据同步功能,如:数据库之间的数据库,通过网络接口进行数据库同步。
优点:
1、项目架构简单,前期开发成本低,周期短,小型项目的首选。2、通过垂直拆分,原来的单体项目不至于无限扩大。3、不同的项目可采用不同的技术。
缺点:
1、全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。2、系统性能扩展只能通过扩展集群结点,成本高、有瓶颈。
SOA架构:
特点:
1、基于SOA的架构思想将重复公用的功能抽取为组件,以服务的方式给各各系统提供服务。2、各各项目(系统)与服务之间采用webservice、rpc等方式进行通信。3、ESB企业服务总线作为项目与服务之间通信的桥梁。
优点:
1、将重复的功能抽取为服务,提高开发效率,提高系统的可重用性、可维护性。2、可以针对不同服务的特点制定集群及优化方案。3、采用ESB减少系统中的接口耦合。
缺点:
1、系统与服务的界限模糊,不利于开发及维护。2、虽然使用了ESB,但是服务的接口协议不固定,种类繁多,不利于系统维护。3、抽取的服务的粒度过大,系统与服务之间耦合性高。
微服务架构:
特点:
1、将系统服务层完全独立出来,并将服务层抽取为一个一个的微服务。2、微服务遵循单一原则。3、微服务之间采用RESTful等轻量协议传输。
优点:
1、服务拆分粒度更细,有利于资源重复利用,提高开发效率。2、可以更加精准的制定每个服务的优化方案,提高系统可维护性。3、微服务架构采用去中心化思想,服务之间采用RESTful等轻量协议通信,相比ESB更轻量。4、适用于互联网时代,产品迭代周期更短。
缺点:
1、微服务过多,服务治理成本高,不利于系统维护。2、分布式系统开发的技术成本高(容错、分布式事务等),对团队挑战大。
8、Mesos系统架构
Mesos实现了两级调度架构,它可以管理多种类型的应用程序。第一级调度是Master的守护进程,管理Mesos集群中所有节点上运行的Slave守护进程。集群由物理服务器或虚拟服务器组成,用于运行应用程序的任务,比如Hadoop和MPI作业。第二级调度由被称作Framework的“组件”组成。Framework包括调度器(Scheduler)和执行器(Executor)进程,其中每个节点上都会运行执行器。Mesos能和不同类型的Framework通信,每种Framework由相应的应用集群管理。上图中只展示了Hadoop和MPI两种类型,其它类型的应用程序也有相应的Framework。
Mesos Master协调全部的Slave,并确定每个节点的可用资源, 聚合计算跨节点的所有可用资源的报告,然后向注册到Master的Framework(作为Master的客户端)发出资源邀约。Framework可以根据应用程序的需求,选择接受或拒绝来自master的资源邀约。一旦接受邀约,Master即协调Framework和Slave,调度参与节点上任务,并在容器中执行,以使多种类型的任务,比如Hadoop和Cassandra,可以在同一个节点上同时运行.
9、Mesos工作流程
1.集群中的所有slave节点会和master定期进行通信,将自己的资源信息同步到master,master由此获知到整个集群的资源状况
2.mater会和已注册、受信任的Framework进行交互,定期将最新的资源情况发送给Framework,当Framework前端有工作需求时,将选择接收资源,否则拒绝
3.前端用户提交了一个工作需求给Framework
4.Framework接收slave master发过来的资源信息
5.Framework依据资源信息向slave发起任务启动命令,开始调度工作。 Mesos是经典的二层架构,Master只负责管理资源,Framework负责任务调度,它们两者都可以直接给slave通信;Master保持着通用性,轻量性,它和Framework、Slave之间的的交互更多的是状态信息同步;在Slave上有两类进程:一类为Manager,用来与Master通信,交互状态信息,另一类则是由Framework实现的具体Executor,它负责任务的运行,对于Manager而言,他看到的所有Executor、Task都是一致的容器,而不管这些任务具体执行什么样的业务逻辑;
【第1题】HDFS Shell操作。
以管理员身份运行cmd终端,使用命令start-dfs.cmd启动HDFS,利用Hadoop提供的Shell命令完成以下任务:
(1)查看Hadoop的版本。
hadoop version
(2)在HDFS上创建4个目录/a,/b,/c/d,/input。
hdfs dfs -mkdir /a
hdfs dfs -mkdir /b
hdfs dfs -mkdir –p /c/d
hdfs dfs -mkdir /input
(3)在本地文件系统的C盘中创建两个文件:A.txt与B.txt
文件A.txt的内容如下:
China is my motherland
I love China
文件B.txt的内容如下:
I am from China
将A.txt上传到HDFS的/input中,将B.txt上传到HDFS的/input中。
hdfs dfs -put C:/A.txt /input
hdfs dfs -put C:/B.txt /input
(4)查看HDFS的目录/input下的所有文件。
hdfs dfs -ls /input
(5)在HDFS上复制/input/A.txt到/a中,并命名为hello.txt。
hdfs dfs -cp /input/A.txt /a/hello.txt
(6)从HDFS中下载指定文件/a/hello.txt到本地文件系统的C盘中。
hdfs dfs -get /a/hello.txt C:/
(7)将HDFS中的文本文件/a/hello.txt内容输出到终端中查看。
hdfs dfs -cat /a/hello.txt
(8)显示HDFS中文件/a/hello.txt的读写权限、大小、创建时间、路径等文件详细信息。
hdfs dfs -ls /a/hello.txt
(9)查看目录/c/d的大小。
hdfs dfs -dus /c/d
(10)在HDFS上删除文件/a/hello.txt,删除目录/c/d。
hdfs dfs -rm /a/hello.txt
hdfs dfs -rm -r /c/d
(11)在HDFS上根目录下的所有文件及目录。
hdfs dfs -rm -r /a /b /c /input
【第2题】HDFS API操作。
(1)确认本地的HDFS已经启动。(2)使用Eclipse创建java工程。(3)在Java工程中引入开发需要的jar包。
(4)编写HDFS程序。
程序1:编程实现一个类“HDFS_write”,在HDFS中创建目录"/input",并在该目录下写入一个新文件: /学号.txt,文件中写入自己的姓名。
程序清单:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFS_write {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
fs.mkdirs(new Path("/input"));
Path p1 = new Path("/input/学号.txt");
FSDataOutputStream out = fs.create(p1);
byte[] b = "姓名".getBytes();
out.write(b);
}
}
程序2:编程实现一个类“HDFS_read”,读取操作1中创建的文件/学号.txt。把读取到的值输出到Eclipse的控制台。程序清单:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFS_read {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
Path p1 = new Path("/input/学号.txt");
FSDataInputStream in = fs.open(p1);
String s=in.readLine();//iso-8859-1
String s1=new String(s.getBytes("iso-8859-1"),"utf-8");
System.out.println(s1);
}
}文章来源地址https://www.toymoban.com/news/detail-484609.html
【第1题】编程实现一个类“WordCount”,实现词频统计。
(1)数据准备:在C盘创建文本文件wordcount.txt,内容如下。
Hello World
Hello Hadoop
Hello MapReduce
启动cmd终端,执行cd c:\进入C盘,执行命令start-dfs.cmd启动分布式文件系统HDFS。将该文件上传到HDFS上的/input目录。
hdfs dfs -mkdir /input
hdfs dfs -put c:\wordcount.txt /input
(2)使用终端执行命令start-all.cmd启动分布式并行计算框架MapReduce。
(3)在Eclipse中创建Java工程。
(4)导入开发需要的jar包。
(5)编写MapReduce程序。
(6)运行查看程序执行结果,执行命令hdfs dfs -ls /output可以看到执行状态文件(若成功为文件名为_SUCCESS)与结果文件(part-r-00000)。
查看执行结果hdfs dfs -cat /output/part-r-00000
Hadoop 1
Hello 3
MapReduce 1
World 1
【程序清单】:
package mapreduce_demo;
import java.io.IOException;
import java.util.StringTokenizer;
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 MyMapper extends Mapper<Object,Text,Text,IntWritable>{
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 MyReducer 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 += val.get();
}
result.set(sum);
context.write(key,result);
}
}
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
Job job = new Job(conf,"word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.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);
}
}
【第2题】编程实现一个类“SortDemo”,实现数据排序。
(1)数据准备:在C盘创建文本文件file1.txt,file2.txt,file3.txt,内容如下。
file1.txt:
5
46
789
46
17
793
file2.txt:
24
89
6
65540
file3.txt:
5466
24
678
96
启动cmd终端,执行cd c:\进入C盘,执行命令start-dfs.cmd启动分布式文件系统HDFS。将该文件上传到HDFS上的/input目录。
创建/input目录,若已经存在可以不用创建:hdfs dfs -mkdir /input
上传文件:hdfs dfs -put c:\file1.txt c:\file2.txt c:\file3.txt /input
(2)使用终端执行命令start-all.cmd启动分布式并行计算框架MapReduce。
(3)在Eclipse中创建Java工程。
(4)导入开发需要的jar包。
(5)编写MapReduce程序。
(6)运行查看程序执行结果,执行命令hdfs dfs -ls /output可以看到执行状态文件(若成功为_SUCCESS)与结果文件(part-r-00000)。
查看执行结果hdfs dfs -cat /output/part-r-00000
1 5
2 6
3 17
4 24
5 24
6 46
7 46
8 89
9 96
10 678
11 789
12 793
13 5466
14 65540
【程序清单】:
package mapreduce_demo;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
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;
public class SortDemo {
public static class MyMapper extends Mapper<LongWritable, Text, IntWritable, NullWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
IntWritable valueToInt = new IntWritable(Integer.parseInt(value.toString()));
context.write(valueToInt, NullWritable.get());
}
}
public static class MyReducer extends Reducer<IntWritable, NullWritable, IntWritable, IntWritable> {
int count = 1;
@Override
protected void reduce(IntWritable key, Iterable<NullWritable> values, Context context)
throws IOException, InterruptedException {
for (NullWritable n : values) {
context.write(new IntWritable(count++), key);
}
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
Job job = new Job(conf, "SortDemo");
job.setJarByClass(SortDemo.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(NullWritable.class);
FileInputFormat.addInputPath(job, new Path("/input"));
FileOutputFormat.setOutputPath(job, new Path("/output"));
job.waitForCompletion(true);
}文章来源:https://www.toymoban.com/news/detail-484609.html
}
到了这里,关于《云计算实践与原理》考试内容及参考答案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!