[hadoop] hadoop二次开发 阅读源码

学习目标

  1. hadoopRPC实现原理
  2. namenode工作原理
  3. datanade工作原理

RPC:

1.客户端调用服务端的方法,

2.服务端初始化的时候会创建一个死循环的进程,供客户端调用

3.RPC :Remote Procedure Call 不同进程间方法的调用

4.Hadoop RPC: 不同进程的方法的调用

5.http也是一种RPC:可以实现不同进程的方法的调用

实例:

#服务端
Server server =new RPC.Builder(new Configuration())
		.setBindAddress("localhost")
		.setPort(9999)
		.setProtocol(ClientProtocol.class)
		.setInstance(new NameNodeRpcServer())
		.build();
		/**
		 * 这样的话,就把服务给启动起来了
		 * 服务启动起来了以后,等待别人的调用。
		 */
		server.start();


#客户端
   
//获取服务端的代理
		ClientProtocol namenode= RPC.getProxy(
				ClientProtocol.class,
				1234L, 
				new InetSocketAddress("localhost", 9999) , new Configuration());
		//通过这个代理去调用服务端的代码
		namenode.mkdirPath("/usr/local/host");

RPC总结:

  1. 不同进程的方法的调用
  2. RPC 分为客户端和服务端,客户端调用服务端的方法。方法的执行是在服务端
  3. 其实我们里面一直说的协议其实说白了就是一个接口 但是这个接口有个要求,里面必须要有versionID
  4. 协议里面会很多抽象方法,里面的抽象方法由服务端来去实现。 或者说,谁实现了这些抽象方法,谁就是服务端。

namenode启动流程

Rpc初始化

1.namenode初始化的时候会创建两个httpserver,分别是serviceRpcserver和clientRpcserver

2.每个httpserver会绑定多个service,每个service会绑定多个协议

3.serviceRpcserve主要服务内部(namenode元数据管理和datanode),clientRpcserver主要响应客户端(clientRpc调用)

4.客户端代用操作服务端的namedemo方法的协议

公共服务初始化

1.进行资源检查,检查磁盘资源是否足够存储元数据 hadoop-deamon.sh start namenode  >100M

2.会检查三个目录 namenode的存储fsimage目录,editlog目录;journlanode也有存储元数据的目录

3 初始化FsNameSystem的blockmanager,leasemanager,safemodeinfo和fsimage对象

4.fsimage持久化到磁盘的镜像文件,保证hfds高可用,数据持久化到磁盘,双缓冲机制

5.进入安全模式检查,检查是否可以退出安全模式

6.blockmanager,leasemanager计算block的个数阈值,是否小于阈值进入安全模式

7.safemodeinfo 记录存活的datanode个数 live datanode是否大于0 进入安全模式

8.通过设置block的阈值,来配置进入安全模式的规则

9.启动namenode服务,接着启动datanode

 

datanode初始化

1.实例化DataXserviceServer ,用来接收客户端和其他datanode传过来的数据,并设置为后台线程

2.启动httpServer,绑定了多个servlet,用来接收http的请求,主要用于内部的namenode和datanode的传输

3.启动Rpc服务端,绑定多个service,每个service绑定多个协议

4.初始化blockpoolManager,用于管理block和datanode心跳机制

5.遍历联邦,一个联邦就是一个nameservice(每个联邦里会有多个HA架构,一个HA架构有两个namenode,两个namenode 对应一个namespace命名空间)

6.遍历创建BPOfferService(namespace),一个BPOfferService对应两个BPserviceActor(namenode)

7.dataStorage,datanade的数据存储

8.完成初始化

datanode注册发送心跳

datanade注册

1.遍历BPOfferService (namespace)命名空间中的BPserviceActor 获得nadenode的信息

2.调用NamenadeRpc验证VersionRequest是否正确

3.启动datanade的注册线程,将datanade注册到namenode上:

1)获取namenode的代理,调用namenode的方法,往namenode传输datanade信息(地址,端口号等)

2)调用namnode的 registerDatanade 的方法,往nodenade上注册信息:

3)注册datanode,往一堆数据结构里添加信息

4)注册结束,发送心跳

datanade 发送心跳

1.每三秒发送一次心跳,返回namenode的响应指令(datanode和namenode不直接进行连接,通过心跳的方式获取namenode的指令)

2.调用namenode的方法发送心跳:告诉namenode 有哪些datanade信息(datanade状态,资源等)

3.namenode接收心跳,处理发送过来的心跳信息,并返回响应的指令给datanade

4.namenode获取datanode信息,更新datanode的心跳状态和存储数据,修改上一次的心跳时间

5.namenode通过心跳判断一个datanode是否存活,用当前心跳时间减去上一次的心跳时间超过阈值,判断datanode是否存活

Hdfs 初始化上传

目的:上传文件,查看hdfs上传文件的流程

初始化:

添加元数据

1.客户端使用Rpc代理 调用 namenodeRpcserver创建Fsnamesystem

2.Fsnamesystem调用FSdirectory方法在 目录树的子目录下挂载文件

3.hdfs为了保证元数据的安全性会将数据持久化到磁盘,调用FSeditlog,使用双缓冲,磁盘交换机制,在几乎不影响性能的情况下实现元数据持久化到磁盘

添加契约

1.Fsnamesystem 启动LeaseManager(契约管理者)并在各种数据结构中添加契约

2. LeaseManager 管理 契约的生存周期,每隔2秒检查写入的数据是否符合添加的契约,就是检查是否有写入的权限,写入的数据不符合契约没有权限,LeaseManager会释放契约,还会检查契约是否超过一小时,也会释放。

3.启动完LeaseManager 契约管理者,客户端会每隔30s使用LaseRenewer调用Rpc服务端 通过Fsnamesystem续约一次,就是心跳机制,每隔30s客户端向服务端更新一个服务端上契约的过期时间。

正式上传

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值