背景:我正在将hbase上的mr工作从cdh2.0.0-cdh4.5.0(hadoop1)迁移到hdp2.2.0.0-2041(yarn)。在做了一些小的修改之后,代码是根据hdp2.2.0.0-2041编译的。
问题:我正在尝试运行一个oozie工作流,在hbase上创建扫描后执行一系列mr作业。扫描是以编程方式创建的,然后序列化反序列化,然后将其交给Map程序从hbase获取批处理。
问题:当tableinputformat在内部尝试反序列化扫描字符串时,它抛出一个错误,指出在后台googleprotobuf无法反序列化该字符串。堆栈跟踪如下所示。
线程“main”java.io.ioexception中出现异常:com.google.protobuf.invalidprotocolbufferexception:协议消息结束组标记与预期标记不匹配。在com.flipkart.yarn.test.testscanserialisedeserialise.convertstringtoscan(testscanserialisedeserialise。java:37)在com.flipkart.yarn.test.testscanserialisedeserialise.main(testscanserialisedeserialise。java:25)原因:。。。。。。
可复制的:我可以在粘贴的示例代码中复制这个
示例代码:
Scan scan1 = constructScanObjectForUsers("A");
String json = scan1.toJSON();
Scan scan2 = convertStringToScan(Base64.encodeBytes(json.getBytes()));
.......
private static Scan convertStringToScan(String base64) throws IOException {
byte[] decoded = Base64.decode(base64);
// System.out.println(new String(decoded));
ClientProtos.Scan scan;
try {
scan = ClientProtos.Scan.parseFrom(decoded);
} catch (InvalidProtocolBufferException ipbe) {
throw new IOException(ipbe);
}
return ProtobufUtil.toScan(scan);
}
可能的原因:我怀疑我没有提供某些依赖项,或者底层jar中存在某些依赖项不匹配。
谢谢你帮我解决这个问题?
1条答案
按热度按时间2fjabf4q1#
在这里,您似乎将消息编码为json。然后将base64应用于json文本。通常base64只适用于二进制,但是json是文本。
在这里,您正在对一些文本进行解基,然后将其解码为protobuf。这和上面的数据一样吗?因为如果是这样,这就行不通了:json和protobuf是不同的格式。如果你想解码为protobuf,你需要编码为protobuf,而不是json。