2013-01-23 42 views
0

Hadoop的RPC發動機HadoopRpcRequestProto請求字段來編碼方法的參數使用協定緩衝來編碼/從線中的字節進行解碼。如何使用Hadoop中

我試圖使用HadoopRpcRequestProto

HadoopRpcRequestProto rpcReHadoopRpcRequestProtoquest; 
    HadoopRpcRequestProto.Builder builder = HadoopRpcRequestProto.newBuilder(); 
    builder.setMethodName("foo"); 

調用的Hadoop服務器上的方法,所以,如果我的 「foo」 的方法有兩個參數, 富(字符串名稱,INT NUM);

如何編碼參數,並將其設置爲HadoopRpcRequestProto的請求字段?

TIA

回答

1

你應該能夠做這樣的事情:

private HadoopRpcRequestProto constructRpcRequest(Method method, Object paramObj) { 
    HadoopRpcRequestProto rpcRequest; 
    HadoopRpcRequestProto.Builder builder = HadoopRpcRequestProto 
     .newBuilder(); 
    builder.setMethodName(method.getName()); 

    Message param = (Message) paramObj; 
    builder.setRequest(param.toByteString()); 
    rpcRequest = builder.build(); 
    return rpcRequest; 
} 

對於Message類我們談論com.google.protobuf.Message。我認爲你需要編寫一個.proto文件,並在編譯後用protoc進行編譯,以生成Java綁定,然後可以在Java代碼中使用它。因此,例如一個.proto文件看起來是這樣的:

message Person { 
    required int32 id = 1; 
    required string name = 2; 
    optional string email = 3; 
} 

如果你這樣做protoc myperson.proto那麼這將產生一個名爲MyPerson.java類將有一個內部類Person看起來像這樣:

public static final class Person extends 
    com.google.protobuf.GeneratedMessage 
    implements PersonOrBuilder { 
    ... 
} 

這個GeneratedMessage類延伸自AbstractMessage,它實現了我上面提到的Message接口。所以基本上你可以創建你的Person對象,然後你應該可以使用builder.setRequest(person.toByteString())來傳遞它。

+0

謝謝Charles。但是我仍然不清楚如何將方法參數類型和值打包到paramObj中。 – user2003006

+0

@ user2003006我增加了一些細節,你需要編譯一個proto文件來創建你的類,或者創建一個實現Message接口的類。 –