Hadoop(三)之深入HDFS源码

目录:

1、hdfs 读数据流程

2、hdfs 写数据流程

3、hadoop的RPC框架

3.1、定义一个接口

3.2、编写接口的业务实现类

3.3、使用RPC框架API将业务实现发布为RPC服务

3.4、客户端通过RPC框架API获取跟RPC服务端通信的socket代理,调用远端服务

4、hdfs 读数据源码分析

5、hdfs 写数据源码分析

6、远程debug跟踪Hadoop服务端代码

6.1、需要在$HADOOP_HOME/etc/hadoop/hadoop-env.sh文件的最后添加你想debug的进程

6.2、在本地的eclipse中打开NameNode或者DataNode类

6.3、添加一个远程debug调试配置

6.4、填写远程服务端的debug地址和端口号

6.5、接着在namenode类中添加断点

6.6、回到集群服务器上启动hdfs

6.7、回到eclipse之前配置的远程debug配置上,点击debug开始调试

6.8、成功进入断点


1、hdfs 读数据流程

  • 1、跟namenode通信查询元数据,找到文件块所在的datanode服务器
  • 2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket
  • 3datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)
  • 4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件

2、hdfs 写数据流程

  • 1、根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
  • 2、namenode返回是否可以上传
  • 3、client请求第一个 block该传输到哪些datanode服务器上
  • 4、namenode返回3个datanode服务器ABC
  • 5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端
  • 6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
  • 7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。

3、hadoop的RPC框架

Hadoop中各节点之间存在大量的远程过程调用,hadoop为此封装了一个RPC基础框架

使用方法:

3.1、定义一个接口

实例如下:

//RCP通信的两端共同遵守的协议(本质上就是业务实现类的接口)
public interface ClientNameNodeProtocal {

       //RPC通信双方一致的版本号
       public static final long versionID = 1L;

       //业务方法签名
       public String getMetaData(String path);
}

3.2、编写接口的业务实现类

/**
 * 业务的具体实现类,应该运行在远端服务器上
 *
 */
public class NamNodeNameSystemImpl implements ClientNameNodeProtocal {

	@Override
	public String getMetaData(String path) {
		
	    //many logic code to find the meta data in meta data pool
	    return "{/aa/bb/bian4.mp4;300M;[BLK_1,BLK_2,BLK_3];3;{[BLK_1:DN-A,DN-B,DN-E],[BLK_2:DN-A,DN-B,DN-C],[BLK_3:DN-A,DN-D,DN-E]}}";
	}
}

3.3、使用RPC框架API将业务实现发布为RPC服务

/**
 * RCP服务发布工具
 *
 */
public class PublishServiceTool {
	
	public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
		
		//创建一个RPC服务builder
		Builder builder = new RPC.Builder(new Configuration());
		//将要发布的服务的信息设置到builder中         builder.setBindAddress("spark01").setPort(10000).setProtocol(ClientNameNodeProtocal.class).setInstance(new NamNodeNameSystemImpl());
		
		//用builder构建出一个socket服务
		Server server = builder.build();
		//将服务启动,就可以等待客户端请求
		server.start();
	}
}

3.4、客户端通过RPC框架API获取跟RPC服务端通信的socket代理,调用远端服务

public class Client {
	public static void main(String[] args) throws Exception {		
		//首先用RPC框架获得要调用的远端服务的引用(动态代理对象)
		ClientNameNodeProtocal namenodeImpl = RPC.getProxy(ClientNameNodeProtocal.class, 1L, new InetSocketAddress("spark01",10000), new Configuration());
		//因为这个动态代理对象实现了业务类的接口,所以可以直接通过这个引用来调用业务类的实现方法(本质上,具体实现在远端,走的是socket通信请求)
		String metaData = namenodeImpl.getMetaData("/aa/bb/bian4.mp4");
		System.out.println(metaData);
		
	}
}

4、hdfs 读数据源码分析

。。。。。。

5、hdfs 写数据源码分析

。。。。。。

6、远程debug跟踪Hadoop服务端代码

6.1、需要在$HADOOP_HOME/etc/hadoop/hadoop-env.sh文件的最后添加你想debug的进程

#远程调试namenode

export HADOOP_NAMENODE_OPTS="-agentlib:jdwp=transport=dt_socket,address=8888,server=y,suspend=y"

#远程调试datanode

export HADOOP_DATANODE_OPTS="-agentlib:jdwp=transport=dt_socket,address=9888,server=y,suspend=y"

 

6.2、在本地的eclipse中打开NameNode或者DataNode类

点击右键,添加远程debug配置,如图:

Hadoop(三)之深入HDFS源码_第1张图片

 

6.3、添加一个远程debug调试配置

Hadoop(三)之深入HDFS源码_第2张图片

6.4、填写远程服务端的debug地址和端口号

Hadoop(三)之深入HDFS源码_第3张图片

6.5、接着在namenode类中添加断点

Hadoop(三)之深入HDFS源码_第4张图片

6.6、回到集群服务器上启动hdfs

Hadoop(三)之深入HDFS源码_第5张图片

6.7、回到eclipse之前配置的远程debug配置上,点击debug开始调试

Hadoop(三)之深入HDFS源码_第6张图片

6.8、成功进入断点

Hadoop(三)之深入HDFS源码_第7张图片

 

你可能感兴趣的:(大数据,Hadoop)