使用带蜂巢的大象鸟来读取 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 示例