我正在尝试使用大象鸟来查询一些示例 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 更多