hadoop分布式系统与云计算文档格式.docx
- 文档编号:20040627
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:28
- 大小:1.12MB
hadoop分布式系统与云计算文档格式.docx
《hadoop分布式系统与云计算文档格式.docx》由会员分享,可在线阅读,更多相关《hadoop分布式系统与云计算文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streamingaccess)文件系统中的数据。
Hadoop的框架最核心的设计就是:
HDFS,MapReduce,Yarn。
HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算,Yarn进行集群资源调度。
其中Hadoop的系统架构图如图1-1所示。
图1-1Hadoop2.0系统架构图
2HDFS分布式文件系统
2.1HDFS分布式文件系统
当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对他进行分区并存储到若干台单独的计算机上管理网络中跨多台计算机存储的文件,系统称为分布式文件系统。
HDFS就是Hadoop技术体系中用来将文件存储在多台服务器上的分布式文件系统。
HDFS的优点主要有几下点:
1.适合运行在通用硬件(commodityhardware)上。
2.HDFS是一个高度容错性的系统,适合部署在廉价的机器上。
3.HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。
4.HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。
2.2HDFS的设计目标
(1)硬件错误
硬件错误是常态而不是异常。
HDFS可能由成百上千的服务器所构成,每个服务器上存储着文件系统的部分数据。
因此构成系统的组件数目是巨大的,而且任一组件都有可能失效,这意味着总是有一部分HDFS的组件是不工作的。
因此错误检测和快速、自动的恢复是HDFS最核心的架构目标。
(2)流式数据访问
运行在HDFS上的应用和普通的应用不同,需要流式访问它们的数据集。
HDFS的设计中更多的考虑到了数据批处理,而不是用户交互处理。
比之数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。
POSIX标准设置的很多硬性约束对HDFS应用系统不是必需的。
为了提高数据的吞吐量,在一些关键方面对POSIX的语义做了一些修改。
(3)大规模数据集
运行在HDFS上的应用具有很大的数据集。
HDFS上的一个典型文件大小一般都在G字节至T字节。
因此,HDFS被调节以支持大文件存储。
它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。
一个单一的HDFS实例应该能支撑数以千万计的文件。
(4)简单的一致性模型
HDFS应用需要一个“一次写入多次读取”的文件访问模型。
一个文件经过创建、写入和关闭之后就不需要改变。
这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。
Map/Reduce应用或者网络爬虫应用都非常适合这个模型。
(5)“移动计算比移动数据更划算”
一个应用请求的计算,离它操作的数据越近就越高效,尤其是在数据达到海量级别的时候。
因为这样就能降低网络阻塞的影响,提高系统数据的吞吐量。
将计算移动到数据附近,比将数据移动到应用所在显然更好。
HDFS为应用提供了将它们自己移动到数据附近的接口。
(6)异构软硬件平台间的可移植性
HDFS在设计的时候就考虑到平台的可移植性。
这种特性方便了HDFS作为大规模数据应用平台的推广。
2.3namenode和datanode
HDFS采用master/slave架构。
HDFS结构如图2-1所示。
一个HDFS集群是由一个namenode(管理节点)和一定数目的datanode(工作节点)组成。
namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。
datanode是文件系统的工作节点,一般是一个节点一个,负责管理它所在节点上的存储(受客户端或namenode调度),并且定期向namenode发送它们所存储的数据列表。
图2-1HDFS架构
用户能够以文件的形式在上面存储数据。
从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。
Namenode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录。
它也负责确定数据块到具体Datanode节点的映射。
Datanode负责处理文件系统客户端的读写请求。
在Namenode的统一调度下进行数据块的创建、删除和复制。
2.4文件系统的命名空间
HDFS支持传统的层次型文件组织结构。
用户或者应用程序可以创建目录,然后将文件保存在这些目录里。
文件系统命名空间的层次结构和大多数现有的文件系统类似:
用户可以创建、删除、移动或重命名文件。
2.5数据流
2.5.1HDFS写入数据
HDFS写入数据流程为:
1.客户端调用DistributedFileSystem对象调用create()来新建文件。
2.DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件还没有对应的数据块。
Namenode执行检查以确保这个文件不存在,并且客户端新建文件的权限。
3.客户端开始写入数据。
DFSataInputStream将它分成一个个的数据包,写入队列。
DataStreamer处理数据队列。
挑选出适合存储数据副本的一组datanode的。
并以此来分配新的数据块.
4.DistributedFileSystem等待datanode的确认回复,收到确认信息后,该数据包才会从确认队列中删除。
5.客户端完成写入后调用close方法。
HDFS写入数据的流程图如图2-2所示。
图2-2HDFS写入数据流程图
2.5.2HDFS读出数据
HDFS读出数据流程为:
1.客户端调用open()方法打开文件;
2.DistributedFileSystem通过调用(RPC)来调用namenode,来确定文件初始块的位置。
namenode返回存有该块副本的datanode地址。
datanode根据它们与客户端的距离来排序(网络拓扑)。
如果该客户机本身就是namenode,则从本地namenode读取数据。
DistributedFileSystem类返回一个FSDataInputStream对象(输入流)给客户端用来读取数据。
FSDataInputStream类转而封装FSDataInputStream对象,该对象管理着datanode和namenode的I/O。
3.客户端对这个输入流调用read()方法。
4.可以将数据从datanode传输到客户端。
到达快的末端时,FSDataInputStream关闭与该datanode的连接,然后开始寻找下一个块的最佳datanode(步骤5)。
这些操作对用户来讲都会透明的,在客户看来它一直读取的是一个连续的流。
HDFS数据读出的流程图如图2-3所示。
图2-3HDFS数据读出流程图
2.6数据复制
HDFS旨在大型集群中的计算机之间可靠地存储非常大的文件。
它将每个文件存储为一系列块。
复制文件的块是为了容错。
块大小和复制因子是每个文件可配置的。
文件中除最后一个块外的所有块都具有相同的大小,而在添加了对可变长度块的支持后,用户可以在不填充最后一个块的情况下开始新的块,而不用配置的块大小。
应用程序可以指定文件的副本数。
复制因子可以在文件创建时指定,以后可以更改。
HDFS中的文件只能写入一次(追加和截断除外),并且在任何时候都只能具有一个写入器。
NameNode做出有关块复制的所有决定。
它定期从群集中的每个DataNode接收心跳信号和Blockreport。
收到心跳信号表示DataNode正常运行。
Blockreport包含DataNode上所有块的列表。
2.7健壮性
HDFS的主要目标是即使出现故障也能可靠地存储数据。
三种常见的故障类型是NameNode故障,DataNode故障和网络分区。
(1)数据磁盘故障,心跳和复制
DataNode定期向NameNode发送心跳消息。
网络分区可能导致DataNode失去与NameNode的连接。
NameNode通过缺少心跳消息来检测NameNode将没有最近心跳的DataNode标记为dead,并且不会将任何新的IO请求转发给它们。
已失效的DataNode的任何数据不再用于HDFS。
DataNode死亡可能导致某些块的复制因子降至其指定值以下。
NameNode不断跟踪需要复制的块,并在必要时启动复制。
当DataNode可能不可用,副本可能损坏,DataNode上的硬盘可能发生故障等情况发生时。
用户可以设置较短的时间间隔以将DataNode标记为过时,并通过配置来避免对性能敏感的工作负载进行读或写时出现过时的节点。
(2)集群再平衡
如果DataNode的可用空间低于某个阈值,则可能会自动将数据从一个DataNode移至另一个DataNode。
如果对特定文件的需求突然增加,则可能会动态创建其他副本并重新平衡群集中的数据。
(3)快照
快照支持在特定时间存储数据副本。
快照功能的一种用法可能是将损坏的HDFS实例回滚到以前已知的良好时间点。
(4)数据的完整性
由于存储设备故障,网络故障或软件故障,可能导致从DataNode提取的数据块损坏。
HDFS客户端对HDFS文件的内容执行校验和检查。
客户端创建HDFS文件时,它将计算文件每个块的校验和,并将这些校验和存储在同一HDFS命名空间中隐藏的文件中。
客户端检索文件内容时,它将验证从每个DataNode接收的数据是否与存储在namenode中的文件相匹配。
如果不是,则客户端可以选择从另一个具有该块副本的DataNode中检索该块。
3Yarn集群资源管理系统
3.1Yarn的基本思想
将资源管理和作业调度/监视的功能拆分为单独的守护程序。
拥有一个全局的ResourceManager(RM)和每个应用程序的ApplicationMaster(AM)。
应用程序可以是单个作业,也可以是集群作业。
Yarn的内部结构如图3-1所示。
ResourceManager和NodeManager组成数据计算框架。
ResourceManager具有在系统中所有应用程序之间仲裁资源的最终权限。
NodeManager是每台机器的框架代理,负责容器,监视其资源使用情况(cpu,内存,磁盘,网络),并将其报告给ResourceManager/Scheduler。
图3-1Yarn的内部结构
3.2剖析Yarn应用机制
Yarn的应用机制如图3-2所示。
1.客户端联系资源管理器,要求它运行一个applicationmaster进程。
(步骤1)
2.资源管理器找到一个能够在容器中启动applicationmaster的节点管理器。
(步骤2a,2b)
3.applicationmaster运行之后,可以进行:
(1)在所在容器简单运行一个计算,并将结果返回给客户端(步骤3);
(2)向资源管理器请求更多的容器,以运行一个分布式计算(步骤4a,4b)。
图3-2Yarn的内部机制
3.3Yarn中的调度策略
Yarn的调度策略主要分为三种,分别是:
FIFO调度器、容器调度器、公平调度器。
分别介绍这三种调度策略的优缺点。
1.FIFO调度器:
将应用放置在一个队列中,按照任务提交的顺序(先进先出)运行应用。
如图3-3左图所示。
优点:
简单易懂。
缺点:
不适合共享集群。
大的应用会占用所有资源,导致小应用一直被阻塞。
2.容量调度器:
保留一个独立的队列,保证小作业已提交就可以启动。
如图3-3中图所示。
整个集群的利用率低,大作业的的执行时间长
3.公平调度器:
无需预留一定量的资源,调度器会在所有作业之间动态平衡资源。
如图3-3右图所示。
作业一启动会获得所有资源,作业二启动会被分配一半资源。
使得每个作业都能公平共享资源。
图3-3Yarn的三种调度策略
4MapReduce分布式计算模型
4.1MapReduce介绍
HadoopMapReduce是一个软件框架,可以轻松地编写应用程序,以可靠,容错的方式并行处理大型硬件集群(数千个节点)上的大量数据(多TB数据集)。
MapReduce框架组成:
一个主资源管理器;
一个集群节点;
一个工作器NodeManager;
每个应用程序ApplicationMaster组成。
应用程序通过适当的接口或抽象类的实现来指定输入/输出位置。
客户端将程序(jar/可执行文件等)和配置文件提交给ResourceManager,然后由ResourceManager负责将软件/配置分发给节点,安排任务并对其进行监视,为工作提供状态和诊断信息。
4.2MapReduce的计算流程
图4-1MapReduce计算流程
MapReduce的计算如4-1所示。
从HDFS输入要进行处理的文本文件,分布式下可将一个文本文件中的自然语言处理成多句话同时进行处理,将文本文件的中的自然语言经过mapreduce内部的spilt()函数,将自然语言进行切割处理,切割后的单词或文本输入到map()任务中,将每一个单词都封装成<
key,value>
键值对的形式,其中key为单词,value为这个单词出现的频率,初始时value值为1;
然后经过mapreduce内部的排序组合将分隔后的键值对中的key值进行排序,排序后对相同的单词或文本进行统计,统计后仍以<
的键值对形式,其中key为单词,value为该单词统计后出现的频率。
将统计后的键值对输入到reduce()任务中,将统计结果输出。
4.3实例WordCount源码解析
publicclassWordCount{
publicstaticclassTokenizerMapper
extendsMapper<
Object,Text,Text,IntWritable>
{
privatefinalstaticIntWritableone=newIntWritable
(1);
privateTextword=newText();
publicvoidmap(Objectkey,Textvalue,Contextcontext
)throwsIOException,InterruptedException{
StringTokenizeritr=newStringTokenizer(value.toString());
while(itr.hasMoreTokens()){
word.set(itr.nextToken());
context.write(word,one);
}
publicstaticclassIntSumReducer
extendsReducer<
Text,IntWritable,Text,IntWritable>
{
privateIntWritableresult=newIntWritable();
publicvoidreduce(Textkey,Iterable<
IntWritable>
values,
Contextcontext
intsum=0;
for(IntWritableval:
values){
sum+=val.get();
result.set(sum);
context.write(key,result);
publicstaticvoidmain(String[]args)throwsException{
Configurationconf=newConfiguration();
String[]otherArgs=newGenericOptionsParser(conf,args).getRemainingArgs();
if(otherArgs.length<
2){
System.err.println("
Usage:
wordcount<
in>
[<
...]<
out>
"
);
System.exit
(2);
Jobjob=Job.getInstance(conf,"
wordcount"
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
for(inti=0;
i<
otherArgs.length-1;
++i){
FileInputFormat.addInputPath(job,newPath(otherArgs[i]));
FileOutputFormat.setOutputPath(job,
newPath(otherArgs[otherArgs.length-1]));
System.exit(job.waitForCompletion(true)?
0:
1);
}
4.3.1map()阶段
publicstaticclassTokenizerMapperextendsMapper<
//one:
IntWritable类型(序列化的Integer),值恒为1。
//Map端的任务是对输入数据按照单词进行切分,每个单词为Text类型。
//这段代码为Map端的核心,定义了MapTask所需要执行的任务的具体逻辑实现
publicvoidmap(Objectkey,Textvalue,Contextcontext)throwsIOException,InterruptedException{
需要继承org.apache.hadoop.mapreduce.Mapper这个类,自定义实现Map()方法,其中参数有四个(keyIn、valueIn、keyOut、valueOut),即Map()任务的输入和输出都是<
key,value>
对的形式。
各参数含义:
1、Object:
输入<
key,value>
对的key值,此处为文本数据的起始位置的偏移量。
2、Text:
对的value值,此处为一段具体的文本数据。
3、Text:
输出<
对的key值,此处为一个单词。
4、IntWritable:
对的value值,此处固定为1。
4.3.2Reduce()阶段
publicstaticclassIntSumReducerextendsReducer<
values,Contextcontext)throwsIOException,InterruptedException{
intsum=0;
sum+=val.get();
需要继承importorg.apache.hadoop.mapreduce.Reducer这个类,参数也是四个(keyIn、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hadoop 分布式 系统 计算