??xml version="1.0" encoding="utf-8" standalone="yes"?>
1.支持发送和订阅分离Q可以细_度地控制Broker或者某个Topic是否接收消息和接受订阅。服务端d新选项acceptPublish和acceptSubscribe?br />
2.更友好地关闭BrokerQ梳理关闭流Eƈ通过JMX调用Ҏ(gu)关闭替代原来单的kill?br />
3.更新python客户?/a>?.2版本Q可以通过pip安装: pip install metaq
4.发布r(ji)uby语言客户?a style="color: #006699; ">meta-ruby 0.1版本?br />
5.其他改q:(x)升gecko?.1.1版本Q升Uquartz?.1.4版本Q添加集成测试工E和内部重构{?br />
6.新文?a >《用log4j扩展发送消息?/a>
介:(x)https://github.com/killme2008/Metamorphosis/wiki/介绍
下蝲Q?a style="color: #006699; ">https://github.com/killme2008/Metamorphosis/downloads
文档Q?a style="color: #006699; ">https://github.com/killme2008/Metamorphosis/wiki
本文档可以作Z用Hadoop分布式文件系l用L(fng)L(fng)Q无论是HDFS应用在一个Hadoop集群中还是作Z个单独的分布式文件系l用。HDFS被设计成可以马上在许多环境中工作hQ那么一些HDFS的运行知识肯定能大大地帮助你对一个集做配置改进和诊断?br id="bz6u" />
HDFS是Hadoop应用的主要分布式存储。一个HDFS集群׃个管理文件系l元数据的NameNodeQ和存储实际 数据的一些Datanodel成。HDFS的架构在q里有详l描q。这个用h南主要提供给需要跟HDFS集群打交道的用户或者管理员。HDFS架构文章 中的图描l(sh)(jin)Namenode、Datanode和客L(fng)们之间的基本交互。本质上Q客L(fng)与Namenode通讯获取或者修Ҏ(gu)件的元数据,? Datanodeq行实际的IO操作?br id="l_0z0" />
下面的列表应该是大多数用户关?j)的HDFSH出特点。斜体字的术语将在后面详l描q?/p>
1QHadoopQ包括HDFSQ非帔R合廉h(hun)机器上的分布式存储和分布式处理。它是容错的、可伸羃的,q且非常易于扩展。ƈ且,以简单性和适用性著U的Map-Reduce是Hadoop不可或缺的组成部分?/p>
2QHDFS的默认配|适合于大多数安装的应用。通常情况下,只有在一个非常大规模的集上才需要修攚w认配|?/p>
3QHDFS是用java~写的,支持大多数^台?/p>
4Q支持shell命o(h)行风格的HDFS目录交互?/p>
5QNamenode和Datanode都内Z(jin)web服务器,可以方便地查看集的状?/p>
6QHDFSl常性地实现新的Ҏ(gu)和改进Q下面是HDFS中的一些有用特性的子集Q?/p>
文g许可和授?/em>
Rack awareness:当调度Q务和分配存储的时候将节点的物理位|考虑q去?/p>
Safemode(安全模式Q?/em>Q用于维护的一个管理状?/p>
fsckQ?诊断文gpȝ的一个工P用来查找丢失的文件或者block Rebalancer:当数据在Datanode间没有均匀分布的时候,用于重新q集群的工?/p>
升和回?/em>Q当Hadoop软g升Q在升遇到不可预期的问题的时候,可以回滚到HDFS升前的状?/p>
二NamenodeQ帮助Namenodel持包含?jin)HDFS修改的日志的文gQedits日志文g,下文谈到Q大在限制范围内?br id="ubzs" />
下面的文档描qC(jin)一个Hadoop集群的安装和讄Q?br id="px_d0" />
本文档的剩余部分假设你已l搭讑ƈq行?jin)一个至拥有一个Datanode的HDFS。基于本文档的目的,Namenode和Datanode可以q行在同一台机器上?br id="tegj1" />
Namenode和Datanode分别跑了(jin)一个内|的web服务器,来展现集当前状态的一些基本信息。在默认配置 下,Namenode的首地址是http://namenode:50070Qnamenode是Namenode节点所在机器IP或者名Uͼ(j)。这? 面列出?jin)集中的所有datanode以及(qing)集群的基本统计。web接口同样可以用于览文gpȝQ点击Namenode首页上的“Browse the file system"链接Q?br id="lb5-" />
Hadoop包括?jin)多Ushell风格的命令,用于跟HDFS或者Hadoop支持的其他文件系l交互。命? bin/hadoop fs -help 可以列出Hadoop shell支持的命令。更q一步,bin/hadoop fs -help command 可以展现特定命o(h)command的帮助细节。这些命令支持一般文件系l的操作Q例如拷贝文件、修Ҏ(gu)件权限等。同时也支持?jin)部分HDFSҎ(gu)的命令,例如 修改文g的replication因子?br id="wep40" />
'bin/hadoop dfsadmin' 命o(h)支持一些HDFS理功能的操作?bin/hadoop dfsadmin -help'可以列出所有当前支持的命o(h)。例如:(x)
Namenode对文gpȝ的修改存储在一个原生文件系l文件中Q名为edits的文Ӟ(j)。当Namenode启动的时 候,它从映像文gQfsimage)dHDFS的状态,然后edits日志文g中的修改作用在此内存状态上Q接着得到的新的HDFS状态写? fsimageQ后l的正常操作开始于一个空的edits日志文g。由于Namenode仅仅在启动的时候将fsimage和edits合ƈQ因此在一? 大的集群上经q一定时间操作后Qedits文g会(x)非常大。由此带来的一个副作用是下次Namenode的重新启动将p很长旉。二U? Namenode是Z(jin)解决q个问题Q它?x)周期性地合ƈfsimage和edits日志文gQƈ且将edits日志文g的大保持在限制范围内。通常? ?x)跑在另一个机器上Q因为它的内存要求跟主namenode一栗二UNamenode可以通过'bin/start-dfs.sh'启动在conf /masters配置文g里配|的节点上?br id="s4h2" />
HDFS的数据可能不?x)L在Datanode之间分布得很一致。一个常见的原因是往现有的集中加入?jin)新的Datanode。当分配block的时候,Namenode依据几个参数来决定哪个datanode来接受这些block。一些需要考虑的因素如下:(x)
1Q一个block的副本存攑֜正在写该block的节点上
2Q需要将一个block的副本扩展到其他机架上,防止因ؓ(f)整个机架故障D的数据丢失?/p>
3Q副本之一通常攑֜同一个机架的另一个节点上Q减跨机架的网lIO
4Q将HDFS数据均匀一致地分布在集中的datanode上?/p>
Zq些怺竞争的因素,数据可能不会(x)在Datanode之间扩展得一致。HDFSl管理员提供?jin)一个工P用来分析block的分配情况和在datanode之间重新q数据。这个功能暂未实玎ͼ它的描述可以在这?nbsp;PDF文档中看刎ͼ记录~号HADOOP-1652.
典型的大规模Hadoop集群是部|在C机架上的Q那么显然同一个机架内的节炚w的网l通讯比之不同机架间节炚w的网 l通讯更可取。另外,Namenode?x)尝试将block的副本分布在C机架中以提高定w性。Hadoop让集管理员来决定某个节点从属于哪个机架Q? 通过配置变量dfs.network.script来实现。当q个脚本有配|的时候,每个节点都运行该脚本来决定它的rackid。默认安装假设所有的? 点从属于同一个机架。这个特性和配置q一步的阐述在这?a id="o3qg116" >PDF文档Q编号ؓ(f) HADOOP-692?
当Namenode启动的时候,它从fsimage和edits日志两个文g中加载文件系l的状态。然后等? datanode报告他们的block信息Q以侉K止Namenode在确认block副本是否_前过早地开始复制block。这D|间的 Namenode是处于所谓safemode状态。处于safemode的Namenode也是HDFS集群的只L型,此时不允怓Q何对文gpȝ或? block的修攏V正常情况下QNamenode?x)在开始后自动退出safemode。如果有需要,HDFS可以通过'bin/hadoop dfsadmin -safemode'命o(h)昑ּ地进入safemode状态。Namenode的web首页昄当前的safemode是否打开。更详细的描q和配置可以? ?a id="o3qg128" >setSafeMode()Ҏ(gu)的JavaDoc?/p>
? 注:(x)详细介绍下safemode的配|参敎ͼ在safemode状态,Namenode?x)等待所有的datanode报告他们自己的block信息Q看? 所有的block的副本是否达到最低要求的数目Q这个数目可以通过dfs.replication.min参数配置Q默认是1,也就是至要求有一个副 本。当报告合格的Datanode的数目达C定百分比QNamenode才会(x)dsafemode状态。这个百分比也是可配|的Q通过 dfs.safemode.threshold.pct参数Q默认是0.999f(也就是要?9.9%的Datanode 合格Q。Namenode在合格的datanode数目辑ֈ要求的时候,q不是马上离开safemode状态,?x)有一个扩展时_(d)让剩余的 datanode来报告block信息Q这个扩展时间默认是30U,可以通过dfs.safemode.extension参数配置Q单位是毫秒?/tt>
HDFS提供?jin)fsck命o(h)用来(g)各U各L(fng)不一致性。fsck被设计用来报告各U文件的问题Q例如某个文件丢q blockQblock的副本数目是否低于设|等。不同于传统的一般原生文件系l的fsck命o(h)Qhdfs的fsck命o(h)q不修正所(g)到的错误。通常? 况下QNamenode?x)自动修正大多数可以被修复的错误QHDFS的fsck不是Hadoop shel的命令,可以通过'bin/hadoop fsck'执行Q可以运行在整个文gpȝ上或者一个文件子集上?br id="as3m" />
当升U某个集的Hadoop的时候,正如M软g的升U一P可能?x)引入新的bug或者不兼容的修改导致现有的应用? 现过L有发现的问题。在所有重要的HDFS安装应用中,是不允许出现因丢׃Q何数据需要从零开始重启HDFS的情c(din)HDFS允许理员恢复到 Hadoop的早期版本,q且集的状态回滚到升前。HDFS的升U细节请参?upgrade wiki。HDFS在Q何时间只能有一个备份,因此在升U前Q管理员需要通过'bin/hadoop dfsadmin -finalizeUpgrade'命o(h)U除现有的备份。下面简要描qC(jin)典型的升U过E:(x)
1Q在升Hadoop前,如果已经存在备䆾Q需要先l束Qfinalize)它。可以通过'dfsadmin -upgradeProgress status'命o(h)查询集群是否需要执行finalize
2)停止集群Q分发部|新版本的Hadoop
3Q执行新版本的hadoopQ通过d -upgrade 选项Q例?bin/start-dfs.sh -upgrade
4)大多数情况下Q集在升后可以正常运行。一旦新的HDFS在运行若q天的操作后没有出现问题Q那么就可以l束(finalize)q次升。请注意Q在升前删除的文gq不释放在datanode上的实际盘I间,直到集群被结束(finalize)升前?/p>
5Q如果有需要回到老版本的HadoopQ那么可以:(x)
a)停止集群Q分发部|老版本的Hadoop
b)通过rollback选项启动集群Q例如bin/start-dfs.sh -rollback
文g许可的设计与其他q_(如linux) 的文件系l类伹{在当前实现Q安全被限制在简单的文g许可上。启动Namenode的用戯作ؓ(f)HDFS的超U用戗HDFS的未来版本将支持|络验证Q? 例如KerberosҎ(gu)Q译注:(x)MIT开发的一个验证系l)(j)的用户验证以?qing)数据传输的加密。更详细的讨论参?a id="o3qg166" >Permissions User and Administrator Guide?
Hadoop正运行在成千上万个节点的集群上? PoweredBy Hadoop? Z(jin)一些部|Hadoop在大规模集群上的l织和机构。HDFS在每个集上只有一个Namenode节点QNamenode节点上可用内存是当前伸羃? 的主要限制。在非常大规模的集群上,增加HDFS中存储的文g的^均大,可以帮助提高集的大小而不用增加Namenode的内存需求。默认的配置? 能不适合非常大规模的集群应用?a id="o3qg174" >Hadoop FAQ列Z(jin)对于大规模Hadoop集群的配|改q徏议?
本用h南可作ؓ(f)使用HDFS很好的一个v点,在本文档持箋(hu)改进的同Ӟ有一些非常有价值的关于Hadoop和HDFS的文档资料可供参考。下列资料可作ؓ(f)q一步探索的L(fng)Q?br id="ugay" />
1、副本的存放Q副本的存放?/span>HDFS可靠性和性能的关键?/span>HDFS采用一U称?/span>rack-aware的策略来改进数据的可靠性、有效性和|络带宽的利
用。这个策略实现的短期目标是验证在生环境下的表现Q观察它的行为,构徏试和研I的基础Q以便实现更先进的策略。庞大的HDFS实例一般运行在多个?
架的计算机Ş成的集群上,不同机架间的两台机器的通讯需要通过交换机,昄通常情况下,同一个机架内的两个节炚w的带宽会(x)比不同机枉的两台机器的带宽
大?/span>
通过一个称?/span>Rack
Awareness的过E,Namenode军_?jin)每?/span>Datanode所属的rack
id。一个简单但没有优化的策略就是将副本存放在单独的机架上。这样可以防止整个机Ӟ非副本存放)(j)失效的情况,q且允许L据的时候可以从多个机架?
取。这个简单策略设|可以将副本分布在集中Q有利于lgp|情况下的负蝲均衡。但是,q个单策略加大了(jin)写的代h(hun)Q因Z个写操作需要传?/span>block?
多个机架?/span>
在大多数情况下,replication因子?/span>3Q?/span>HDFS的存攄略是一个副本存攑֜本地机架上的节点Q一个副本放在同一机架上的另一个节点,最后一
个副本放在不同机架上的一个节炏V机架的错误q远比节点的错误,q个{略不会(x)影响到数据的可靠性和有效性。三分之一的副本在一个节点上Q三分之二在一?
机架上,其他保存在剩下的机架中,q一{略改进?jin)写的性能?/span>
2、副本的选择Qؓ(f)?jin)降低整体的带宽消耗和dgӞHDFS?x)尽量?/span>readerLq的副本。如果在reader的同一个机架上有一个副本,那么p该副本。如果一?/span>HDFS集群跨越多个数据中心(j)Q那?/span>reader也将首先试L地数据中?j)的副本?/span>
3?/span>SafeMode
Namenode启动后会(x)q入一个称?/span>SafeMode的特D状态,处在q个状态的Namenode是不?x)进行数据块的复制的?/span>Namenode从所有的
Datanode接收?j)蟩包?/span>Blockreport?/span>Blockreport包括?jin)某?/span>Datanode所有的数据块列表。每?/span>block都有指定的最
数目的副本。当Namenode(g)确认某?/span>Datanode的数据块副本的最数目,那么?/span>Datanode׃(x)被认为是安全的;如果一定百分比Q这
个参数可配置Q的数据块检确认是安全的,那么Namenode退?/span>SafeMode状态,接下来它?x)确定还有哪些数据块的副本没有达到指定数目,q将
q些block复制到其?/span>Datanode?/span>
五、文件系l元数据的持久化
Namenode存储HDFS的元数据。对于Q何对文g元数据生修改的操作Q?/span>Namenode都用一个称?/span>Editlog的事务日志记录下来。例如,
?/span>HDFS中创Z个文ӞNamenode׃(x)?/span>Editlog中插入一条记录来表示Q同P修改文g?/span>replication因子也将往
Editlog插入一条记录?/span>Namenode在本?/span>OS的文件系l中存储q个Editlog。整个文件系l的namespaceQ包?/span>block到文?
的映、文件的属性,都存储在UCؓ(f)FsImage的文件中Q这个文件也是放?/span>Namenode所在系l的文gpȝ上?/span>
Namenode在内存(sh)保存着整个文gpȝnamespace和文?/span>Blockmap的映像。这个关键的元数据设计得很紧凑,因而一个带?/span>4G内存?
Namenode_支撑量的文件和目录。当Namenode启动Ӟ它从盘?sh)读?/span>Editlog?/span>FsImageQ将所?/span>Editlog中的事务?
用(apply)在内存(sh)?/span>FsImage
Qƈ这个新版本?/span>FsImage从内存(sh)flush到硬盘(sh),然后?/span>truncateq个旧的EditlogQ因个旧?/span>Editlog的事务都已经
作用?/span>FsImage上了(jin)。这个过E称?/span>checkpoint。在当前实现中,checkpoint只发生在Namenode启动Ӟ在不久的来我们?
实现支持周期性的checkpoint?/span>
Datanodeq不知道关于文g的Q何东西,除了(jin)文件中的数据保存在本地的文件系l上。它把每?/span>HDFS数据块存储在本地文gpȝ上隔ȝ文g中?
Datanodeq不在同一个目录创建所有的文gQ相反,它用启发式地Ҏ(gu)来确定每个目录的最x(chng)件数目,q且在适当的时候创建子目录。在同一个目录创?
所有的文g不是最优的选择Q因为本地文件系l可能无法高效地在单一目录中支持大量的文g。当一?/span>Datanode启动Ӟ它扫描本地文件系l,对这些本?
文g产生相应的一个所?/span>HDFS数据块的列表Q然后发送报告到NamenodeQ这个报告就?/span>Blockreport?/span>
六、通讯协议
所有的HDFS通讯协议都是构徏?/span>TCP/IP协议上。客L(fng)通过一个可配置的端口连接到NamenodeQ通过ClientProtocol?
Namenode交互。?/span>Datanode是?/span>DatanodeProtocol?/span>Namenode交互。从ClientProtocol?
Datanodeprotocol抽象Z个远E调?/span>(RPCQ,在设计上Q?/span>Namenode不会(x)d发vRPCQ而是是响应来自客L(fng)?
Datanode ?/span>RPCh?/span>
七、健壮?/span>
HDFS的主要目标就是实现在p|情况下的数据存储可靠性。常见的三种p|Q?/span>Namenode
failures, Datanode failures和网l分Ԍnetwork
partitions)?/span>
1、硬盘数据错误、心(j)x(chng)和重新复制
每个Datanode节点都向Namenode周期性地发送心(j)跛_。网l切割可能导致一部分Datanode?/span>Namenode失去联系?
Namenode通过?j)蟩包的~失(g)到q一情况Qƈ这?/span>Datanode标记?/span>deadQ不?x)将新?/span>IOh发给它们。寄存在dead
Datanode上的M数据不再有效?/span>Datanode的死亡可能引起一?/span>block的副本数目低于指定|Namenode不断地跟t需要复制的
blockQ在M需要的情况下启动复制。在下列情况可能需要重新复Ӟ(x)某个Datanode节点失效Q某个副本遭到损坏,Datanode上的盘?
误,或者文件的replication因子增大?/span>
2、集均?/span>
HDFS支持数据的均衡计划,如果某个Datanode节点上的I闲I间低于特定的(f)界点Q那么就?x)启动一个计划自动地数据从一?/span>Datanode搬移
到空闲的Datanode。当Ҏ(gu)个文件的hH然增加Q那么也可能启动一个计划创文g新的副本Qƈ分布到集中以满_用的要求。这些均衡计划目?
q没有实现?/span>
3、数据完整?/span>
从某?/span>Datanode获取的数据块有可能是损坏的,q个损坏可能是由?/span>Datanode的存储设备错误、网l错误或者Y?/span>bug造成的?/span>HDFS客户?
软g实现?/span>HDFS文g内容的校验和。当某个客户端创Z个新?/span>HDFS文gQ会(x)计算q个文g每个block的校验和Qƈ作ؓ(f)一个单独的隐藏文g保存q些
校验和在同一?/span>HDFS
namespace下。当客户端检索文件内容,它会(x)认?/span>Datanode获取的数据跟相应的校验和文g中的校验和是否匹配,如果不匹配,客户端可以选择
从其?/span>Datanode获取?/span>block的副本?/span>
4、元数据盘错误
FsImage?/span>Editlog?/span>HDFS的核?j)数据结构。这些文件如果损坏了(jin)Q整?/span>HDFS实例都将失效。因而,Namenode可以配置成支持维护多
?/span>FsImage?/span>Editlog的拷贝。Q何对FsImage或?/span>Editlog的修改,都将同步到它们的副本上。这个同步操作可能会(x)降低
Namenode每秒能支持处理的namespace事务。这个代h可以接受的,因ؓ(f)HDFS是数据密集的Q而非元数据密集。当Namenode重启?
时候,它L选取最q的一致的FsImage?/span>Editlog使用?/span>
Namenode?/span>HDFS是单点存在,如果Namenode所在的机器错误Q手工的q预是必ȝ。目前,在另一台机器上重启因故障而停止服务的Namenodeq个功能q没实现?/span>
5、快?/span>
快照支持某个旉的数据拷贝,?/span>HDFS数据损坏的时候,可以恢复到过M个已知正的旉炏V?/span>HDFS目前q(sh)支持快照功能?/span>
八、数据组l?/span>
1、数据块
兼容HDFS的应用都是处理大数据集合的。这些应用都是写数据一ơ,d是一ơ到多次Qƈ且读的速度要满x(chng)式读?/span>HDFS支持文g?/span>write-
once-read-many语义。一个典型的block大小?/span>64MBQ因而,文gL按照64M切分?/span>chunkQ每?/span>chunk存储于不同的
Datanode
2、步?/span>
某个客户端创建文件的h其实q没有立卛_l?/span>NamenodeQ事实上Q?/span>HDFS客户端会(x)文件数据缓存到本地的一个(f)时文件。应用的写被透明地重定向?
q个临时文g。当q个临时文g累积的数据超q一?/span>block的大(默认64M)Q客L(fng)才会(x)联系Namenode?/span>Namenode文件名插入文gp?
l的层次l构中,q且分配一个数据块l它Q然后返?/span>Datanode的标识符和目标数据块l客L(fng)。客L(fng)本C(f)时文?/span>flush到指定的
Datanode上。当文g关闭Ӟ在(f)时文件中剩余的没?/span>flush的数据也?x)传输到指定?/span>DatanodeQ然后客L(fng)告诉Namenode文g已经
关闭。此?/span>Namenode才将文g创徏操作提交到持久存储。如?/span>Namenode在文件关闭前挂了(jin)Q该文g丢失?/span>
上述Ҏ(gu)是对通过?/span>HDFS上运行的目标应用认真考虑的结果。如果不采用客户端缓存,׃|络速度和网l堵塞会(x)对吞估量造成比较大的影响?/span>
3、流水线复制
当某个客L(fng)?/span>HDFS文g写数据的时候,一开始是写入本地临时文gQ假设该文g?/span>replication因子讄?/span>3Q那么客L(fng)?x)?/span>Namenode
获取一?/span>Datanode列表来存攑։本。然后客L(fng)开始向W一?/span>Datanode传输数据Q第一?/span>Datanode一部分一部分(4kb)地接收数
据,每个部分写入本C库,q且同时传输该部分到W二?/span>Datanode节点。第二个Datanode也是q样Q边收边传,一部分一部分地Ӟ存储
在本C库,同时传给W三?/span>DatanodeQ第三个Datanode׃仅是接收q存储了(jin)。这是水U式的复制?/span>
?ji)、可讉K?/span>
HDFSl应用提供了(jin)多种讉K方式Q可以通过DFSShell通过命o(h)行与HDFS数据q行交互Q可以通过java
API调用Q也可以通过C语言的封?/span>API讉KQƈ且提供了(jin)览器访问的方式。正在开发通过WebDav协议讉K的方式。具体用参考文档?/span>
十、空间的回收
1、文件的删除和恢?/span>
用户或者应用删除某个文Ӟq个文gq没有立MHDFS中删除。相反,HDFS这个文仉命名Qƈ转移?/span>/trash目录。当文gq在/trash?
录时Q该文g可以被迅速地恢复。文件在/trash中保存的旉是可配置的,当超q这个时_(d)Namenode׃(x)该文g?/span>namespace中删除?
文g的删除,也将释放兌该文件的数据块。注意到Q在文g被用户删除和HDFSI闲I间的增加之间会(x)有一个等待时间gq?/span>
当被删除的文件还?sh)留?/span>/trash目录中的时候,如果用户x(chng)复这个文Ӟ可以(g)索浏?/span>/trash目录q检索该文g?/span>/trash目录仅仅保存被删?
文g的最q一ơ拷贝?/span>/trash目录与其他文件目录没有什么不同,除了(jin)一点:(x)HDFS在该目录上应用了(jin)一个特D的{略来自动删除文Ӟ目前的默认策略是
删除保留过6时的文Ӟq个{略以后?x)定义成可配|的接口?/span>
2?/span>Replication因子的减?/span>
当某个文件的replication因子减小Q?/span>Namenode?x)选择要删除的q剩的副本。下ơ心(j)x(chng)就该信息传递给DatanodeQ?
Datanode׃(x)U除相应?/span>blockq攄_(d)同样Q在调用setReplicationҎ(gu)和集中的空闲空间增加之间会(x)有一个时间gq?/span>
参考资料:(x)
HDFS
Java API: http://hadoop.apache.org/core/docs/current/api/
HDFS
source code: http://hadoop.apache.org/core/version_control.html