1、Client有五个内部类,分别是Call,ParallelCall,ParallelResult,Connetion,ConnectionId

其实这五个类就是去完成两件事情的,一件事情是连接,另外一件事情是调用,而连接呢主要通过Connection来完成,ConnectionId是它的辅助类。调用呢,Call为主,由于会同时和NameNode和其他DataNode通讯,所以需要一个ParallelCall来完成这件事,调用完了总有个返回值吧,所以要有ParallelResult这个类。

2、先来看ConnectionId

This class holds the address and the user ticket. The client connections to servers are uniquely identified by <remoteAddress, protocol, ticket>这个是源码的解释,

下边有10个属性,最核心也就是address,ticket,protocol,连接相关的有rpcTimeout,serverPrincipal,maxIdleTime,connectionRetryPolicy,tcpNoDelay,pingInterval

Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率。Nagle的算 法通常会在TCP程 序里添加两行代码,在未确认数据发送的时候让发送器把数据送到缓存里。任何数据随后继续直到得到明显的数据确认或者直到攒到了一定数量的数据了再发包。

InetSocketAddress address;
     UserGroupInformation ticket;
     Class<?> protocol;
     private static final int PRIME = 16777619;//这个家伙也就是在hashcode里边用了一下
     private int rpcTimeout;
     private String serverPrincipal;
     private int maxIdleTime; //connections will be culled if it was idle for maxIdleTime msecs
     private final RetryPolicy connectionRetryPolicy;
     private boolean tcpNoDelay; // if T then disable Nagle's Algorithm
     private int pingInterval; // how often sends ping to the server in msecs
3、再来看看Connection,

Thread that reads responses and notifies callers.  Each connection owns a socket connected to a remote address.  Calls are multiplexed through this socket: responses may be delivered out of order.

这个家伙继承了Thread这个类,主要读取相应通知调用者,每个连接都维护一个到远端的连接。调用时多路复用:响应不是按序的?

里边也包含了一个内部类PingInputStream

This class sends a ping to the remote side when timeout on reading. If no failure is detected, it retries until at least  a byte is read.

如果没有检测到失败,它会坚持重试到最后一个字节被读取
   private class PingInputStream extends FilterInputStream {}

下面的属性

private InetSocketAddress server;             // server ip:port,这个ConnectionId里边有
  private String serverPrincipal;  // server's krb5 principal name   kerberos这个是一种安全认证系统,如果失败了会用SASL :简单认证与安全层(Simple Authentication And Security Layer),简单认证和安全层,简单身份验证和安全层 ?
  private ConnectionHeader header;              // connection header
  private final ConnectionId remoteId;                // connection id
  private AuthMethod authMethod; // authentication method
  private boolean useSasl;
  private Token<? extends TokenIdentifier> token;
  private SaslRpcClient saslRpcClient;
 
  private Socket socket = null;                 // connected socket
  private DataInputStream in;
  private DataOutputStream out;

下面这几个ConnectionId里边也有
  private int rpcTimeout;
  private int maxIdleTime; //connections will be culled if it was idle for maxIdleTime msecs
  private final RetryPolicy connectionRetryPolicy;
  private boolean tcpNoDelay; // if T then disable Nagle's Algorithm
  private int pingInterval; // how often sends ping to the server in msecs

// currently active calls,并发的这几个要注意下,自己不是很熟,以前自己也没见过把Exception定义为属性变量
  private Hashtable<Integer, Call> calls = new Hashtable<Integer, Call>();
  private AtomicLong lastActivity = new AtomicLong();// last I/O activity time
  private AtomicBoolean shouldCloseConnection = new AtomicBoolean();  // indicate if the connection is closed
  private IOException closeException; // close reason

4、上边的calls里边出现了Call这个类,

A call waiting for a value.

这个简单,就5个属性,分别是id,参数,返回值,异常,结束标志位,平时我们一个方法调用也不过是个参数列表,返回值,异常,只不过这个加了个id和结束标志位done。

int id;                                       // call id
   Writable param;                               // parameter
   Writable value;                               // value, null if error
   IOException error;                            // exception, null if value
   boolean done;                                 // true when call is done

5、在看看这个ParallelCall

Call implementation used for parallel calls.

这个里边就两个属性,当然它继承至Call的属性暂时忽略

private ParallelResults results;
private int index;
6、上面的第一个属性ParallelResults,看看这个内部类

Result collector for parallel calls.

三个属性,也很简单

private Writable[] values;// store the value
private int size;//if (count == size)     notify();                          // if all values are in  then notify waiting caller
private int count; // count it

