HDFS源码解析
文章平均质量分 85
读程序的手艺人
专研于大数据处理
展开
-
HDFS集群的启动(7)——NameNode任务线程之FSNamesystem$ReplicationMonitor
前面我已经讲了许多关于NameNode的后台任务线程:HeartbeatMonitor、DecommissionManager$Monitor、LeaseManager$Monitor、PendingReplicationMonitor等,今天终于可以讲一讲ReplicationMonitor ,它在FSNamesystem中可算是大家伙了。那么,NameNode$FSNamesystem到底用R原创 2011-11-13 15:10:27 · 1962 阅读 · 0 评论 -
HDFS中的回收站
在Linux操作系统下面,如果用户删除了某一个文件或者是某一个文件目录,操作系统并不会把这文件从文件系统中真正删除,而是先把它放入回收站中,这样在用户误操作的情况下还能找回原文件,以防止给用户造成中大损失。实际上,HDFS也为用户提供了类似这样的一个功能,但是这样的功能只限于用户在客户端的脚本操作,也就是HDFS的shell命令,而当用户写程序调用HDFS的API时,NameNode并不会把删除的原创 2011-12-30 22:15:08 · 4613 阅读 · 0 评论 -
DataNode节点上数据块的完整性——DataBlockScanner
由于每一个磁盘或者是网络上的I/O操作可能会对正在读写的数据处理不慎而出现错误,所以HDFS提供了下面两种数据检验方式,以此来保证数据的完整性,而且这两种检验方式在DataNode节点上是同时工作的:一.校验和 检测损坏数据的常用方法是在第一次进行系统时计算数据的校验和,在通道传输过程中,如果新生成的校验和不完全匹配原始的校验和,那么数据就会被认为是被损坏的。二.数据块检测原创 2012-01-09 19:33:00 · 6235 阅读 · 3 评论 -
HDFS小文件问题及解决方案
1、 概述小文件是指文件size小于HDFS上block大小的文件。这样的文件会给hadoop的扩展性和性能带来严重问题。首先,在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储,每个对象约占150byte,如果有1000 0000个小文件,每个文件占用一个block,则namenode大约需要2G空间。如果存储1亿个文件,则namenode需要20G空间(见参考资料[1]转载 2012-03-17 20:30:07 · 1666 阅读 · 0 评论 -
HDFS集群的启动(2)——DataNode节点的注册
前面我已经就HDFS集群的启动问题在整体上进行了阐述,而在本文,我将主要针对DataNode节点在启动的过程中会首先向NameNode节点进行注册这一细节进行深入的讨论。 先来简单的讲一讲DataNode节点向NameNode节点进行注册的目的吧!DataNode节点向NameNode节点注册,一是告诉NameNode节点自己提供服务的网络地址端口,二是获取NameNode节点对自己的管原创 2011-11-03 21:56:57 · 4832 阅读 · 1 评论 -
Hadoop中的数据编码/解码器
在海量数据存储系统中,好的压缩算法可以有效的降低存储开销,减轻运营成本。Hadoop作为当前主流的海量数据存储与计算平台,当然也不例外,再其内部实现了几种经典的编码/解码算法来提供给用户选择,以达到提高应用系统的性能。因此,本文将主要围绕Hadoop中的数据编码/解码器展开详细地讨论。 在 Hadoop的实现中,数据编码器和解码器被抽象成了两个接口:org.apache.hadoop.io原创 2012-02-28 17:34:15 · 2694 阅读 · 1 评论 -
Hadoop中的RPC实现(概述)
Hadoop作为一个存储与服务的基础性平台,同时它的内部有采用了master/slave架构,那么其内部通信和与客户端的交互就是必不可少的了。Hadoop在实现时抛弃了JDK自带的一个RPC实现——RMI,而自己基于IPC模型实现了一个高效的轻量级RPC。整体结构 在IPC包中,最重要的3个类是ServerC,lient和RPC,它们具有层次化的结构。 1.RPC转载 2012-02-17 16:05:54 · 3432 阅读 · 0 评论 -
HDFS中的通信协议
通过对org.apache.hadoop.ipc包中,Hadoop实现了基于IPC模型的RPC机制,可以不需要像Java中实现的RMI机制一样,在RPC调用的C/S两端分别创建Stub和Skeleton,而是通过一组协议来进行RPC调用就可以实现通信。这主要是由于Hadoop所采用的序列化机制简化了RPC调用的复杂性。Hadoop定义了自己的通信协议,这些协议都是建立在TCP/IP协议之上的,规范转载 2011-10-20 20:18:41 · 8601 阅读 · 0 评论 -
HDFS读取副本的选择策略
HDFS对文件的存储是分块来存储的,即HDFS对于客户端写入的数据先按照固定大小对这些数据进行分块,然后把每一个数据块的多个副本存储在不同的DataNode节点上,同时不同的数据块也可能存储在不同的DataNode节点上。那么,当客户端要从HDFS上读取某个文件时,它又是如何处理的呢?很明显,客户端也是按照分块来读取文件的数据的,关于客户端如何分块读取文件的详细原理与过程我已经在前面的博文中详细的原创 2012-02-13 21:59:32 · 5664 阅读 · 1 评论 -
Hadoop集群与Hadoop性能优化
Hadoop性能优化:Hadoop机架感知实现及配置:分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群。机架内的机器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。 具体到Hadoop集群,由于Hadoop的HDFS对数据文转载 2012-02-13 19:22:58 · 3620 阅读 · 0 评论 -
HDFS的副本存放策略——ReplicationTargetChooser
HDFS作为Hadoop中的一个分布式文件系统,而且是专门为它的MapReduce设计,所以HDFS除了必须满足自己作为分布式文件系统的高可靠性外,还必须为MapReduce提供高效的读写性能,那么HDFS是如何做到这些的呢?首先,HDFS将每一个文件的数据进行分块存储,同时每一个数据块又保存有多个副本,这些数据块副本分布在不同的机器节点上,这种数据分块存储+副本的策略是HDFS保证可靠性和性能的原创 2011-12-28 21:38:21 · 8358 阅读 · 20 评论 -
HDFS集群的启动(3)——NameNode任务线程之DecommissionManager$Monitor
我们知道,在NameNode节点启动的时候,会启动一些后台的任务线程,例如:关于这些个后台监控线程有神马具体的用途,我在这里不会一一作出解释,但我会在以后的博文中来具体阐述,因为他们基本上担负起了整个NameNode节点的管理工作。在本文,我将具体的讲述DecommissionManager$Monitor这个后台工作线程。 先来看看DecommissionManager$Mon原创 2011-11-05 19:03:40 · 2435 阅读 · 2 评论 -
HDFS-2.0社区版的HA+Federation的实现解析
在Hadoop的1.x版本中,NN的单点处理能力成为HDFS的主要(容量扩展/性能/可用性)瓶颈,主要表现在:一.NN在管理大规模的命名空间时,所消耗的内存堆必定在10GB/100GB级别,无论是触发的Full Gc(32GB需要2min)还是重启时(元数据加载/操作日志回放/数据块汇报)时间消耗对高可用性来说都是无可忍受的;二是NN在内部用一把全局锁撸遍所有的元数据操作来保证数据的一致性;三是被原创 2015-03-29 17:01:23 · 3124 阅读 · 0 评论 -
NameNode的format操作做了什么
在Hadoop的HDFS部署好了之后并不能马上使用,而是先要对配置的文件系统进行格式化。在这里要注意两个概念,一个是文件系统,此时的文件系统在物理上还不存在,或许是网络磁盘来描述会更加合适;二就是格式化,此处的格式化并不是指传统意义上的本地磁盘格式化,而是一些清除与准备工作。本文接下来将主要讨论NameNode节点上的格式化。 我们都知道,NameNode主要被用来管理整个分布式文原创 2011-10-25 19:28:49 · 15791 阅读 · 0 评论 -
HDFS中的SecondaryNameNode节点解析
大家都知道,在HDFS的集群中有三类节点:NameNode、SecondaryNameNode和DataNode,同时在集群中只有一个NameNode节点,一个SecondaryNameNode节点,剩余的就都是DataNode节点(当然,集群中也可以同时存在多个SecondaryNameNode节点,但这没多大必要,反而会增加NameNode节点的压力,使其忙于元数据的传输与接收、日志的传输与切原创 2011-11-25 19:22:46 · 5659 阅读 · 0 评论 -
DataNode节点上数据块接收器——BlockReceiver
在前面的博文中详细地讲到了DataNode如何向客户端或者其它DataNode节点发送数据块Block的,即数据块发送器BlockSender,那么对应的,DataNode节点或者客户端就应该能够正确地接受数据块,也就是我们将要讲到的数据块的接收器BlockReceiver。当然,HDFS客户端和DataNode节点接收Block的方式有所不同,不过本文将主要讲解DataNode节点上的数据块接收原创 2012-01-12 19:06:02 · 5747 阅读 · 0 评论 -
HDFS的文件操作流(3)——写操作(客户端)
在前面的博文中我主要从客户端的角度讲述了HDFS文件写操作的工作流程,但是关于客户端是如何把数据块传送到数据节点,同时数据节点又是如何来接受来自客户端的数据块呢?这就是本文将要讨论的。 在客户端负责数据写入处理的核心类是DFSOutputStream,它的内部主要有数据包发送器DataStream、数据包确认处理器ResponseProcessor和数据包封装器Packet,其整体设计架原创 2011-11-15 19:29:11 · 4120 阅读 · 0 评论 -
HDFS的文件操作流(4)——写操作(数据节点)
上一篇本文我详细的分析了在HDFS的文件写操作中,客户端是如何工作的,其工作核心可总结为两点:一是向NameNode申请Block,二是向数据节点传输Block的packet。那么,数据节点是如何来接受这个数据块的呢?这个还得从数据节点的注册说起。 数据节点在启动之后,会向NameNode节点进行注册来告诉它自己的一些信息,这些信息包括自己的存储信息,服务信息等。其中,服务信息包括自己的原创 2011-11-15 21:14:48 · 2302 阅读 · 2 评论 -
HDFS集群的启动(4)——NameNode任务线程之LeaseManager$Monitor
在本地文件系统中,一个文件可以允许被多个进程同时同时打开并写入数据,但最后文件的内容是什么,谁也无法预测。请注意,我这里所说的这种文件能同时被多个进程写的操作是被操作系统中的文件系统所允许的,但是,我们通常在写程序对某个文件进行写操作的时候,总是额外地想法设法对操作的文件加一个独占锁,以此来保证文件的正确性和一致性。那么,HDFS中的文件是否像本地文件系统那样允许同时被多个用户写呢?答案是否定的,原创 2011-11-08 22:18:33 · 2523 阅读 · 0 评论 -
Hadoop中的RPC实现——客户端通信组件
在Hadoop中为了方便集群中各个组件之间的通信,它采用了RPC,当然为了提高组件之间的通信效率以及考虑到组件自身的负载等情况,Hadoop在其内部实现了一个基于IPC模型的RPC。关于这个RPC组件的整体情况我已绍经在前面的博文中介绍过了。而在本文,我将结合源代码详细地介绍它在客户端的实现。 先来看看与RPC客户端相关联的一些类吧!1.Client类priv原创 2012-02-17 20:37:04 · 8164 阅读 · 0 评论 -
HDFS集群的启动(8)——NameNode任务线程之FSNamesystem$SafeModeMonitor
HDFS集群启动之后并不能马上进入工作模式为用户提供服务,而是先要进入安全模式状态,因为主节点要确定当前集群中的绝大多数数据块Block处于安全可用的状态以确保为用户提供更可靠的读服务。这个工作主要是交由主节点上的FSNamesystem来完成的。FSNamesystem在初始化的时侯会首先进入安全模式状态并在之后开启一个后台工作线程——SafeModeMonitor来监控当前集群是否可以离开安全原创 2012-11-29 11:33:44 · 3262 阅读 · 1 评论 -
Hadoop中的RPC实现——服务器端通信组件
在前一篇博文中,我已经详细的讲解了Hadoop RPC中客户端通信组件的实现,与之对应的就会有一套服务器端通信组件的实现。Hadoop RPC的服务器端采用了多线程的设计,即服务器会开启多个处理器(后天线程)来处理所有客户端发送过来的RPC调用请求,所以在服务器端主要包括三个组件:监听器(Listener)、处理器(多个Handler)、响应发送器(Responder)。接下来我将主要围绕这三大组原创 2012-02-21 20:59:58 · 4636 阅读 · 4 评论 -
用户操作文件的权限检查器——PermissionChecker
在HDFS中,也提供了类似于linux文件系统中的文件操作权限管理功能,当我们在HDFS中创建一个文件/目录的时候,一般会为这个文件/目录附加对应的创建者、操作权限码。这里的操作权限码与linux中文件操作模式是完全一样的,如:0x777。那么,当一个客户端在对一个文件/目录进行操作(创建一个文件,读、写文件等)之前,先要对这个客户端进行操作权限的验证。其实,一个用户在使用HDFS提供的客户端来访原创 2012-02-12 17:32:44 · 2691 阅读 · 0 评论 -
DataNode节点的数据块管理(2)——DF、DU
HDFS作为一个分布式文件系统,它必须要知道自己当前整个集群存储空间的状态信息,如总容量、使用量、使用率、剩余可用量等信息,而HDFS正是通过统计所有的DataNode节点的存储空间信息来实现的。当DataNode节点向NameNode发送心跳包的时候,会顺便把自己当前的存储容量信息一并报告给它,那么,DataNode是如何知道自己的存储空间使用信息的呢?如果仅仅是通过人工输入总存储空间容量,统计原创 2012-01-03 15:10:21 · 3752 阅读 · 0 评论 -
HDFS的文件操作流(2)——读操作
为么么知道,在HDFS中文件是分块存储的,每一个块还有多个备份,同时不同的块的备份被存在不同的机器上,而且,这些组成文件的块也放在不同的数据节点上,那么,HDFS是如何实现文件的读取呢?比如:当客户端准备读取某一个文件的一个数据块时,若这个数据块有多个副本,那么这个客户端应该读取来个副本呢? 在上一篇文章中,我讲述了有关HDFS中文件写入流的实现方式与操作过程,所以在本文,我将重点分析原创 2011-11-07 20:03:02 · 4782 阅读 · 0 评论 -
HDFS集群的启动(1)——概述
众所周知,在HDFS集群中,主要有两类节点,即NameNode和DataNode节点,确切的说,一个NameNode节点,其它的所有DataNode节点。那么,HDFS集群的启动就自然而然的可以看做是一个NameNode节点的启动和所有其它的DataNode节点的启动问题了。在这里我要不得不提的是,NameNode和DataNode有各自不同的启动方式,其中,NameNode的启动方式有:form原创 2011-11-01 22:42:33 · 3861 阅读 · 1 评论 -
NameNode节点加载FSImage+EditsLog
在前面的博文中,我曾多次提到过在NameNode的启动过程中有加载FSImage+EditsLog这一必不可少的一项。关于文件fsImage和文件edits是用来存放神马的,我在这里就不用在重复了吧。在本文我将详细的叙述NameNode是如何加载fsimage和edits文件的。 在NameNode节点启动之前,我们一般会在配置文件hdfs-default.xml中分别配置文件fsI原创 2011-11-21 20:57:51 · 3608 阅读 · 0 评论 -
NameNode节点的升级/回滚/提交
我记得在前面已经以regular方式为例详细的讲述了有关NameNode启动的过程,在开始本文的重点之前,我觉得还是有必要在简单的描述一下这个过程: 好了,再回到本文将要阐述的重点吧——NameNode节点的升级/回滚/提交,这一步实际上只发生在上面过程的第一步:加载FSImage+EditLog。前面我提过关系:文件->数据块持久化在本地磁盘上,所有对目录树的更原创 2011-11-19 17:18:18 · 1960 阅读 · 1 评论 -
HDFS中的文件open操作
HDFS的文件open操作,实际上就是执行的是DistributedFileSystem的open(Path,int)函数,其中第一个函数就是文件的路径,第二个函数表示文件流的缓存大小,该函数返回的是DFSDataInputStream流。在这里,我不得不提的一点是,DFSDataInputStream是支持用户随机读的,之所以提及这一点,是因为我要在后面详细地介绍DFSDataInputStre原创 2011-10-31 21:42:13 · 3779 阅读 · 0 评论 -
HDFS的文件操作流(5)——写操作(NameNode节点)
在前面的几篇博文中,我分别花了很大的篇幅来介绍HDFS在处理用户写一个文件时客户端、数据节点干了些什么事情,那么在本文,我将重点介绍一下NameNode节点在这个过程中到底为用户刚了些神马? 用户调用HDFS的API来写入一个文件,教科书式的标准三过程:1.create;2.write;3.close,对应于客户端的这三个工程,NameNode又相应的做了哪些响应呢?先来看一张图吧原创 2011-11-16 21:30:35 · 3337 阅读 · 0 评论 -
HDFS中DistributedFileSystem的创建
说白了,DistributedFileSystem就是HDFS的客户端API,而且严格说起来,DistributedFileSystem算是一种瘦客户端,因为它没有缓存任何关于HDFS中的文件及文件的元数据信息。可能这话我说的有点绝对,但至少在目前的最新版本中确实是这样的,至于会不会在以后的HDFS版本中为客户端加入缓存就不得而知了。反正,Apache Hadoop的官网上并没有任何迹象表明他们将原创 2011-10-28 19:31:38 · 9409 阅读 · 2 评论 -
HDFS的文件操作流(1)——写操作(客户端概述)
大家可能对本地文件系统中的文件I/O流已经是非常的熟悉了,那么,像HDFS这种分布式的文件I/O流——基于网络I/O流的数据流,又是如何实现的呢?这就是本文的重点之一:HDFS的文件写入流。 熟悉HDFS的人可能知道,当我们调用DistributedFileSystem的create方法时,将会返回一个FSDataOutputStream对象,通过这个对象来对文件进行数据的写入。还是贴原创 2011-11-06 18:48:28 · 3734 阅读 · 2 评论 -
HDFS中namenode部分概述(一)
关于hdfs源码的阅读,我这个小菜鸟觉得有这么两种方式去读,一是抓住它关键的数据结构,知道了他们是干什么用的,剩下的就是一些围着他们转的操作了;二是跟踪执行过程的流程式阅读,以mkdir为例,从client应用发出mkdir请求到传递给namenode,再在datanode上执行,这么一个过程详细地跟踪下来,就理解了一大片。两种路子没有孰优孰劣,配合使用或许更有效。本篇先从数据结构的角度分享一点自转载 2011-10-25 16:05:59 · 5454 阅读 · 1 评论 -
HDFS集群的启动(5)——NameNode任务线程之FSNamesystem$HeartbeatMonitor
在前面的文章里面我已经讲过了,DataNode节点在注册时候就开始定期向NameNode节点发送心跳包,以此来告知NameNode节点自己当前还是可用的,同时从NameNode节点那里得到对自己的控制命令并执行之(这一点本文不表)。显然,当一个DataNode节点没有按时向NameNode节点发送心跳包时,NameNode就然为这个数据节点已经不可用了,清除与之相关的数据信息(比如在改数据节点上的原创 2011-11-09 20:29:14 · 2732 阅读 · 0 评论 -
HDFS集群的启动(6)——NameNode任务线程之PendingReplicationBlocks$PendingReplicationMonitor
在前面我已经详细的讲到了一些NameNode的后台工作线程,但是关于PendingReplicationBlocks$PendingReplicationMonitor和FSNamesystem$ReplicationMonitor,它们俩实在是让我很纠结,因为我真的不知道应该先讲哪一个。经过好几天的思量之后。还是决定先讲一讲PendingReplicationMonitor吧!原创 2011-11-12 16:22:20 · 2797 阅读 · 0 评论 -
DataNode节点的数据存储器——DataStorage
对于每一个DataNode节点而言,它都需要本地文件系统来存储与自己相关的数据。在前面的文章中我已经说过,任何节点都可以配置多个本地存储路径,每一个存储路径又被HDFS抽象成了一个StorageDirectory对象,但为了DataNode节点对自己存储路径的方便,HDFS又为每一个DataNode节点设计了一个DataStorage对象,DataNode节点可以利用这个对象对自己的所有存储路径进原创 2012-01-01 13:52:55 · 4652 阅读 · 1 评论 -
HDFS中的数据存储路径——StorageDirectory
在HDFS中,无论是NameNode节点还是DataNode节点都需要使用它们所在的本地文件系统来存储与自己相关的数据,如:NameNode节点存储系统命名空间的元数据,DataNode节点存储文件的数据块数据。对于NameNode节点或是DataNode节点,我们多可以为它们配置多个本地文件系统的存储路径,不同的是,NameNode节点中的所有存储路径存储的数据基本上是一样的,而DataNode原创 2011-12-31 19:03:47 · 13095 阅读 · 1 评论 -
NameNode对域名/IP的解析——DNSToSwitchMapping
前面介绍Networktopology结构的时候就说过,NameNode把注册的DataNode节点按照他们的ip地址存储到一个树状网络拓扑图中(对应Networktopology的一个实例),然后NameNode调用ReplicationTargetChooser来为每一个数据块副本选择合适的存储节点。那么,NameNode是如何把一个数据节点按照它的ip解析到对应的树状网络拓扑图中的一个叶子节原创 2011-12-29 19:08:36 · 2897 阅读 · 0 评论 -
DataNode节点上数据块发送器——BlockSender
在HDFS集群中,数据主要集中在DataNode节点之间、客户端与DataNode节点之间传输,如:客户利用客户端向HDFS中写入或读取数据;当NameNode节点检测到某一个数据块的副本不够时,会让某一个DataNode节点把该数据块复制到其它的DataNode节点上;当某个DataNode节点存储Block负载过重时会把它上面的一些数据块移动到其它DataNode上等等...所以本文将重点讨论原创 2012-01-10 20:02:55 · 3794 阅读 · 0 评论 -
DataNode节点的数据块管理(4)——FSDataset
本文作为DataNode节点的数据块管理系列的最后一篇博文,将详细讨论DataNode中直接为它服务而管理文件数据块的一个大家伙FSDatasetInterface,当然FSDatasetInterface只是一个接口,所要讲的主要是它的一个具体实现——FSDataset。FSDataset主要是在FSVolumeSet之上进行操作的,它的核心是为数据块创建I/O流。先来看看与FSDataset相原创 2012-01-08 16:17:53 · 3665 阅读 · 0 评论