You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-dev@hadoop.apache.org by Andrew McNabb <am...@mcnabbs.org> on 2006/09/26 01:50:03 UTC

Hadoop Network Protocols

I was just curious whether Hadoop's network protocols are documented
anywhere.  I think someone mentioned today that Hadoop was designed so
that implementations could be written in other languages.  I was
wondering how hard that would be and what the protocols are like.

Just curious.

-- 
Andrew McNabb
http://www.mcnabbs.org/andrew/
PGP Fingerprint: 8A17 B57C 6879 1863 DE55  8012 AB4D 6098 8826 6868

Re: Hadoop Network Protocols

Posted by Doug Cutting <cu...@apache.org>.
Andrew McNabb wrote:
> I was just curious whether Hadoop's network protocols are documented
> anywhere.  I think someone mentioned today that Hadoop was designed so
> that implementations could be written in other languages.  I was
> wondering how hard that would be and what the protocols are like.

They're not well documented.  And it would be over-stating it to say 
that they're designed to be implemented in other languages.  Rather I'd 
claim that we've tried to keep language-independence in mind, but, as we 
all know, things aren't portable until they've been ported.

There are folks who've stated that they intend to port these to C or C++ 
someday.  The first step would be to change all RPC parameters and 
return values to be defined with the record API, which does have 
documented and implemented C bindings:

http://lucene.apache.org/hadoop/docs/api/org/apache/hadoop/record/package-summary.html

Hadoop's network code has two more layers: IPC and RPC.

IPC permits one to send an object implementing Writable as a request, 
and return a single object that also implements Writable.  The class of 
requests on a port is assumed to be known by the server, and the class 
of responses is assumed to be known by the client.  The protocol is 
roughly as follows:
  - a TCP connection is opened from client to server
  - [ we should add version negotiation here ]
  - the client loops, sending:
      <CallId> a four-byte integer naming the call
      <Length> the four-byte length of the request
      <byte>* the request payload
  - asynchronously, the server loops, sending:
     <CallId> the call whose response is ready
     <Error> a boolean indicating whether the call succeeded
        if true, the error data follows
        otherwise, the response data follows.

Responses are not always returned in the order requests are sent. 
Response data is not yet length-prefixed, but should be.  There's 
nothing Java-specific in the IPC layer.

RPC layers methods on this.  This uses lots of Java-specific stuff, like 
method names and class names.  The request Writable implementation is 
the private class RPC.Invocation.  This just writes the method name as a 
  string, the number of parameters, then writes each parameter using 
ObjectWritable.  Responses are passed using ObjectWritable.

ObjectWritable is mostly simply a class name followed by class-specific 
instance data.  There's a little more to it, since Java's primitive 
types are not classes.

So the RPC layer assumes that you can, given a class name, instantiate 
an instance and call its readFields method.  It also assumes that, given 
a method name and a parameter list, you can call a method.  Java's 
reflection makes this easy.  But to do this in C or C++ would probably 
require moving the specification of protocols out of Java.  Currently we 
use Java interfaces for protocols, but we should instead use a language 
that builds on Hadoop's record API and that can generate Java 
interfaces, as well as C++ client and server stubs.

Doug