目录:
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/文件的最后添加你想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流
- 3、datanode开始发送数据(从磁盘里面读取数据放入流,以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/文件的最后添加你想debug的进程
|
6.2、在本地的eclipse中打开NameNode或者DataNode类
点击右键,添加远程debug配置,如图:
6.3、添加一个远程debug调试配置
6.4、填写远程服务端的debug地址和端口号
6.5、接着在namenode类中添加断点
6.6、回到集群服务器上启动hdfs
6.7、回到eclipse之前配置的远程debug配置上,点击debug开始调试
6.8、成功进入断点