hadoop与MapReduce详细文档DOC.docx
- 文档编号:25725355
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:33
- 大小:540.13KB
hadoop与MapReduce详细文档DOC.docx
《hadoop与MapReduce详细文档DOC.docx》由会员分享,可在线阅读,更多相关《hadoop与MapReduce详细文档DOC.docx(33页珍藏版)》请在冰豆网上搜索。
hadoop与MapReduce详细文档DOC
一、Hadoop擅长做什么?
不擅长做什么?
擅长做什么?
并行计算处理引擎
【1】日志分析
【2】排序
【3】广告计算,广告优化、分析,点击流分析,链接分析
【4】搜索关键字进行内容分类
【5】搜索引擎,创建索引
【6】word计数,统计值计算,统计数据,过滤,分析,查询
【7】垃圾数据分析
【8】数据分析
【9】机器学习
【10】数据挖掘
二、Hadoop主要功能组件
Hadoop主要功能组件如图所示
NameNode
DataNode
存储元数据
存储文件内容
元数据保存在内存中
文件内容保存在磁盘
保存文件,block,datanode之间的映射关系
维护了blockid到datanode本地文件的映射关系
1)HDFS采用master/slave架构。
一个HDFS集群是有一个Namenode和一定数目的Datanode组成。
Namenode是一个中心服务器,负责管理文件系统的namespace和客户端对文件的访问。
2)NameNode的作用
Namenode维护文件系统的namespace,任何对文件系统namespace和文件属性的修改都将被Namenode记录下来。
应用可以设置HDFS保存的文件的副本数目,文件副本的数目称为文件的replication因子,这个信息也是由Namenode保存。
3)Datanode负责管理节点上它们附带的存储。
在内部,一个文件其实分成一个或多个block,这些block存储在Datanode集合里。
Namenode执行文件系统的namespace操作,例如打开、关闭、重命名文件和目录,同时决定block到具体Datanode节点的映射。
Datanode在Namenode的指挥下进行block的创建、删除和复制。
一个数据块在DataNode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳,DataNode启动后向NameNode注册,通过后,周期性的向NameNode上报所有的块信息。
心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。
如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
三、Hadoop分布式包含哪些功能?
高可用体现在哪些地方?
1、服务器的错误恢复
●客户端
怎样避免由于客户端停机带来的资源被长期霸占的问题?
当客户端需要占用某文件的时候,与主控服务器签订的一个短期合同。
这个合同有一个期限,在这个期限内,客户端可以延长合同期限,一旦超过期限,主控服务器会强行终止此租约,将这个文件的享用权,分配给他人.
在打开或创建一个文件,准备追加写之前,会调用LeaseManager的addLease方法,在指定的路径下与此客户端签订一份租约。
客户端会启动DFSClient.LeaseChecker线程,定时轮询调用ClientProtocol的renewLease方法,续签租约。
在主控服务器一端,有一个LeaseManager.Monitor线程,始终在轮询检查所有租约,查看是否有到期未续的租约。
如果一切正常,该客户端完成写操作,会关闭文件,停止租约,一旦有所意外,比如文件被删除了,客户端牺牲了,主控服务器都会剥夺此租约,如此,来避免由于客户端停机带来的资源被长期霸占的问题
●DataNode
主控服务器NameNode实现了DatanodeProtocol接口,数据服务器DataNode会在主循环中,不停的调用该协议中的sendHeartbeat方法,向NameNode汇报状况。
在此调用中,DataNode会将其整体运行状况告知NameNode,比如:
有多少可用空间、用了多大的空间,等等之类。
NameNode会记住此DataNode的运行状况,作为新的数据块分配或是负载均衡的依据。
当NameNode处理完成此消息后,会将相关的指令封装成一个DatanodeCommand对象,交还给DataNode,告诉数据服务器什么数据块要删除什么数据块要新增等等之类,数据服务器以此为自己的行动依据。
但是,sendHeartbeat并没有提供本地的数据块信息给NameNode,那么主控服务器就无法知道此数据服务器应该分配什么数据块应该删除什么数据块,那么它是如何决定的呢?
答案就是DatanodeProtocol定义的另一个方法,blockReport。
DataNode也是在主循环中定时调用此方法,只是,其周期通常比调用sendHeartbeat的更长。
它会提交本地的所有数据块状况给NameNode,NameNode会和本地保存的数据块信息比较,决定什么该删除什么该新增,并将相关结果缓存在本地对应的数据结构中,等待此服务器再发送sendHeartbeat消息过来的时候,依照这些数据结构中的内容,做出相应的DatanodeCommand指令。
●NameNode
主控服务器不幸牺牲,或者是战略性的停机修整结束,并重新启动后,主控服务器会根据最近的镜像+镜像之后的所有日志,重建整个文件目录,迅速将服务能力恢复到牺牲前的水准
FSEditLog类是整个日志体系的核心,提供了一大堆方便的日志写入API,以及日志的恢复存储等功能。
目前,它支持若干种日志类型,都冠以OP_XXX,并提供相关API
为了保证日志的安全性,FSEditLog提供了EditLogFileOutputStream类作为写入的承载类,它会同时开若干个本地文件,然后依次写入,防止日志的损坏导致不可估量的后果。
在FSEditLog上面,有一个FSImage类,存储文件镜像并调用FSEditLog对外提供相关的日志功能。
FSImage是Storage类的子类
2、文件系统元数据的持久化
Namenode存储HDFS的元数据。
对于任何对文件元数据产生修改的操作,Namenode都使用一个称为Editlog的事务日志记录下来。
例如,在HDFS中创建一个文件,Namenode就会在Editlog中插入一条记录来表示;同样,修改文件的replication因子也将往Editlog插入一条记录。
Namenode在本地OS的文件系统中存储这个Editlog。
整个文件系统的namespace,包括block到文件的映射、文件的属性,都存储在称为FsImage的文件中,这个文件也是放在Namenode所在系统的文件系统上。
Namenode在内存中保存着整个文件系统namespace和文件Blockmap的映像。
这个关键的元数据设计得很紧凑,因而一个带有4G内存的Namenode足够支撑海量的文件和目录。
当Namenode启动时,它从硬盘中读取Editlog和FsImage,将所有Editlog中的事务作用(apply)在内存中的FsImage,并将这个新版本的FsImage从内存中flush到硬盘上,然后再truncate这个旧的Editlog,因为这个旧的Editlog的事务都已经作用在FsImage上了。
这个过程称为checkpoint。
在当前实现中,checkpoint只发生在Namenode启动时。
Datanode并不知道关于文件的任何东西,除了将文件中的数据保存在本地的文件系统上。
它把每个HDFS数据块存储在本地文件系统上隔离的文件中。
Datanode并不在同一个目录创建所有的文件,相反,它用启发式地方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。
在同一个目录创建所有的文件不是最优的选择,因为本地文件系统可能无法高效地在单一目录中支持大量的文件。
当一个Datanode启动时,它扫描本地文件系统,对这些本地文件产生相应的一个所有HDFS数据块的列表,然后发送报告到Namenode,这个报告就是Blockreport。
3、数据复制
HDFS被设计成在一个大集群中可以跨机器地可靠地存储海量的文件。
它将每个文件存储成block序列,除了最后一个block,所有的block都是同样的大小。
文件的所有block为了容错都会被复制。
每个文件的block大小和replication因子都是可配置的。
Replication因子可以在文件创建的时候配置,以后也可以改变。
HDFS中的文件是write-one,并且严格要求在任何时候只有一个writer。
Namenode全权管理block的复制,它周期性地从集群中的每个Datanode接收心跳包和一个Blockreport。
心跳包的接收表示该Datanode节点正常工作,而Blockreport包括了该Datanode上所有的block组成的列表。
流水线复制
当某个客户端向HDFS文件写数据的时候,一开始是写入本地临时文件,假设该文件的replication因子设置为3,那么客户端会从Namenode获取一张Datanode列表来存放副本。
然后客户端开始向第一个Datanode传输数据,第一个Datanode一小部分一小部分(4kb)地接收数据,将每个部分写入本地仓库,并且同时传输该部分到第二个Datanode节点。
第二个Datanode也是这样,边收边传,一小部分一小部分地收,存储在本地仓库,同时传给第三个Datanode,第三个Datanode就仅仅是接收并存储了。
这就是流水线式的复制。
4、数据完整性
HDFS客户端软件实现了HDFS文件内容的校验和。
当某个客户端创建一个新的HDFS文件,会计算这个文件每个block的校验和,并作为一个单独的隐藏文件保存这些校验和在同一个HDFSnamespace下。
当客户端检索文件内容,它会确认从Datanode获取的数据跟相应的校验和文件中的校验和是否匹配,如果不匹配,客户端可以选择从其他Datanode获取该block的副本。
具体实现
在HDFS中,为了保证数据的正确性和同一份数据的一致性,做了大量的工作。
首先,每一个数据块,都有一个版本标识,在Block类中,用一个长整型的数generationStamp来表示版本信息(Block类是所有表示数据块的数据结构的基类),一旦数据块上的数据有所变化,此版本号将向前增加。
在主控服务器上,保存有此时每个数据块的版本,一旦出现数据服务器上相关数据块版本与其不一致,将会触发相关的恢复流程。
这样的机制保证了各个数据服务器器上的数据块,在基本大方向上都是一致的
使用签名保证数据内容上的一致
当客户端向数据服务器追加写入数据包时,每一个数据包的数据,都会切分成512字节大小的段,作为签名验证的基本单位,在HDFS中,把这个数据段称为Chunk,即传输块(注意,在GFS中,Chunk表达的是数据块...)。
在每一个数据包中,都包含若干个传输块以及每一个传输块的签名,当下,这个签名是根据JavaSDK提供的CRC算法算得的,其实就是一个奇偶校验。
当数据包传输到流水线的最后一级,数据服务器会对其进行验证,一旦发现当前的传输块签名与在客户端中的签名不一致,整个数据包的写入被视为无效。
5、SafeMode
Namenode启动后会进入一个称为SafeMode的特殊状态,处在这个状态的Namenode是不会进行数据块的复制的。
Namenode从所有的Datanode接收心跳包和Blockreport。
Blockreport包括了某个Datanode所有的数据块列表。
每个block都有指定的最小数目的副本。
当Namenode检测确认某个Datanode的数据块副本的最小数目,那么该Datanode就会被认为是安全的;如果一定百分比(这个参数可配置)的数据块检测确认是安全的,那么Namenode将退出SafeMode状态,接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些block复制到其他Datanode。
6、通讯协议
HDFS通讯协议都是构建在TCP/IP协议上。
在Hadoop的实现中,部署了一套RPC机制,以此来实现各服务间的通信协议。
7、健壮性
HDFS的主要目标就是实现在失败情况下的数据存储可靠性。
常见的三种失败:
Namenodefailures,Datanodefailures和网络分割(networkpartitions)。
1、硬盘数据错误、心跳检测和重新复制
每个Datanode节点都向Namenode周期性地发送心跳包。
网络切割可能导致一部分Datanode跟Namenode失去联系。
Namenode通过心跳包的缺失检测到这一情况,并将这些Datanode标记为dead,不会将新的IO请求发给它们。
寄存在deadDatanode上的任何数据将不再有效。
Datanode的死亡可能引起一些block的副本数目低于指定值,Namenode不断地跟踪需要复制的block,在任何需要的情况下启动复制。
在下列情况可能需要重新复制:
某个Datanode节点失效,某个副本遭到损坏,Datanode上的硬盘错误,或者文件的replication因子增大。
NameNode怎么知道DataNode挂掉了?
datanode每3秒钟向namenode发送心跳,如果10分钟datanode没有向namenode发送心跳,则namenode认为该datanode已经dead,namenode将取出该datanode上对应的block,对其进行复制。
8、负载均衡
在HDFS中,ReplicationTargetChooser类,是负责实现为新分配的数据块寻找婆家的。
基本上来说,数据块的分配工作和备份的数量、申请的客户端地址(也就是写入者)、已注册的数据服务器位置,密切相关。
HDFS的Balancer类,是为了实现动态的负载调整而存在的
四、Hadoop文件管理包含哪些功能,具体包含哪些主干类,这些类都做什么用?
对文件操作的方法,对象有哪些?
它们之间的关系是什么?
文件管理主要有三类数据
文件系统的目录结构数据,各个文件的分块信息,数据块的位置信息
FSNameSystem层次结构,FSNamespacesystem类就负责保管文件系统的目录结构以及每个文件的分块状况的,其中,前者是由FSDirectory类来负责,后者是各个INodeFile本身维护
◆INode:
它用来存放文件及目录的基本信息:
名称,父节点、修改时间,访问时间以及UGI信息等。
◆INodeFile:
继承自INode,除INode信息外,还有组成这个文件的Blocks列表,重复因子,Block大小
◆INodeDirectory:
继承自INode,此外还有一个INode列表来组成文件或目录树结构Block(BlockInfo):
组成文件的物理存储,有BlockId,size,以及时间戳
◆BlocksMap:
保存数据块到INode和DataNode的映射关系
◆FSDirectory:
保存文件树结构,HDFS整个文件系统是通过FSDirectory来管理
◆FSImage:
保存的是文件系统的目录树
◆FSEditlog:
文件树上的操作日志
数据分布
一个文件系统中,最重要的数据,其实就是整个文件系统的目录结构和具体每个文件的数据。
具体的文件数据被切分成数据块,存放在数据服务器上
Block类用于表示数据块,
FSDataset类是数据服务器管理文件块的数据结构,其中FSDataset.FSDir对应着数据块文件和目录,FSDataset.FSVolume对应着一个数据目录,FSDataset.FSVolumeSet是FSVolume的集合,每一个FSDataset有一个FSVolumeSet。
多个数据目录,可以放在不同的磁盘上。
1、基本的文件操作
基本的文件操作,可以分成两类:
一个是对文件目录结构的操作,比如文件和目录的创建、删除、移动、更名等等;另一个是对文件数据流的操作,包括读取和写入文件数据
HDFS如何写文件?
1)文件和目录的操作
所有对文件目录的操作,只会直接涉及到客户端和主控服务器。
整个目录相关的操作流程基本都是这样的:
客户端DFSClient调用ClientProtocol定义的相关函数,该操作通过RPC传送到其实现者主控服务器NameNode那里,NameNode做相关的处理后(很少...),调用FSNamesystem的相关函数。
在FSNamesystem中,往往是做一些验证和租约操作,具体的目录结构操作交由FSDirectory的相应函数来操作。
最后,依次返回,经由RPC传送回客户端。
2)文件的读取
不论是文件读取,还是文件的写入,主控服务器扮演的都是中介的角色。
客户端把自己的需求提交给主控服务器,主控服务器挑选合适的数据服务器,介绍给客户端,让客户端和数据服务器单聊,要读要写随你们便。
这种策略类似于DMA,降低了主控服务器的负载
DFSClient中,有一个DFSClient.DFSInputStream类。
当需要读取一个文件的时候,会生成一个DFSInputStream的实例。
它会先调用ClientProtocol定义getBlockLocations接口,提供给NameNode文件路径、读取位置、读取长度信息,从中取得一个LocatedBlocks类的对象,这个对象包含一组LocatedBlock,那里面有所规定位置中包含的所有数据块信息,以及数据块对应的所有数据服务器的位置信息。
当读取开始后,DFSInputStream会先尝试从某个数据块对应的一组数据服务器中选出一个,进行连接。
这个选取算法,在当下的实现中,非常简单,就是选出第一个未挂的数据服务器,并没有加入客户端与数据服务器相对位置的考量。
读取的请求,发送到数据服务器后,自然会有DataXceiver来处理,数据被一个包一个包发送回客户端,等到整个数据块的数据都被读取完了,就会断开此链接,尝试连接下一个数据块对应的数据服务器
3)文件的写入
写入操作,则是一个一对多的流程。
一次写入,需要在所有存放相关数据块的数据服务器都保持同步的更新
HDFS中,并发写入是怎么控制的?
HDFS中,并发写入的次序控制,是由主控服务器来把握的。
INodeFileUnderConstruction是INodeFile的子类,它起到一个锁的作用。
如果当一个客户端想创建或续写的文件是INodeFileUnderConstruction,会引发异常,因为这说明这个此处有爷,请另寻高就,从而保持了并发写入的次序性。
同时,INodeFileUnderConstruction有包含了此时正在操作它的客户端的信息以及最后一个数据块的数据服务器信息
DFSClient也有一个DFSClient.DFSOutputStream类,写入开始,会创建此类的实例。
DFSOutputStream会从NameNode上拿一个LocatedBlock,这里面有最后一个数据块的所有数据服务器的信息。
文件写入,就是在这一组数据服务器上构造成数据流的双向流水线。
DFSOutputStream,会与序列的第一个数据服务器建立Socket连接,发送请求头,然后等待回应。
DataNode同样是建立DataXceiver来处理写消息,DataXceiver会依照包中传过来的其他服务器的信息,建立与下一个服务器的连接,并生成类似的头,发送给它,并等待回包。
此流程依次延续,直到最后一级,它发送回包,反向着逐级传递,再次回到客户端。
如果一切顺利,那么此时,流水线建立成功,开始正式发送数据。
数据是分成一个个数据包发送的,所有写入的内容,被缓存在客户端,当写满64K,会被封装成DFSOutputStream.Packet类实例,放入DFSOutputStream的dataQueue队列。
DFSOutputStream.DataStreamer会时刻监听这个队列,一旦不为空,则开始发送,将位于dataQueue队首的包移动到ackQueue队列的队尾,表示已发送但尚未接受回复的包队列。
同时启动ResponseProcessor线程监听回包,直到收到相应回包,才将发送包从ackQueue中移除,表示成功。
每一个数据服务器的DataXceiver收到了数据包,一边写入到本地文件中去,一边转发给下一级的数据服务器,等待回包,同前面建立流水线的流程。
。
。
当一个数据块写满了之后,客户端需要向NameNode服务器申请追加新的数据块。
这个会引起一次数据块的分配,成功后,会将新的数据服务器组返还给客户端
五、空间的回收
文件的删除和恢复
用户或者应用删除某个文件,这个文件并没有立刻从HDFS中删除。
相反,HDFS将这个文件重命名,并转移到/trash目录。
当文件还在/trash目录时,该文件可以被迅速地恢复。
文件在/trash中保存的时间是可配置的,当超过这个时间,Namenode就会将该文件从namespace中删除。
文件的删除,也将释放关联该文件的数据块。
注意到,在文件被用户删除和HDFS空闲空间的增加之间会有一个等待时间延迟。
当被删除的文件还保留在/trash目录中的时候,如果用户想恢复这个文件,可以检索浏览/trash目录并检索该文件。
/trash目录仅仅保存被删除文件的最近一次拷贝。
/trash目录与其他文件目录没有什么不同,除了一点:
HDFS在该目录上应用了一个特殊的策略来自动删除文件,目前的默认策略是删除保留超过6小时的文件,这个策略以后会定义成可配置的接口。
六、目前存在的缺陷有哪些?
6.1HA(HighAvailability)高可用性
这一点是Hadoop非常弱的一个缺点,不管是Hdfs还是Map-reduce,都是采用单master的方式,集群中的其他机器都是与一台中心机器进行通信,如果这个中心机器挂了,集群就只有不工作了(不一定数据会丢失,但是至少需要重启等等工作),让可用性变得更低。
这个一般叫做单点失败(singlepointoffailure,SPOF)。
6.2Join
Map-Reduce还有一个问题是,对于Join这个最常见的数据库操作,支持力度还是不够,特别是针对那种上TB的数据,Join将会很不给力,
6.3需要进行很多轮迭代、循环的算法
对于循环,Map-Reduce稍好,比如矩阵计算,高斯消元法这样的,循环的次数的确定的算法,实现起来还是不难,只是有点慢。
但是迭代就更麻烦了,因为现在的Map-Reduce的mapper和reducer是不太方便去弄这样的终止条件。
还有就是迭代次数超多的算法(比如说矩阵的SVD分解),在超大矩阵的情况下,迭代次数可能会上亿次。
而Map-Reduce在每次迭代的时候都会把数据往文件里面读写一遍,这样的浪费的时间是巨大的。
6.4编程复杂,学习曲线陡峭
七、MapReduce是什么东东?
MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。
概念”Map(映射)”和”Reduce(化简)”,和他们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性
Mapreduce工作原理
一个MapReduce作业在hadoop上运行的整个过程可以分为4个实体:
(1)、客户端,提交MapReduce作业;
在客户端上使用runJob()方法来新建JobClient实例和调用它的submitJob()方法。
提交作业后,runJob将每秒轮询作业的进度,如果发现与上一个记录不同,便把报告显示到控制台。
作业完成后,如果成功,就显示作业计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hadoop MapReduce 详细 文档 DOC