gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:26:10 29 4
gpt4 key购买 nike

我有一个将 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com