`
david.org
  • 浏览: 157425 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hadoop源码分析-HDFS

阅读更多
经过近66个工作日的时间,终于搞定了HDFS系统,在我们的项目中,称为Fordim0.1。

为了能够让更多的朋友认识Hadoop在此附上一Google’s Solution --> Open Source Word’s Solution :
 Google File System – Hadoop Distributed FS
 Map-Reduce – Hadoop Map-Reduce
 Sawzall – Pig, Hive, JAQL
 Big Table – Hadoop HBase,  Cassandra
 Chubby – Zookeeper


关于Hadoop的内部实现流程方案,我想列到下篇日志当中,本篇我只想讲述如何剖析这3万多行的代码。在对Java 应用程序的IO操作的基础上理解Hadoop并不难,关键是掌握程序系统各组件的依懒性,有条理的分析先做什么,后实现什么这样的原则,我的plan是:
1. 系统中存在的case : Master / Slaves / Client 其对应的实现:
Master– NameNode
Slaves–DataNode s
Client –DFSClient

2. 三者之间的通信通过IPC建立,最底层仍然是TCP,底层实现原理暂且不理,通过Hadoop 的RPC机制做出Demo。

3. 认知NameNode后发现该庞然大物犹如人体的大脑,它充当着HDFS的控制器,但尽管有着近似一万行代码的它,我们也无需慌张,现在的工作没有它的份,聪明的朋友就会分析到,就是现在实现这样的控制器,也无法工作,因为人体还没有四肢。Okay, 接下来的任务是

4. 在RPC的基础上定义ClientProtocol / DatanodeProtocol两interface,本质上他们是RMI技术的应用。
ClientProtocol: DFSClient- -> NameNode
Allows clients to ask for DFS services.
DatanodeProtocol: Datanode - -> NameNode
Used by DataNode programs that actually store DFS data blocks.

5. 接口完了,接下来我们定义上面仨。至此,我们的第一阶段顺利完成。

6. 如果前面工作顺利的话,下面我们的工作就是DFSClient 和 Datanode 了,事实上我们通过Hadoop的官方文档便可得知,DFSClient做任何事是必须向NameNode 发出请求,等NameNode处理完请求给予响应后,才允许和Datanode交互。然而此时我们未必要实现它,就当作DFSClient直接向DataNode通信。

7. 前面没有讲到DFSClient与DaatNode的交互方式,是因为他们俩不存在请求与被响应的的策略,因此Hadoop HDFS并未使用RPC来实现他们俩之间的通信,而是直接通过底层的socket 连接Datanode的ServerSocket,以实现数据的传输。

8. 该部分的成功实现,是建立在对chunk / packet / block,以及Java IO操作的理解之上的。那么我们的任务当然是先实现上传,后下载了,原因你知道的。

9. 在完成put操作时,我们发现DataNode存储block的机制(之后的日志会说到,此处会改为链接),这里提醒一下,现在无需实现,简单的流程是,当Datanode收到block时,我们先找本地磁盘的任意地方存放,等get操作完了之后,我们认为DFSClient 与 DataNode暂时是没有什么活要做的,那么之后,我们可以考虑研究DataNode的存储机制然后加上。

10. 前面第二阶段的工作很艰巨,而且是比较重要,这就好似我们创造了人体的四肢一样,那么接下来是更为艰巨的任务NameNode。

11. 该物如何剖析是关系到项目进度以及工作效率最受影响的因素之一,与其茫然的不停双击鼠标,还不如准备笔纸仔细的分析该如何开展工作。在注释与文档的帮助下,找到了一个切入点,首先从DFSClient的session入手,也就是请求的开始直到结束,NameNode直始至终做了哪些工作,跟到最后一步,大脑是如何存储记忆的,渐渐浮出水面,那就是INode。

12. 熟悉Linux OS的朋友应该知道INode的概念,我们知道block 是记录档案内容数据的地区,而INode则是记录该档案的属性,以及该档案存在哪一个block之内的信息。在terminal 中,下达ls –i 命令可以看到indoe的参数值。要想攻破NameNode,INode必须理解。

13. OK, 接下来的任务最为艰巨,那就是我们的FSNamesystem出场,解决了它,NameNode基本上可以说所剩无几,此类有近4500行。在初步分析时,内部线程可以不用看,而工作的重点则是这样的流程interface - > NameNode->FSNamesystem->FSDirectory->INode。

14. 在完成以上流程后,可以研究FSNamesystem中的内部线程,实际上不难看出,Master Server正是使用了它们维持了整个 HDFS 系统的负载平衡。

15. 完成内部线程后,我们便可模拟数据进行测试。最后另用Shell 脚本来封装我们的系统。

以上是我研究Hadoop-HDFS系统的一般流程,其中有些知识点没有列到会在今后的日志中讲到,例如HDFS对外提供的访问接口,除了Shell ,还有web ui 。而它则是使用jetty 实现的。

基于hadoop0.16.x 2009-2-7 23:51

分享到:
评论
23 楼 david.org 2010-10-28  
mygirl1987 写道
你好,请问如果我想通过禁用网络端口的方式断掉某个节点的连接,那么是不是应该断开数据节点的50010端口?为什么我通过iptables已经断开了50010端口了,namenode还是会连接的到这个节点呢?


50010是数据通信端口, 50020是RPC调用端口
22 楼 mygirl1987 2010-10-27  
你好,请问如果我想通过禁用网络端口的方式断掉某个节点的连接,那么是不是应该断开数据节点的50010端口?为什么我通过iptables已经断开了50010端口了,namenode还是会连接的到这个节点呢?
21 楼 david.org 2010-07-08  
mygirl1987 写道
lz你好,请问hadoop在布属的时候我们可不可以人为的限制datanode节点提供给hadoop的磁盘空间呀?如果可以该怎么进行呢,配置文件里貌似没看到相关的属性设置


dfs.datanode.du.reserved可以代替
20 楼 mygirl1987 2010-07-08  
lz你好,请问hadoop在布属的时候我们可不可以人为的限制datanode节点提供给hadoop的磁盘空间呀?如果可以该怎么进行呢,配置文件里貌似没看到相关的属性设置
19 楼 xanpeng 2010-07-06  
希望能看到lz更多的相关博文啊
18 楼 david.org 2010-07-06  
mygirl1987 写道
你好,我最近在一个集群上搭建hadoop,但是遇到一个问题。我想问一下,我的Datanode中的hadoop与namenode中的hadoop并不是在名字相同的文件夹中,请问这样可以吗?还是说Datanode和namenode的hadoop_home路径一定要是一样的呀,谢谢了


HADOOP_HOME要一样的
17 楼 mygirl1987 2010-07-05  
你好,我最近在一个集群上搭建hadoop,但是遇到一个问题。我想问一下,我的Datanode中的hadoop与namenode中的hadoop并不是在名字相同的文件夹中,请问这样可以吗?还是说Datanode和namenode的hadoop_home路径一定要是一样的呀,谢谢了
16 楼 mygirl1987 2010-05-12  
david.org 写道
mygirl1987 写道
谢谢您的耐心指导……我现在又出现了一个问题,就是hadoop在数据传输过程中走的是哪个端口?是namenode的50027端口吗?呵呵,跟您添麻烦



put操作实际上是指DFSClient 与 DataNode建立的Socket连接。因此走的是DN的50010端口。(在传输数据的环节上是和NameNode没有关系的.
没事, 有问题多讨论, 对于我也是个总结的过程。

哦,对,我上面写错了,其实应该是namenode的50010端口,呵呵
15 楼 david.org 2010-05-11  
mygirl1987 写道
谢谢您的耐心指导……我现在又出现了一个问题,就是hadoop在数据传输过程中走的是哪个端口?是namenode的50027端口吗?呵呵,跟您添麻烦



put操作实际上是指DFSClient 与 DataNode建立的Socket连接。因此走的是DN的50010端口。(在传输数据的环节上是和NameNode没有关系的.
没事, 有问题多讨论, 对于我也是个总结的过程。
14 楼 david.org 2010-05-11  
ithero 写道
经验之谈,值得看看,国内所说的云,又有多少是拿这个来实现。哎,特别是一些院校


谢谢. 博客中有不少提到hadoop的bug, 如果ithero兄用到, 不防参考一下. 本文实际上更为精确的定义是如何来分析HDFS的代码. 至于云,那就让那些抄概念的说去吧.
13 楼 mygirl1987 2010-05-11  
谢谢您的耐心指导……我现在又出现了一个问题,就是hadoop在数据传输过程中走的是哪个端口?是namenode的50027端口吗?呵呵,跟您添麻烦
12 楼 ithero 2010-05-11  
经验之谈,值得看看,国内所说的云,又有多少是拿这个来实现。哎,特别是一些院校
11 楼 david.org 2010-05-10  
三者为同一台机子的话, 他们共享同一个hadoop-site.xml文件. 所以他们也共享同一个fs.default.name.

DN或者是Client任何一个需要独力一台机子的话, 必须指定fs.default.name 为NN的监听地址。
10 楼 mygirl1987 2010-05-10  
david.org 写道
mygirl1987 写道
请问楼主,client客户端怎么配置?我之前上传文件都是把namenode节点当作客户端来用,然后我发现在datanode节点中上传就会出现好多问题,尤其是我修改了hadoop的一些功能到了datanode节点上上传时,那些功能都没用了,请问是怎么回事?

Hadoop#HDFS分为三个组成部分, Client, DN, NN.

前者可以为任意的连网客户机, 后两者建议放到内网集群中。

1. 当你需要put文件到集群时, Client最好放到和DN, NN一样的网段内。
2. 当你仅需要move, delete文件时, Client可以放到任意远程客户机。

那么要想让Client工作, Hadoop-site.xml文件最起码需要配置fs.default.name.
<property>
   <name>fs.default.name</name>
   <value>hdfs://localhost:9000/</value>
           <description>Client和NN同一台机子</description>
</property>

非本机需要把localhost换成NN的IP或者是可以解析的hostname

另外,你说出现了很多问题, 这些问题指哪些, 请仔细分析一下, 如果可以, 请贴出Client端和Namenode端的日志

楼主你上面说的配置文件是在修改的client端的配置文件吗?如果我有一台nn和dn同一网段中的机子,我想让他成为client机子,我是不是应该首先在它上面安装好hadoop,配置好……然后就可以了?nn上还需不需要再配置一下?
另外,为什么要让它们是同一个网段?我需要上传文件的……是不是不同网段的话,hadoop默认存储优先选择同一网段呀?
9 楼 david.org 2010-05-10  
mygirl1987 写道
请问楼主,client客户端怎么配置?我之前上传文件都是把namenode节点当作客户端来用,然后我发现在datanode节点中上传就会出现好多问题,尤其是我修改了hadoop的一些功能到了datanode节点上上传时,那些功能都没用了,请问是怎么回事?

Hadoop#HDFS分为三个组成部分, Client, DN, NN.

前者可以为任意的连网客户机, 后两者建议放到内网集群中。

1. 当你需要put文件到集群时, Client最好放到和DN, NN一样的网段内。
2. 当你仅需要move, delete文件时, Client可以放到任意远程客户机。

那么要想让Client工作, Hadoop-site.xml文件最起码需要配置fs.default.name.
<property>
   <name>fs.default.name</name>
   <value>hdfs://localhost:9000/</value>
           <description>Client和NN同一台机子</description>
</property>

非本机需要把localhost换成NN的IP或者是可以解析的hostname

另外,你说出现了很多问题, 这些问题指哪些, 请仔细分析一下, 如果可以, 请贴出Client端和Namenode端的日志
8 楼 mygirl1987 2010-05-10  
请问楼主,client客户端怎么配置?我之前上传文件都是把namenode节点当作客户端来用,然后我发现在datanode节点中上传就会出现好多问题,尤其是我修改了hadoop的一些功能到了datanode节点上上传时,那些功能都没用了,请问是怎么回事?
7 楼 liuqing9382 2010-04-28  
楼主写的这么好的资料今天才看到,非常感谢楼主无私的分享,也希望越来越多的人开始接触Hadoop。
6 楼 mercyblitz 2010-03-15  
david.org 写道
egmacross 写道
楼主头像像马云。


不是吧, 我比他帅吧,哈哈, 开玩笑 ..  


确实
5 楼 david.org 2010-03-14  
楼上, 关于hadoop架构, hadoop.apache.org中的docs里有很多介绍, 完全可以参考.
4 楼 david.org 2010-03-12  
dennis_zane 写道
开始分享了,支持一下。

呵呵,也谢谢你一直以来的大力帮助。 

相关推荐

    hadoop源码分析-HDFS&MapReduce

    **HDFS源码分析** 1. **NameNode与DataNode**:HDFS的核心组件包括NameNode和DataNode。NameNode作为元数据管理节点,存储文件系统的命名空间信息和文件的块映射信息。DataNode则是数据存储节点,负责存储实际的...

    hadoop-core-0.20.2 源码 hadoop-2.5.1-src.tar.gz 源码 hadoop 源码

    **Hadoop Core源码分析** Hadoop-core-0.20.2是Hadoop早期版本的核心组件,它包含了Hadoop的文件系统接口、分布式计算模型MapReduce以及其他的工具和库。在源码中,我们可以看到以下几个关键部分: 1. **HDFS接口*...

    hadoop-3.1.1-src.tar

    1. **HDFS源码**:HDFS的源码主要位于`hadoop-hdfs-project/hadoop-hdfs`模块中,包含了NameNode、DataNode和Client等组件。NameNode负责元数据管理,DataNode负责数据存储,源码分析可以帮助我们理解其工作原理,如...

    hadoop-2.7.7-dependence.zip

    比如,一个Java应用程序通过hadoop-client-2.7.7.jar提交一个MapReduce作业,作业中会用到hadoop-common-2.7.7.jar提供的通用功能,而数据的读写则依赖于hadoop-hdfs-2.7.7.jar。在Hadoop生态系统中,这些jar包是...

    hadoop-3.0.1-src.tar.gz

    其源代码中,我们可以看到如`hadoop-hdfs-project`子目录,包含HDFS的相关模块,如NameNode、DataNode等,这些组件协同工作,确保数据的高可用性和容错性。MapReduce则是Hadoop的数据处理模型,通过"map"和"reduce...

    hadoop-3.1.3-src.tar.gz

    - **源码结构**:源代码中包含`hadoop-common`、`hadoop-hdfs`、`hadoop-mapreduce`等模块,分别对应Hadoop的基础功能、HDFS和MapReduce。 - **编译与构建**:使用Maven进行项目管理和构建,开发者可以通过修改pom...

    hadoop-3.0.0-alpha1-src.tar.gz 源码

    源码中,主要关注`hadoop-hdfs-project`目录下的内容,包括NameNode、DataNode、Secondary NameNode等节点的实现。 2. **MapReduce**:MapReduce是Hadoop的并行计算模型,它将复杂的大数据处理任务分解为两个阶段:...

    hadoop-2.6.0.tar.gz&hadoop-2.6.0-cdh5.16.2.tar.gz

    Hadoop-2.6.0.tar.gz是Apache官方发布的Hadoop 2.6.0源码包,包含了Hadoop的核心组件,如HDFS(Hadoop Distributed File System)、YARN以及MapReduce。用户可以通过解压此文件,编译安装来搭建自己的Hadoop环境,...

    hadoop-3.4.0-src.tar.gz

    3. `hadoop-hdfs-project/hadoop-hdfs-rbf`:路由服务器(Router-based Federation)的实现,用于扩展大型HDFS集群的命名空间。 MapReduce则是Hadoop的并行计算模型,它将大任务分解为小任务(Map阶段),然后在...

    hadoop-3.1.2-src.tar.gz

    1. HDFS组件:在"Hadoop-3.1.2-src"源码中,HDFS的相关代码位于`hadoop-hdfs-project`目录下。此部分涵盖了NameNode、DataNode、Client等组件的实现,通过这些源码可以了解到HDFS的元数据管理、数据块存储、故障恢复...

    hadoop源码分析-mapreduce部分.doc

    《Hadoop源码分析——MapReduce深度解析》 Hadoop,作为云计算领域的核心组件,以其分布式存储和计算能力,为大数据处理提供了强大的支持。MapReduce是Hadoop的主要计算框架,其设计思想源于Google的论文,旨在解决...

    Hadoop源码分析(完整版)

    在Hadoop源码分析中,我们能看到这些Google技术的影子,例如Chubby和ZooKeeper,GFS和HDFS,BigTable和HBase,MapReduce和Hadoop。通过对比这些技术,学习者可以更容易地把握Hadoop的设计思路。 Hadoop源码复杂且...

    hadoop-2.0.0-cdh4.2.1的src

    6. **源码分析** 深入研究`src`目录下的源代码,可以了解Hadoop的内部工作机制,如: - `hadoop-common`包含Hadoop的基础组件和服务,如网络通信、配置、文件系统API等。 - `hadoop-hdfs`包含了HDFS的实现细节。 ...

    Hadoop源码分析HDFS数据流

    Hadoop 源码分析 HDFS 数据流 Hadoop 的 HDFS(Hadoop Distributed File System)是 Hadoop 项目中最核心的组件之一,它提供了高可靠、高-performance 的分布式文件系统。HDFS 的核心组件包括 Namenode、Datanode、...

    实战Hadoop源码--刘鹏

    《实战Hadoop源码》是刘鹏先生撰写的一本深入解析Hadoop的专著,针对对云计算技术感兴趣的读者,特别是那些希望通过源代码学习Hadoop内在机制的开发者。这本书旨在帮助读者理解Hadoop如何实现分布式计算,以及如何在...

    hadooponwindows-master.rar

    - **获取Hadoop源码或二进制包**:可以从Apache官方网站下载Hadoop的tar.gz或zip文件。 - **解压并配置环境变量**:将Hadoop解压到适当目录,并在系统环境变量中添加HADOOP_HOME,以及更新PATH变量。 - **配置...

    hadoop-2.10.0-src.tar.gz

    源码文件"hadoop-2.10.0-src"包含了许多子项目和模块,如hadoop-common、hadoop-hdfs、hadoop-yarn、hadoop-mapreduce等,这些模块分别对应Hadoop的核心组件和服务。每个模块下都有各自的源代码文件,如Java类、配置...

Global site tag (gtag.js) - Google Analytics