1

我正在尝试使用大象鸟来查询一些示例 protobuf 数据。我使用的是AddressBook示例,我将一些假的AddressBooks序列化为文件并将它们放在/user/foo/data/elephant-bird/addressbooks/下的hdfs中查询没有返回结果

我像这样设置表和查询:

添加 jar /home/foo/downloads/elephant-bird/hadoop-compat/target/elephant-bird-hadoop-compat-4.6-SNAPSHOT.jar;
添加 jar /home/foo/downloads/elephant-bird/core/target/elephant-bird-core-4.6-SNAPSHOT.jar;
添加 jar /home/foo/downloads/elephant-bird/hive/target/elephant-bird-hive-4.6-SNAPSHOT.jar;

创建外部表地址
行格式 serde "com.twitter.elephantbird.hive.serde.ProtobufDeserializer"
带有 serde 属性(
"serialization.class"="com.twitter.data.proto.tutorial.AddressBookProtos$AddressBook")
存储为
-- 大象鸟提供了一种与 hive 一起使用的输入格式
输入格式“com.twitter.elephantbird.mapred.input.DeprecatedRawMultiInputFormat”
-- 占位符,因为我们不会写入此表
输出格式“org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat”
LOCATION '/user/foo/data/elephant-bird/addressbooks/';


描述格式化的地址;

好的
# col_name data_type 注释

来自反序列化器的人员数组{ struct{ name:string, id:int, email:string, phone:array {struct {number:string, type:string}}}}
来自反序列化器的 byteData 二进制文件

# 详细的表信息
数据库:默认
拥有者:傅
创建时间:2014 年 10 月 28 日星期二 13:49:53 PDT
上次访问时间:未知
保护模式:无
留存:0
位置:hdfs://foo:8020/user/foo/data/elephant-bird/addressbooks
表类型:EXTERNAL_TABLE
表参数:
        外部真实
        瞬态_lastDdlTime 1414529393

# 存储信息
SerDe 库:com.twitter.elephantbird.hive.serde.ProtobufDeserializer
输入格式:com.twitter.elephantbird.mapred.input.DeprecatedRawMultiInputFormat
输出格式:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
压缩:否
桶数:-1
桶列:[]
排序列:[]
存储描述参数:
        serialization.class com.twitter.data.proto.tutorial.AddressBookProtos$AddressBook
        序列化.格式1
耗时:0.421 秒,获取:29 行

当我尝试选择数据时,它没有返回任何结果(似乎没有读取行):

从地址中选择计数(*);

MapReduce 作业总数 = 1
启动作业 1 / 1
编译时确定的reduce任务数:1
为了改变reducer的平均负载(以字节为单位):
  设置 hive.exec.reducers.bytes.per.reducer=
为了限制reducer的最大数量:
  设置 hive.exec.reducers.max=
为了设置一个恒定数量的减速器:
  设置 mapred.reduce.tasks=
开始工作 = job_1413311929339_0061,跟踪 URL = http://foo:8088/proxy/application_1413311929339_0061/
杀死命令 = /usr/lib/hadoop/bin/hadoop 作业 -kill job_1413311929339_0061
Stage-1 的 Hadoop 作业信息:映射器数量:0;减速机数量:1
2014-10-28 13:50:37,674 第一阶段地图 = 0%,减少 = 0%
2014-10-28 13:50:51,055 第一阶段地图 = 0%,减少 = 100%,累积 CPU 2.14 秒
2014-10-28 13:50:52,152 第 1 阶段地图 = 0%,减少 = 100%,累积 CPU 2.14 秒
MapReduce 总累积 CPU 时间:2 秒 140 毫秒
结束工作 = job_1413311929339_0061
MapReduce 职位发布:
作业 0:减少:1 累积 CPU:2.14 秒 HDFS 读取:0 HDFS 写入:2 成功
MapReduce CPU 总时间花费:2 秒 140 毫秒
好的
0
耗时:37.519 秒,获取时间:1 行

如果我创建一个非外部表或将数据显式导入外部表,我会看到同样的情况。

我的设置的版本信息:

节俭 0.7
protobuf:libprotoc 2.5.0
Hadoop:
Hadoop 2.5.0-cdh5.2.0
颠覆 http://github.com/cloudera/hadoop -r e1f20a08bde76a33b79df026d00a0c91b2298387
詹金斯于 2014-10-11T21:00Z 编译
使用 protoc 2.5.0 编译
来自带有校验和 309bccd135b199bdfdd6df5f3f4153d 的源

更新:

我在日志中看到了这个错误。我在 HDFS 中的数据只是原始 protobuf(无压缩)。我想弄清楚这是否是问题所在,以及我是否可以读取原始二进制 protobuf。

    错误:java.io.IOException:java.lang.reflect.InvocationTargetException
    在 org.apache.hadoop.hive.io.HiveIOExceptionHandlerChain.handleRecordReaderCreationException(HiveIOExceptionHandlerChain.java:97)
    在 org.apache.hadoop.hive.io.HiveIOExceptionHandlerUtil.handleRecordReaderCreationException(HiveIOExceptionHandlerUtil.java:57)
    在 org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.initNextRecordReader(HadoopShimsSecure.java:346)
    在 org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.(HadoopShimsSecure.java:293)
    在 org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileInputFormatShim.getRecordReader(HadoopShimsSecure.java:407)
    在 org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getRecordReader(CombineHiveInputFormat.java:560)
    在 org.apache.hadoop.mapred.MapTask$TrackedRecordReader.(MapTask.java:168)
    在 org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:409)
    在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:342)
    在 org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 javax.security.auth.Subject.doAs(Subject.java:415)
    在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1554)
    在 org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
    引起:java.lang.reflect.InvocationTargetException
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    在 java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    在 org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.initNextRecordReader(HadoopShimsSecure.java:332)
    ... 11 更多
    原因:java.io.IOException:找不到文件 hdfs://foo:8020/user/foo/data/elephantbird/addressbooks/1000AddressBooks-1684394246.bin 的编解码器
    在 com.twitter.elephantbird.mapreduce.input.MultiInputFormat.determineFileFormat(MultiInputFormat.java:176)
    在 com.twitter.elephantbird.mapreduce.input.MultiInputFormat.createRecordReader(MultiInputFormat.java:88)
    在 com.twitter.elephantbird.mapreduce.input.RawMultiInputFormat.createRecordReader(RawMultiInputFormat.java:36)
    在 com.twitter.elephantbird.mapred.input.DeprecatedInputFormatWrapper$RecordReaderWrapper.(DeprecatedInputFormatWrapper.java:256)
    在 com.twitter.elephantbird.mapred.input.DeprecatedInputFormatWrapper.getRecordReader(DeprecatedInputFormatWrapper.java:121)
    在 com.twitter.elephantbird.mapred.input.DeprecatedFileInputFormatWrapper.getRecordReader(DeprecatedFileInputFormatWrapper.java:55)
    在 org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.(CombineHiveRecordReader.java:65)
    ... 16 更多

4

1 回答 1

0

你解决了这个问题吗?

我遇到了和你描述的一样的问题。

是的,你是对的,我发现无法直接读取原始二进制 protobuf。

这是我问的问题。 使用带蜂巢的大象鸟来读取 protobuf 数据

希望能帮助到你

此致

于 2015-01-11T15:03:47.767 回答