![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Hadoop源码分析
文章平均质量分 74
zhanglizhe_cool
这个作者很懒,什么都没留下…
展开
-
HadoopIPC包源码分析
Hadoop的IPC:(1)实现RPC的一种方法,具有快速、简单的特点。 它不像Sun公司提供的标准RPC包,基于Java序列化。(2)IPC无需创建网络stubs和skeletons。(3)IPC中的方法调用要求参数和返回值的数据类型必须是Java的基本类型,String和Writable接口的实现类,以及元素为以上类型的数组。接口方法应该只抛出IOException异常。 构建思路:(1)采用客户/服务器模型(2)Server:它把Java接口暴露给客户端。指定好监听端口和接受远程调用的对象实例后,通过原创 2010-07-04 21:15:00 · 760 阅读 · 0 评论 -
Hadoop_NameNode_代码分析_数据结构(1)
<br />(1)NameNode保存的两种信息:文件和block的映射、block和DataNode的映射。文件和block的映射,固化在磁盘上。而block和DataNode的映射在DataNode启动时上报给NameNode<br />(2)DatanodeProtocol:用于DataNode来调用NameNode上的方法,情景是DataNode向NameNode通信,方法参数传递到NameNode上;<br />ClientProtocol:提供给客户端,用于访问NameNode。它包含了文件角度原创 2010-07-10 19:56:00 · 1627 阅读 · 0 评论 -
Hadoop_DataNode_代码分析(4)
<br />(1)写操作:BlockReceiver作为处理writeBlock时候的主要类。写是通过管道实现的,写block可能是用户请求也可能是NameNode要求的block拷贝命令,不同情况处理不同。管道上的中间节点有四个方向的网络数据流,还有两个写block数据文件和校验文件的流。主线程负责读数据报直接转发给下一个DataNode,而单独启动新线程PacketResponder用来处理给上级的回复消息和接受下级的发送过来的消息。PacketResponder应用心跳机制,到一定时间会给上级发送心跳原创 2010-07-10 17:06:00 · 1041 阅读 · 0 评论 -
Hadoop_NameNode_代码分析_目录树(2)
<br />(1)NameNode的内存中保存了庞大的目录树结构,这个结构用来保存文件目录结构和文件Block之间的映射,这种结构关系会固化在磁盘上,但是对树的改动频繁发生,什么时候将树写入磁盘呢?把每次操作应用到内存中的树上,并把操作记录成日志文件,每次操作不会改变固化在磁盘上的改动发生之前的目录树,适当的时候做一次固化操作并记录时间。<br />(2)NameNode上面的磁盘目录结构:<br />[hadoop@localhost dfs]$ ls -R name<br />name:<br />cu原创 2010-07-10 21:11:00 · 1278 阅读 · 0 评论 -
Hadoop_NameNode_代码分析_FSNameSystem(4)
(1)FSNameSystem中的defaultPermission是创建文件时的默认设置,缺省用户为fsOwner(可以通过hadoop.job.ugi设置,否则通过whoami获得),缺省用户组为supergroup,缺省权限为0777,可以通过dfs.upgrade.permission修改。blocksMap:保存数据块到INode和DataNode的映射关系。dir:指向系统使用的FSDirectory对象,操作命名空间。datanodeMap :保存了StorageID -> DatanodeD原创 2010-07-12 20:12:00 · 1108 阅读 · 0 评论 -
Hadoop_NameNode_代码分析_目录树(4)
<br />(1)FSDirectory管理内存中名字空间,而FSImage用来管理磁盘上的固化的目录树。<br />(2)FSDirectory中操作名字空间的方法分为记录日志且检查ready以及不记录日志不检查ready型(unprotected),明显后者用来加载固化目录树的时候。<br />(3)操作名字空间的方法大多数都比较相似,选择较复杂的rename操作来分析。rename涉及src<String>,dst<String>,因为内存中操作的都是INode节点,所以要使用getExistingP原创 2010-07-12 16:35:00 · 603 阅读 · 0 评论 -
Hadoop_DataNode_代码分析(3)
通过上面的一系列介绍,我们知道了DataNode工作时的文件结构和文件结构在内存中的对应对象。下面我们可以来开始分析DataNode上的动态行为。首先我们来分析DataXceiverServer和DataXceiver。DataNode上数据块的接受/发送并没有采用我们前面介绍的RPC机制,原因很简单,RPC是一个命令式的接口,而DataNode处理数据部分,往往是一种流式机制。DataXceiverServer和DataXceiver就是这个机制的实现。其中,DataXceiver还依赖于两个辅助类:Bl原创 2010-07-09 20:57:00 · 630 阅读 · 0 评论 -
Hadoop_DataNode_代码分析(2)
(1)由上文知FSVolume和Storage.StorageDirectory对应,由于HDFS规定了一个目录能存放Block的数目,FSDir对应一个StorageDirectory里面众多存放block的目录。由此FSVolumeSet= Storage,FSVolume=Storage.StorageDirectory,FSDir= StorageDirectory的子目录。FSVolume就是一个通常的那样一个目录,管理着数据块文件,detach文件和临时文件。FSVolume中的recoverD原创 2010-07-09 16:23:00 · 649 阅读 · 0 评论 -
Hadoop_DataNode_代码分析(1)
(1)StorageInfo类是通用存储信息的类,通用的意思是NameNode和DataNode上面文件目录结构共有的信息,这些信息包括layoutVersion(应用软件的版本和文件目录的版本一致),namespaceID(Storage的ID,作用还不清楚),cTime(就是创建时间),这些信息显然是非易失性的,应该放在目录的VERSION文件中。(2)从Storage类的注释中可知,Local storage可以有多个目录,每个目录有相同的VERSION文件,其中保存Local storage inf原创 2010-07-07 22:54:00 · 838 阅读 · 0 评论 -
hadoop_UnixUserGroupInformation_以及相关RPC安全的问题
(1)在配置文件中使用hadoop.job.ugi指定用户组信息,用户名+组名(String[]),UnixUserGroupInformation的login方法首先尝试从Configuration中获得用户组信息,如果失败就从配置文件中读,如果失败就Get current user's name and the names of all its groups from Unix,Shell类中的内部类ShellCommandExecutor用来执行Shell程序。如果失败,则用户名为DrWho,组名为T原创 2010-07-06 17:31:00 · 572 阅读 · 0 评论 -
hadoop_HDFS_DataNode初步
(1)一个DataNode上面的Block都是唯一的,多个DataNode可能存在相同的Block。(2)通信场景:1,NameNode上并不永久保存那个DataNode上有那些数据块的信息,而是通过DataNode启动时的上报,来更新NameNode上的映射表(DataNode和Block)。2,DataNode和NameNode建立连接以后,就会不断地和NameNode保持心跳。心跳的返回其还也包含了NameNode对DataNode的一些命令。3,DataNode当然也作为服务器接受来自客户端的访问,原创 2010-07-07 20:15:00 · 2832 阅读 · 0 评论 -
Hadoop_RPC框架分析_Server部分
RPC框架的Server:(1)服务器需要一个listen线程(Listen内部类),需要一个已接受连接的列表(connectionList)(2)连接对象(Connection)需要包含和客户端连接的通道(SocketChannel),readAndProcess方法读取client端发过来的信息完成hrpc和version比较并做分头信息和调用信息分别处理,(3)processHeader用来处理头信息,会得到根据传来的协议字符串获得协议类(class),会根据UserGroupInformation得原创 2010-07-05 21:07:00 · 564 阅读 · 0 评论 -
Hadoop_RPC框架分析_Client部分
RPC框架:(1)RPC中保存Client对象的缓存,因为一个Client对象可能被多个线程用到,因此在Client对象中要有引用计数,从缓存中拿出一个Client时增加计数,放入缓存中时减少计数,如果发现计数为零则要从缓存中清除这个Client并断开Client的连接。(2)waitForProxy用来返回一个远程调用存根,可能出现的异常有:ConnectException(无法连接),SocketTimeoutException(远端繁忙)。如果超过用户设定的超时时间,则IOException。主要参数原创 2010-07-05 16:37:00 · 744 阅读 · 0 评论 -
Hadoop_IPC序列化对象的分析
IPC序列化对象的分析:序列化对象网络中传递格式,对象类名(UTF8.writeString)+对象数据,对象数据分一下几种情况(1)数组:数组长度+元素对象数据(递归)(2)字符串:UTF8.writeString(3)primitive type:DataOutput接口输出(4)枚举:枚举名字(UTF8.writeString)(5)Writable的实现类:Writable对象类名+对象实际数据关键问题是如何解读序列化数据,得到对象类名之后,首先利用保存的primitive type散列表查看一下(原创 2010-07-05 14:56:00 · 724 阅读 · 0 评论 -
Hadoop_NameNode_代码分析_日志_租约_9bit位实现方面(3)
(1)EditLogFileOutputStream:日志输出流使用双缓冲技术,使得在向磁盘同步数据时,其他准备写日志的线程不至于阻塞。一个NameNode可能在不同的StorageDirectory中有不同的日志文件要写,因此有ArrayList editStreams成员变量。isSyncRunning成员用来标识是否某一个流正在进行同步操作,如果是这样,close的时候需要等待同步完成。任何一个线程写一条日志或者setReady流也就是转换缓冲都会锁上所有的流,这对性能没有影响,因为写日志是向双缓冲中原创 2010-07-11 15:36:00 · 751 阅读 · 0 评论