如何使用 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 请求字段对方法参数进行编码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hadoop 中的机器之间传输文件并使用 Pig 搜索字符串

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

给定 Hadoop 中的阈值,如何使用 PIG 进行连接

我如何使用Python API Pydoop得到Hadoop集群中的实际数据(地图后减少)?

如何在Windows中使用Eclipse访问虚拟机Linux系统中的hadoop

master节点如何启动hadoop集群中的所有进程?