April 2017

Hadoop之HDFS原理及文件上传下载源码分析(下)

  上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信。本篇将继续介绍hdfs文件上传、下载源解析。 文件上传   先上文件上传的方法调用过程时序图:          其主要执行过程:    FileSystem初始化,Client拿到NameNodeRpcServer代理对象,建立与NameNode的RPC通信(楼主上篇已经介绍过了)    调用FileSystem的create()方法,由于实现类为DistributedFileSystem,所有是调用该类中的create()方法    DistributedFileSystem持有DFSClient的引用,继续调用DFSClient中的create()方法    DFSOutputStream提供的静态newStreamForCreate()方法中调用NameNodeRpcServer服务端的create()方法并创建DFSOutputStream输出流对象返回    通过hadoop提供的IOUtil工具类将输出流输出到本地   下面我们来看下源码:   首先初始化文件系统,建立与服务端的RPC通信    1 HDFSDemo.java 2 OutputStream os… Read More »Hadoop之HDFS原理及文件上传下载源码分析(下)

Hadoop之HDFS原理及文件上传下载源码分析(上)

HDFS原理   首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来。   楼主的环境:   操作系统:Ubuntu 15.10   hadoop版本:2.7.3   HA:否(随便搭了个伪分布式) 文件上传 下图描述了Client向HDFS上传一个200M大小的日志文件的大致过程:   首先,Client发起文件上传请求,即通过RPC与NameNode建立通讯。   NameNode与各DataNode使用心跳机制来获取DataNode信息。NameNode收到Client请求后,获取DataNode信息,并将可存储文件的节点信息返回给Client。   Client收到NameNode返回的信息,与对应的DataNode节点取得联系,并向该节点写文件。   文件写入到DataNode后,以流水线的方式复制到其他DataNode(当然,这里面也有DataNode向NameNode申请block,这里不详细介绍),至于复制多少份,与所配置的hdfs-default.xml中的dfs.replication相关。   元数据存储   先明确几个概念:   fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。  edits:操作日志文件。  fstime:保存最近一次checkpoint的时间   checkpoint可在hdfs-default.xml中具体配置,默认为3600秒: 1 property> 2 name>dfs.namenode.checkpoint.periodname> 3 value>3600value> 4 description>The… Read More »Hadoop之HDFS原理及文件上传下载源码分析(上)

Hadoop之RPC简单使用(远程过程调用协议)

  一、RPC概述   RPC是指远程过程调用,也就是说两台不同的服务器(不受操作系统限制),一个应用部署在Linux-A上,一个应用部署在Windows-B或Linux-B上,若A想要调用B上的某个方法method(),由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语意和传达调用的参数。   楼主在接触RPC之前,用得最多的莫过于WebService。WebService可以说是在RPC发展的基础之上。RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service等,又比如现在阿里巴巴的Dubbo,Apache下的hadoop项目。该篇楼主主要以hadoop的RPC为例。   hadoop为何要使用RPC?在HDFS中,我们通过jsp可查看到有DataNode,NameNode,SecondaryNameNode主要进程(楼主只启动了HDFS),我们客户端Client与NameNode通信,NameNode与DataNode的通信,都是在不同进程间,不同系统间的通信。      二、RPC流程     通过下图,我们简单分析RPC的执行流程:        首先,要解决通讯的问题,主要是通过在Client和Server之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。   第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。   第三,当Client上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到Server,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize),通过寻址和传输将序列化的二进制发送给B服务器。   第四,Server收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。   三、hadoop—RPC的简单使用   定义接口Bizable:    1 package cn.jon.hadoop.rpc; 2 3 public… Read More »Hadoop之RPC简单使用(远程过程调用协议)