Hadooo 源代码分析

2019-03-28 13:16|来源: 网络

HDFS

HDFS client 分析

客户端的功能

今天开始分析HDFS源代码,首先从HDFS的client端分析。对于分布式文件系统,Client端的功能,就是接收用户的请求,通过网络,与 NameNode 和 DataNode交互。

首先确定的是,client端是一个hdfs提供的lib库,用户的应用程序需要包含该库,调用该库提供的函数来访问NameNode和DataNode

HDFS提供了一个shell程序,通过shell程序,可以通过一下命令比较简洁的访问HDFS

HDFS的文件系统抽象层

抽象类FileSystem提供了一个文件系统的抽象层,它包括了分布式文件系统和local文件系统的一个统一的抽象接口。它囊括了所有的文件系统的操作接口,包括元数据和数据接口。对于HDFS,实现该接口的类为DistributedFileSystem.

DirstrubtedFileSystem类是DFSClient 的wrap类。其主要的功能由DFSClient完成。

客户端shell程序的启动

Client 的的shell程序的main函数在类org.apache.Hadoop.fs.FsShell类中。我们顺着main函数执行的流程,来逐步分析整个client端代码。

我们先看一些interface,我们知道,interface没有具体的实现,只是规定一些操作的规范给其实现的类,这样就可以实现要做什么(interface)和实际实现者的功能上的分离。

Interface Configurable 实现了两个操作,就是

public interface Configurable {

voidsetConf(Configuration conf);

ConfigurationgetConf();

}

然后是接口 Tool,实现了执行命令的接口。

public interface Tool extends Configurable {

int run(String []args) throws Exception;

}

 

我们看到,具体实现以上两个接口的,就是FsShell类。

public class FsShell extends Configured implements Tool {

}

下面正式看一下类org.apache.hadoop.fs.FsShell的main函数来的运行过程。

其主要的过程如下: 分析命令行参数,调用FsShell 的run函数来处理相关的命令。

我们再看一下FsShell里的run函数,其就是匹配各种命令,调用FsShell里相关的处理函数。其对于的处理命令被最终由FileSystem处理。在FsShell类的init函数里,通过从配置文件获取具体的文件系统类(FileSystem)的实现,当client端起来后,其处理相关的命令的功能交给DistributedFileSystem类来实现。

Client 元数据的操作

Client的数据操作

我们重点关注一下读写出错时的错误处理,这是分布式系统的关键。

我们看到数据操作,无论数据操作,无论是写,还是读,在客户端都没有缓存,都是在写或者读的系统调用返回后,对于写,数据都flush都DataNode上,对于read,客户端的系统里是没有数据缓存的。

我们先一下block,packet,chunk之间的区别。

Packet类,一个Packet就是数据发送的基本单位,一个Packet由多个chunk组成,一个数据块就是数据校验的单位,默认为512字节,也就是说一个512字节的数据块加一个checksum,checksum的长度一般为4字节。一个Block有多个packet组成。一个block为64M,一个packet默认为64k,

相关问答

