使用protobuf 3与Hive和Elephant-Bird

时间:2017-10-26 22:10:16

标签: java hadoop hive elephantbird

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

以下是我采取的步骤:

1。)安装了Hadoop 2.7.3,Hive 2.1.1和Protobuf 3.0.0

2。)Cloned Elephant-Bird 4.16并且建成成功

3。)启动配置单元并添加核心,配置单元和hadoop-compat jar

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

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

在完成所有这些后,我按如下方式执行create external命令:

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的jar并看到所有的都已安装,当我展开它时,我可以看到他们认为不存在的类。

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

想法?

1 个答案:

答案 0 :(得分:1)

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

mvn -Dprotobuf.version=3.0.0 -Pdist clean package

这允许我使用带有protobuf-3.0.0的Hive。然后,我需要在我的新安装的Hive上重新编译大象鸟。