Hadoop源码分析之一(RPC机制之Server)

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

网上已经有很多关于Hadoop源码分析的好文,在这记录的目的是把自己在看Hadoop源码时自己的一些体会,方便日后查询巩固。

相关阅读:Hadoop源码分析之二(RPC机制之Call处理) http://www.linuxidc.com/Linux/2013-01/77252.htm

想了解Hadoop是如何工作的,首先需要了解Hadoop RPC原理。Hadoop提供了一个统一的RPC机制来处理client-namenode, namenode-dataname,client-dataname之间的通信。整个机制中主要运用了如下技术:

 

  1. Java dynamic proxy:主要用于处理client的代理来统一向Server端发送信息;
  2. Google Protocal Buffer:主要用于把Request和Response序列化和反序列化成byte进行通信;
  3. Java NIO:主要用于RPC Client与Server之间的通信;
下面主要介绍RPC Server主要的实现逻辑:
如上图Server端主要Listener, Responer Thread和Handler, Reader Thread Pool。
  1. Listener Thread:Server端会启一个Listener线程主要用于监听Client发送过来的Request,Listener主要完成创建一个Connection Object并启动一组Reader Thread Pool,并把Connection通过NIO的SelectionKey传递给Reader,这样就解决了Listener单线程带来的可能的性能瓶颈,因为Listener只作了一层转发;
  2. Reader Thread Pool:主要用于读取Listener传过来的Connection,并调用Connection的readAndProcess方法来读取Request,并封装成一个Call放到Call Queue中;
  3. Hanlder Thread Pool:Server会启动一组线程组来处理Call Queue中Call,并把处理的Respone中放到response queue中,Hanlder怎么处理Call会在后续介绍;
  4. Responder Thread:主要处理response queue中的response,并把response发送给client,如果当前response queue为空,在加了新的response时会马上发送给client端,不会通过responer thread来发送。

相关问答

更多
  • 在Eclipse中新建一个java项目,将src下的文件复制到项目的src下,然后导入lib下的jar文件,即可查看源码了。网上有教程
  • jquery 源码 分析[2022-08-08]

    看完之后对对象和原型的理解帮助会非常大。 但最好等用jquery比较熟悉之后再看源码,那么会对理解比较有好处,也会比较容易看懂。 最好从jquery核心处开始看,看懂$.fn.init以及基本方法之后再看别的$.extend的时候就比较容易了。
  • 关于内核的书不在多,而是要精,强烈推荐 《Linux内核设计与实现》,英文名Linux Kernel Development,机械工业出版社,¥35, 美国Robert Love著,陈莉君译。 此书是当今首屈一指的入门最佳图书。作者是为2.6内核加入了抢占的人,对调度部分非常精通,而调度是整个系统的核心,因此本书是很权威的。对没怎么深入内核的人来说,这是强烈推荐的一本书。
  • 为了增强Hadoop的安全机制, 从2009年起, Apache专门抽出一个团队,为Hadoop增加安全认证和授权机制,至今为止,已经可用。   Apache Hadoop 1.0.0版本和Cloudera CDH3之后的版本添加了安全机制,如果你将Hadoop升级到这两个版本,可能会导致Hadoop的一些应用不可用。   Hadoop提供了两种安全机制:Simple和Kerberos。Simple机制(默认情况,Hadoop采用该机制)采用了SAAS协议。 也就是说,用户提交作业时,你说你是XXX(在Jo ...
  • 不好意思,我现在才看到消息, 我会尽快发到您的邮箱的。
  • 谁说入口就一定是WinMain?很多自定义入口,而且控制台程序默认入口为main,对于MFC的入口,实际上他也是从WinMain开始的,只是WinMain并不在程序中显示,你去查一下头文件就知道了,或者在头文件WinMain设置断点,实际上他还会断在WinMain上,另外好像还有一个AfxMain,我忘记了你自己看头文件
  • Hadoop有asm 3.2而我使用的是ASM 5.在ASM5中,ClassVisitor是一个超类,而在3.2中它是一个接口。 出于某种原因,错误是Throwable(信任Shevek),catch块只捕获异常。 任何hadoop日志都没有捕获throwable错误。 因此,调试非常困难。 使用jar jar链接修复asm版本问题,现在一切正常。 如果你正在使用Hadoop并且某些东西不起作用并且没有日志显示任何错误,那么请尝试抓住Throwable。 阿伦 Hadoop had asm 3.2 and ...
  • 您可以使用通道来实现超时模式: import "time" c := make(chan error, 1) go func() { c <- client.Call("Service", args, &result) } () select { case err := <-c: // use err and result case <-time.After(timeoutNanoseconds): // call timed out } select将阻塞,直到timeoutN ...
  • hadoop 0.20不支持这个,请阅读本期https://issues.apache.org/jira/browse/HADOOP-6889 hadoop 0.20 doesn't support this, please read this issue https://issues.apache.org/jira/browse/HADOOP-6889
  • 好的,找到原因,我连接到纱线资源管理器的错误端口。 正确的配置是:yarn.resourcemanager.address = localhost:8032 Ok, found the reason, I connected to the wrong port for the yarn resourcemanager. The correct configuration is: yarn.resourcemanager.address=localhost:8032