hbase问题|反序列化扫描字符串时出现google protobuf标记不匹配错误

btqmn9zl  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(363)

背景:我正在将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中存在某些依赖项不匹配。
谢谢你帮我解决这个问题?

2fjabf4q

2fjabf4q1#

Scan scan1 = constructScanObjectForUsers("A");
String json = scan1.toJSON();
Scan scan2 = convertStringToScan(Base64.encodeBytes(json.getBytes()));

在这里,您似乎将消息编码为json。然后将base64应用于json文本。通常base64只适用于二进制,但是json是文本。

byte[] decoded = Base64.decode(base64);
// System.out.println(new String(decoded));
ClientProtos.Scan scan;
try {
    scan = ClientProtos.Scan.parseFrom(decoded);

在这里,您正在对一些文本进行解基,然后将其解码为protobuf。这和上面的数据一样吗?因为如果是这样,这就行不通了:json和protobuf是不同的格式。如果你想解码为protobuf,你需要编码为protobuf,而不是json。

相关问题