如何使用 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 请求字段对方法参数进行编码
我如何使用Python API Pydoop得到Hadoop集群中的实际数据(地图后减少)?