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

Posted

技术标签:

【中文标题】使用带蜂巢的大象鸟来读取 protobuf 数据【英文标题】:Use elephant-bird with hive to read protobuf data 【发布时间】:2015-01-06 04:07:49 【问题描述】:

我也有类似this one的问题

以下是我使用的:

    CDH4.4 (hive 0.10) protobuf-java-.2.4.1.jar elephant-bird-hive-4.6-SNAPSHOT.jar elephant-bird-core-4.6-SNAPSHOT.jar elephant-bird-hadoop-compat-4.6-SNAPSHOT.jar 包含 protoc 编译的 .class 文件的 jar 文件。

我流Protocol Buffer java tutorial创建我的数据“测试本”。

而我

使用hdfs dfs -mkdir /protobuf_data创建HDFS文件夹。

使用hdfs dfs -put testbook /protobuf_data 将“testbook”放入 HDFS。

然后我跟着elephant-bird web page建表,语法是这样的:

create table addressbook
  row format serde "com.twitter.elephantbird.hive.serde.ProtobufDeserializer"
  with serdeproperties (
    "serialization.class"="com.example.tutorial.AddressBookProtos$AddressBook")
  stored as
    inputformat "com.twitter.elephantbird.mapred.input.DeprecatedRawMultiInputFormat"
    OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
  LOCATION '/protobuf_data/';

一切正常。

但是当我提交查询select * from addressbook;时没有结果出来。

而且我找不到要调试的错误日志。

有人可以帮我吗?

非常感谢

【问题讨论】:

【参考方案1】:

问题已经解决了。

首先我将protobuf二进制数据直接放入HDFS,没有结果。

因为它不是那样工作的。

询问了一些资深同事后,他们说protobuf二进制数据应该写入某种容器,某种文件格式,如hadoop SequenceFile等。

elephant-bird页面也写了信息,但一开始我没完全看懂。

将protobuf二进制数据写入sequenceFile后,就可以用hive读取protobuf数据了。

而且因为我使用的是sequenceFile格式,所以我使用了create table语法:

inputformat 'org.apache.hadoop.mapred.SequenceFileInputFormat'
outputformat 'org.apache.hadoop.mapred.SequenceFileOutputFormat'

希望它也可以帮助其他刚接触 hadoop、hive、大象的人。

【讨论】:

哦,然后我又遇到了另一个问题。尽管“从 table_name 中选择 *”工作正常。但是选择列或选择(*)会导致一些错误消息,如“错误:java.lang.RuntimeException:org.apache.hadoop.hive.ql.metadata.HiveException:Hive Runtime Error while processing writable”当它开始运行地图时减少工作。补丁github.com/twitter/elephant-bird/pull/425之后。效果很好。

以上是关于使用带蜂巢的大象鸟来读取 protobuf 数据的主要内容,如果未能解决你的问题,请参考以下文章

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

从蜂巢桶读取记录的问题

用于从流中读取多个 protobuf 消息的 python 示例

如何使用 Python protobuf 读取二进制 C++ protobuf 数据?

聚合后用蜂巢表读取和写入

如何使用 QTcpSocket 获取 Protobuf 发送的数据 [重复]