更多
  • 要是那么容易找到的话 做网站的就不用吃饭了 他们的地址都是有加密 不过如果你不怕麻烦的话 可以在浏览器的临时文件里一个个的看 应该会有你要找的东西 还有 就是找个flash下载软件 他会帮你找的
  • 毫不犹豫的买下了,京东速度果然非常快的,从配货到送货也很具体,快递非常好,很快收到书了。书的包装非常好,没有拆开过,非常新,可以说无论自己阅读家人阅读,内核源代码情景分析(上册)采取类似于英语教学中行之有效的情景会话的教学方法,全面深入地剖析了最新版本核心源代码,并对核心的独特优点和需要进一步改进的问题作了精辟的评述。内核源代码情景分析(上册)包括预备知识、存储管理、中断和系统调用、进程和进程调度、文件系统以及传统的进程通讯共六章。收藏还是送人都特别有面子的说,特别精美各种十分美好虽然看着书本看着相对简单, ...
  • HashMap ,都知道哪里要用 HashMap ,知道 Hashtable 和 HashMap 之间的区别 ,那么 为何这道面试题如此特殊呢?是因为这道题考察的深度很深。 这题经常出现在高级或中高级 面试中。投资银行更喜欢问这个问题,甚至会要求你实现 HashMap 来考察你的编程能力。 ConcurrentHashMap 和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的 旅程吧!
  • 这个文件非常小 你们老师分析模板给了很好分析了 一,源代码文件名称 Linux/lib/setsid.c 二,源代码功能描述 整体功能:如果调用的进程不是一个组的组长时,setsid创建一个新会话。调用进程将成为该新会话的组长,新进程组的组长,并且没有控制终端。调用进程的组id和会话id被设置成进程的PID,调用进程将成为新进程组合和新会话中的唯一进程。 函数输入:pid-t,setsid 函数输出:调用进程的会话标识符 函数功能:(就一个函数,所以就跟整体功能相同就行了) 三,程序流程图 (可以省略了)d ...
  • GCC是GNU中的旗舰产品,也是开源世界的重量级产品,大多数开源产品都是基于这个编译器的。 GCC其实是一个编译器的集合,其中的C++编译器就是G++。 GCC的结构很巧妙,是采用前端、后端相结合的方式,前端负责处理语言分析,生成中间代码,后端负责具体的物理平台的处理,负责生成具体的目标代码。这也是GCC能够支持多种语言和多种平台的一个原因。 这个题目就是想利用GCC的这个结构特点,将其前端的语言分析部分提取出来,重构成独立的应用程序,用来对输入的源代码进行分析,并生成分析报告。 代码分析的目的是为程序员提 ...
  • 自己也分析一下python源代码吧,呵呵,你也写一篇,我看了下python源代码都是c的,适合你分析:mrgreen:
  • 这个文件非常小 你们老师分析模板给了很好分析了 一,源代码文件名称 Linux/lib/setsid.c 二,源代码功能描述 整体功能:如果调用的进程不是一个组的组长时,setsid创建一个新会话。调用进程将成为该新会话的组长,新进程组的组长,并且没有控制终端。调用进程的组id和会话id被设置成进程的PID,调用进程将成为新进程组合和新会话中的唯一进程。 函数输入:pid-t,setsid 函数输出:调用进程的会话标识符 函数功能:(就一个函数,所以就跟整体功能相同就行了) 三,程序流程图 (可以省略了)d ...
  • 源码分析是程序员离不开的话题。无论是研究开源项目,还是平时做各类移植、开发,都避免不了对源码的深入解读。   传统的命令行工具 Cscope, Ctags 可以结合 vim 等工具提供高效快捷的跳转,但是无法清晰的展示函数内部的逻辑关系。   至于图形化的IDE,如 QtCreator, Source Insight, Eclipse, Android Studio 等,却显得笨重,而且不一定支持导出调用关系图。
  • 是的,你只需要编写一个maven或ant脚本来查看SVN的最新信息,然后运行sonar:sonar命令。 看起来Sonar强迫您创建一个pom.xml文件并安装maven2,即使是非mavenized项目: http ://docs.sonarqube.org/display/SONAR/Analyzing+Source+Code (fyi - Sonar通过一个专门的项目很容易变得容易,但在任何设置中,关键都在于养成查看和使用Sonar的结果以改善开发的习惯。这是困难的部分。) Yes, you just ...
  • 在Matlab桌面的“当前文件夹”窗口的顶部,有一个看起来像小齿轮的图标。 点击它,然后从出现的菜单中选择Reports ,然后选择Dependency Report 。 还有许多其他报告可能会对您有所帮助。 您可能还想调查Matlab Profiler。 At the top of the Current Folder window in the Matlab desktop there is an icon which looks like a small toothed wheel. Click on ...