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