0

Hadoop RPC 引擎使用协议缓冲区来编码/解码来自线路的字节。

我正在尝试使用 HadoopRpcRequestProto 在 Hadoop 服务器上调用一个方法

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

所以如果我的“foo”方法有两个参数,foo(String name, int num);

如何对参数进行编码并将它们设置为 HadoopRpcRequestProto 的请求字段?

TIA

4

1 回答 1

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 文件并使用protocafter 编译它以生成 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()).

于 2013-01-23T19:10:55.813 回答