将 protobuf 3 与 Hive 和 Elephant-Bird 一起使用

Posted

技术标签:

【中文标题】将 protobuf 3 与 Hive 和 Elephant-Bird 一起使用【英文标题】:Using protobuf 3 with Hive and Elephant-Bird 【发布时间】:2017-10-26 22:10:15 【问题描述】:

我有一个将 protobuf 写入 HDFS 的数据管道,现在我需要一种方法来查询该数据。我偶然发现了大象鸟和蜂巢,并且一直试图让这个解决方案运行一天。

以下是我采取的步骤:

1.) 已安装 Hadoop 2.7.3、Hive 2.1.1 和 Protobuf 3.0.0

2.) 克隆象鸟 4.16 并构建成功

3.) 启动 hive 并添加 core、hive 和 hadoop-compat jars

4.) 为 .proto 文件生成 java 类;使用 protobuf-java-3.0.0.jar 打包并添加到 hive

5.) 将 protobuf-java-3.0.0.jar 添加到 hive

完成所有这些后,我执行如下创建外部命令:

create external table tracks
    row format serde 
        "com.twitter.elephantbird.hive.serde.ProtobufDeserializer"
    with serdeproperties (
        "serialization.class"="protobuf.TracksProtos$Env")
    stored as
        inputformat "com.twitter.elephantbird.mapred.input.DeprecatedRawMultiInputFormat"
        OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
    LOCATION '/tracks/';

我在日志中收到这条消息:

2017-10-26T17:36:30,838 ERROR [main] util.Protobufs: Error invoking method getDescriptor in class class protobuf.TracksProtos$Env
java.lang.reflect.InvocationTargetException
.....
.....
.....
Caused by: java.lang.NoSuchMethodError: com.google.protobuf.Descriptors$Descriptor.getOneofs()Ljava/util/List;

我知道这不是真的,因为我可以列出 hive 中的 jars 并查看所有已安装的,当我展开它们时,我可以看到他们认为不存在的类。

如果我在 $HIVE_HOME/lib 下查看,我发现它正在使用 protobuf-java-2.5.0.jar。我想知道这是否是导致此错误的原因以及我的更正选项。

想法?

【问题讨论】:

【参考方案1】:

我能够通过下载 Hive 源代码并使用以下命令进行编译来解决此问题:

mvn -Dprotobuf.version=3.0.0 -Pdist clean package

这让我可以将 Hive 与 protobuf-3.0.0 一起使用。然后,我需要针对我新安装的 Hive 重新编译大象鸟。

【讨论】:

以上是关于将 protobuf 3 与 Hive 和 Elephant-Bird 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

无法在 AWS 中使用大象鸟和 Hive 反序列化 Protobuf (2.6.1) 数据

OpenCV 3.2 包括与 protobuf 3.1 冲突的 libmir* 和 protobuf 2.6

使用带蜂巢的大象鸟来读取 protobuf 数据

python 3.7使用protobuf-3.17.3版本

ProtoBuf试用与JSON的比较

序列化:ProtoBuf与JSON的比较