java - 将 protobuf 3 与 Hive 和 Elephant-Bird 结合使用

标签 java hadoop hive elephantbird

我有一个将 protobuf 写入 HDFS 的数据管道,现在我需要一种查询该数据的方法。我偶然发现了 elephant-bird 和 hive,并且一直在尝试让这个解决方案运行一天。

以下是我采取的步骤:

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

2.) 克隆Elephant-Bird 4.16并构建成功

3.) 启动 hive 并添加核心、hive 和 hadoop-compat jar

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

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

想法?

最佳答案

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

mvn -Dprotobuf.version=3.0.0 -Pdist clean package

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

关于java - 将 protobuf 3 与 Hive 和 Elephant-Bird 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46964613/

相关文章:

Java 连接问题

java - 无法在 IntelliJ Idea 2016.1.1 中导入 maven 项目

java - JMS 队列的最大数量

hadoop - 通过 Chef 在ec2中设置ssh无密码

java - 运行hdoop程序,hbase卡在htable声明中

java - 新的 Mac App Store 会接受 java 应用程序吗?

hadoop - ORC文件转储中的 strip 大小是否以压缩大小格式表示?

hive - 无法删除包含特殊字符等号(=)的hive表分区

date - 如何获取一个日期格式:YYYYMMDD之前20天

hadoop - 有没有办法为预期的输出编写配置单元脚本