踏着前人的脚印学hadoop——ipc中的Client的更多相关文章

  1. 踏着前人的脚印学hadoop——ipc中的Server

    1.An abstract IPC service.  IPC calls take a single {@link Writable} as a parameter, and return a {@ ...

  2. 踏着前人的脚印学Hadoop——RPC源码

    A simple RPC mechanism.A protocol  is a Java interface.  All parameters and return types must be one ...

  3. 踏着前人的脚印学Hadoop——结构、重点

    HDFS作为一个分布式文件系统,是所有这些项目的基础.分析好HDFS,有利于了解其他系统.由于Hadoop的HDFS和MapReduce是同一个项目,我们就把他们放在一块,进行分析. 如果把整个had ...

  4. 踏着前人的脚印学Hadoop——序列化,Writerable

    package org.apache.hadoop.io; import java.io.DataOutput;import java.io.DataInput;import java.io.IOEx ...

  5. org.apache.hadoop.ipc.RemoteException(java.io.IOException)

    昨晚突然之间mr跑步起来了 jps查看 进程都在的,但是在reduce任务跑了85%的时候会抛异常 异常情况如下: 2016-09-21 21:32:28,538 INFO [org.apache.h ...

  6. Hadoop IPC的代码结构分析

    与IPC相关的代码在org.apache.hadoop.ipc包下.共七个文件,其中4个辅助类: RemoteException Status VersionedProtocol Connection ...

  7. 一张图解释Hadoop IPC

    基于hadoop2.6.2.... 一张图Server启动,Client访问..... RPC是IPC的一种,IPC还有另外一种LPC,相关请看参考中的3 使用hadoop ipc步骤: 1.定义RP ...

  8. 运行基准测试hadoop集群中的问题:org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /benchmarks/TestDFSIO/io_data/test_

    在master(即:host2)中执行 hadoop jar hadoop-test-1.1.2.jar DFSCIOTest -write -nrFiles 12 -fileSize 10240 - ...

  9. hive运行query语句时提示错误:org.apache.hadoop.ipc.RemoteException: java.io.IOException: java.io.IOException:

    hive> select product_id, track_time from trackinfo limit 5; Total MapReduce jobs = 1 Launching Jo ...

随机推荐

  1. [html] Quirks Standards

    [产生] Standards : 从IE6开始,引入了Standards模式 Quirks  : 在IE6之前CSS还不够成熟,所以IE5等之前的浏览器对CSS的支持很差,为了兼容ie5之前的页面, ...

  2. 利用php的序列化和反序列化来做简单的数据本地存储

    利用php的序列化和反序列化来做简单的数据本地存储 如下程序可以做为一个工具类 /** * 利用php的序列化和反序列化来做简单的数据本地存储 */ class objectdb { private ...

  3. 鼠标经过导航中li时,一个彩色模块跟着鼠标移动

    1.鼠标经过导航中li时,一个活动的li跟随鼠标移动,最终移动到鼠标的停留的位置.(如需鼠标离开后让活动的li回到初始位置,则用jq hover事件,当鼠标离开时,给活动的li设置left是0) 2. ...

  4. robotframework笔记11

    测试用例的语法 基本语法 测试用例构造测试用例表中可用 关键词. 关键字可以进口 测试库 或 资源 文件 或创建的 关键字表 的测试用例文件 本身. 测试用例表中第一列包含测试用例的名称. 一个 测试 ...

  5. 101个MySQL 的调节和优化的提示

    MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...

  6. listbox鼠标拖动数据和为button注册快捷键

    将listbox1中的数据用鼠标拖动至listbox2,即有左至右. 分别对应控件注册如下事件DragEnter,MouseDown,DragDrop 代码如下: //P128 DataGridVie ...

  7. Excepion

    异常:就是程序在运行时出现不正常的情况. 异常由来:问题也就是现实生活中一个具体的食物,也可以通过java的类的形式进行秒速.并封装成对象.其实就是java对不正常情况进行毛素后的对象体现. 对于问题 ...

  8. C++的vector学习abc

    开始学习和使用vector了,用到之后再去学似乎神迹的感觉啊,就像跑一下就能给个糖吃哈哈 百度上的六种初始化的方法就不再说了,那些方法都很对. 如果没有值初始化,系统会自行初始化,目前我遇到的是用脚标 ...

  9. 《Pro AngularJS》学习小结-01

    <Pro AngularJS>该书以一个SportsStore案例为主线铺开. 一.开发环境设置 该书中所用的数据库data server开发环境是Deployed,从来没听说过,而且作者 ...

  10. 《Play for Java》学习笔记(五)Form

    本书第六章以一个实例介绍了Play Framework中Form的使用,如何绑定数据,如何进行验证 一.项目结构和action