`
zhanghaj00
  • 浏览: 64110 次
社区版块
存档分类
最新评论

Hadoop 2.5.0 之 RPC 初体验 一 IPC server 类自己看

 
阅读更多

最近领导发话,搞了三周的web项目,整个人都不好了,加班加点,终于还是做到了自己喜欢的样子,从各种热启动,各种配置灵活,可惜没有用到JMX来管理,不过好的一点是能做到各种切换,各种配置,还是给自己打个50分。  总结项目中用到的技术,其实想想也就那么点  SpringMVC的 Json和XML的viewResover,Quartz2.x和Spring的整合来控制定时任务的调度重启什么的,还有正式环境测试环境的检测和自动切换,好吧 ,这么点东西搞了那么久 给自己40分。。

 

当然 期间也不能间断学习。

接下来就开始今天的主题吧。

 

从Reactor说起。Reactor是现在高并发的通用理论了,也是异步调用的很好的应用,很多著名的服务器都是用Reactor模式来做的,好的 简单说下这个模式的论文。。。。(好高深)

Reactor由以下几部分组成:(转xxx)

 

Handles:

就是网络连接(connection),每个网络连接都由一个handle表示。

Event(事件)
ACCEPT_EVENT:表示收到连接请求
READ_EVENT:表示收到数据
WRITE_EVENT:表示socket可以足够的缓冲区,可以向其写入数据。
TIMEOUT_EVENT:超时。Java NIO不支持这个事件。
SIGNAL_EVENT:信号。Java NIO不支持这个事件。
CLOSE_EVENT:该socket被关闭。Java NIO不支持这个事件。
 
Event Handler
事件处理代码,该对象实例(instance)是和handle关联的。每个Event Handler处理一个handle上的事件。一般的服务器中至少有两种事件处理代码:一个是用来接收连接请求(accept event handler),响应ACCEPT_EVENT。,一个用来处理接受的请求(connection event handler),响应READ_EVENT和WRITE_EVENT。
 
Synchronous Event Demultiplexer(事件多路分离系统)
该模式的核心,等待handles上的事件。没有事件出现时,一直阻塞(blocking);当某个(某些)handles上有时间产生时,返回。这个是实现一般由操作系统提供,如linux的select、poll及epoll等。
 
Initiation Dispatcher
该对象负责管理Event Handlers(增加,删除等),当某个handle上有事件出现时,调用相应的
内部使用Synchronous Event Demultiplexer
 
reactor的论文中给出了实例代码
Logging_Acceptor是处理接收请求的event handler。
Logging_Handler是处理实际请求的event handler
Initiation_Dispatcher::instance是单利模式的Initiation Dispatcher

-----------------------------------我是分割线------------------------------------------------

但是想学习这个模式 不能看论文吧,听说Hadoop的RPC 中,Server端就是利用了这个模型,我们拨开来看看

 

1.RPC  远程 producer call 我也不知道怎么翻译 ,

首先说说Server端负责什么,当然是处理client端的请求,其中还有为了实现R 远程这个而有的 反射和代理这里就不罗嗦了。。只说我看到的关键吧

 

进入ipc.Server类中

 

Server端做的就是 1.接收请求,2.处理请求,3,返回结果,(大象放入冰箱的三个步骤)

 

这其中怎么体现Reactor的设计模型呢?

 

(1) 接收请求阶段,

       首先 所有的请求都会放入一个内部类Call中然后放入一个队列里面,东西有了。然后怎么处理呢?Hadoop这里用的是一个内部类Listerner来建立连接,一个Reader来读取请求,

 

     先说Listerner 吧 ,其实就是轮询监听有没有新的请求

 

public Listener() throws IOException {
      //这里监听Server的请求
      address = new InetSocketAddress(bindAddress, port);
      // Create a new server socket and set to non blocking mode
      acceptChannel = ServerSocketChannel.open();
      acceptChannel.configureBlocking(false);
	//设置成异步执行
      // Bind the server socket to the local host and port
      bind(acceptChannel.socket(), address, backlogLength, conf, portRangeConfig);
      port = acceptChannel.socket().getLocalPort(); //Could be an ephemeral port
      // create a selector;
      selector= Selector.open();
	//这里的readThreads是设置中的默认为1,修改这里的配置可以提高性能哦
      readers = new Reader[readThreads];
      for (int i = 0; i < readThreads; i++) {
        Reader reader = new Reader(
            "Socket Reader #" + (i + 1) + " for port " + port);
        readers[i] = reader;
	//启动reader线程
        reader.start();
      }

      // Register accepts on the server socket with the selector.
      acceptChannel.register(selector, SelectionKey.OP_ACCEPT);
      this.setName("IPC Server listener on " + port);
      this.setDaemon(true);
    }

 

说了Listerner是一个线程,初始化完了要启动,代码中只有一个doAccept(key);方法。可以理解 就是吧连接放到一个queue里面 然后reader已经启动啦 就可以开始干活了。

其中这段代码:是doaccept中

 

Reader reader = getReader();
Connection c = connectionManager.register(channel);
key.attach(c);  // so closeCurrentConnection can get the object
reader.addConnection(c);

就是将一个事件绑定到这个Key上 然后  设置一下最后联系的时间  呃呃呃。。我理解的这个attach在这里的用途就是这个。。额 可能我看不懂吧。。

 Connection c = (Connection)key.attachment();
 c.setLastContact(Time.now());

然后 不是Reader线程已经再跑了么。那run方法中:

先是给Connection注册 read事件conn.channel.register(readSelector, SelectionKey.OP_READ, conn);

然后再doread中 调用 count = c.readAndProcess(); 关键方法 开始读了。。这其中用了两个Seletor  分别是listener和reader 这个selector设置了异步就是通过socketchannel向selector注册实现的,额 这就是NIO部分的内容了,然后 就进入那个方法 就到了connection内部类调用handler内部类的时候了。。下次再看吧
        

 

 

 

 

分享到:
评论

相关推荐

    基于Hadoop2.5.0的集群搭建

    基于Hadoop2.5.0的集群搭建 本文详细记录了基于Hadoop2.5.1的集群安装过程,包括JDK、Hadoop、Hive、ZK、MySql、Sqoop等组件的安装和配置。该集群由一主节点和多个从节点组成,实现了高可用性和高性能的数据处理...

    hadoop2.5.0-eclipse插件

    Hadoop 2.5.0-Eclipse 插件是针对Hadoop开发环境的一种增强工具,它使得在Eclipse集成开发环境中可以直接管理和调试Hadoop项目变得更为便捷。此插件是Hadoop开发者的重要辅助,尤其对于那些希望在本地环境中模拟...

    hadoop2.5.0集群环境部署文档.txt

    hadoop2.5.0集群环境部署文档.txt 是公司在部署hadoop 原生版本总结的资料,方便大家在今后部署hadoop 大数据平台的时候手忙脚乱的去从网上收部署资料,而且部署资料有的也不大全面,在此把总结上传一份。...

    hadoop-2.5.0-eclipse插件

    而Hadoop-2.5.0-eclipse插件则是为Eclipse集成开发环境(IDE)设计的一个扩展,帮助开发者在Eclipse中直接编写、调试和运行Hadoop MapReduce程序。 该插件的安装非常简单,只需将`hadoop-eclipse-plugin-2.5.0.jar`...

    编译hadoop-2.5.0-cdh5.3.6 + snappy 源码的native包

    在IT行业中,尤其是在大数据处理领域,Hadoop是一个至关重要的开源框架,它允许分布式存储和处理大规模数据集。本文将详细讲解如何在CentOS 6.5系统上编译Hadoop 2.5.0 - CDH5.3.6与Snappy的源码,以生成适用于该...

    hadoop 2.5.0 编译snappy

    在大数据处理领域,Hadoop是一个不可或缺的开源框架,它提供了分布式存储和计算的能力。而Snappy则是一款高效的压缩和解压缩库,常用于提升数据在Hadoop环境中的传输速度。在Hadoop 2.5.0版本中,为了优化性能,用户...

    hadoop2.5.0 snappy编译jar包

    Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它允许在大规模集群中高效处理和存储大量数据。在Hadoop 2.5.0版本中,引入了对Snappy压缩算法的支持,以提升数据读写速度。Snappy是一款快速的、无损的数据...

    hadoop-2.5.0-cdh5.3.6-src.tar.gz

    本篇将深入探讨Hadoop 2.5.0-cdh5.3.6版本的源码,解析其设计理念、架构以及主要功能,旨在帮助读者全面理解这一版本的特点和应用场景。 1. Hadoop概述: Hadoop是Apache软件基金会开发的一个开源分布式计算框架,...

    native(hadoop-2.5.0-cdh5.2.0).tar

    标题 "native(hadoop-2.5.0-cdh5.2.0).tar" 提供的是一个针对Hadoop 2.5.0 CDH5.2.0版本的本地库文件集合,它已经过编译,可以用于在特定操作系统上支持Hadoop运行。CDH(Cloudera Distribution Including Apache ...

    spring-data-hadoop-core-2.5.0.RELEASE.jar

    这是spring的一个jar包,必不可少,必须需要,自取吧,我用了,还行

    hadoop-2.5 windows 64位

    Hadoop 2.5.0是这个项目在2014年8月发布的一个重要版本,针对Windows 64位操作系统进行了优化,为在Windows环境下运行Hadoop提供了可能性。 在Windows上运行Hadoop的传统挑战在于其主要设计是面向Linux环境的,因此...

    Hadoop_RPC详细分析.doc

    Hadoop RPC(Remote Procedure Call,远程过程调用)是 Hadoop 项目中的一个重要组件,用于实现分布式系统中的通信和数据交换。下面是对 Hadoop RPC 的详细分析。 RPCInterface Hadoop RPC 的核心是 RPCInterface...

    hadoop-2.5.0.tar.gz

    6. 其他组件:Hadoop 2.5.0还包含了其他一些组件,如Hadoop Oozie工作流管理系统、Hadoop Hive数据仓库工具、Hadoop Pig脚本语言以及Hadoop HBase分布式数据库等,它们共同构建了一个完整的大数据处理生态系统。...

    hadoop-2.5.0-cdh5.3.6 编译native包

    在大数据领域,Hadoop是一个广泛使用的开源框架,用于存储和处理海量数据。Hadoop的高效性和可扩展性使其成为许多企业的首选。在这个过程中,编译Hadoop的native库是优化性能的关键步骤,尤其是在运行C++应用程序...

    hadoop-2.5.0-src.tar.gz

    hadoop-2.5.0-src.tar.gzhadoop-2.5.0-src.tar.gzhadoop-2.5.0-src.tar.gzhadoop-2.5.0-src.tar.gzhadoop-2.5.0-src.tar.gz

    spark-assembly-1.3.0-hadoop2.5.0-cdh5.3.0.jar的下载地址和提取码

    spark-assembly-1.3.0-hadoop2.5.0-cdh5.3.0.jar的下载地址和提取码

    hadoop-2.5.0-cdh5.3.1centos6.4本地库

    Hadoop是大数据处理领域的一个核心框架,主要用于分布式存储和计算。在这个特定的“hadoop-2.5.0-cdh5.3.1centos6.4本地库”压缩包中,包含的是针对CentOS 6.4 64位系统优化的Hadoop本地库。这些本地库对于Hadoop在...

    Win7中使用Eclipse连接虚拟机中的Linux中的Hadoop2.5.0经验总结

    在本文提到的情况下,可能需要一个修改过的`NativeIO.java`类,按照文档说明进行操作。 5. **注意事项** 在测试和调试过程中,确保Windows和Linux之间的网络通信畅通,SSH连接正常。同时,保持JDK版本与Hadoop...

    Hadoop RPC机制分析

    在Hadoop中,远程过程调用(RPC)是核心组件之一,它使得节点间的通信变得高效且可靠。本文将深入探讨Hadoop的RPC机制,解析其工作原理,并结合源码分析其内部实现。 一、RPC简介 RPC是一种让程序能够调用运行在...

    Hadoop自己的Rpc框架使用Demo

    public class RpcServer { public static void main(String[] args) throws IOException { MyServiceImpl service = new MyServiceImpl(); Server server = RPC.getServer(service, "localhost", 9999, 1, true, ...

Global site tag (gtag.js) - Google Analytics