如何使用 Hadoop 中的 HadoopRpcRequestProto 请求字段对方法参数进行编码

Posted

技术标签:

【中文标题】如何使用 Hadoop 中的 HadoopRpcRequestProto 请求字段对方法参数进行编码【英文标题】:How to encode method parameters using HadoopRpcRequestProto request field in Hadoop 【发布时间】:2013-01-23 08:00:01 【问题描述】:

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

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

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

所以如果我的“foo”方法有两个参数, foo(String name, 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 文件并在生成 Java 绑定之后使用 protoc 编译它,然后您可以在 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()) 传递它。

【讨论】:

谢谢查尔斯。但是我仍然不清楚如何将方法参数类型和值打包到 paramObj 中。 @user2003006 我添加了更多细节,您需要编译一个 proto 文件来创建您的类,或者自己创建一个实现 Message 接口的类。

以上是关于如何使用 Hadoop 中的 HadoopRpcRequestProto 请求字段对方法参数进行编码的主要内容,如果未能解决你的问题,请参考以下文章