2015-04-15 1 views
1

Я делал пример Hadoop (2.6.0) twitter Flume (1.5.2) и Hive (0.14.0). Я получил данные из твиттера успешно через Flume и сохранил их в своих собственных hdf.AvroRuntimeException возникает при выполнении некоторого hql в кусте

Но когда я хотел использовать куст для обработки этих данных, чтобы провести анализ (выберите только одно поле из таблицы), «Ошибка с исключением java.io.IOException: org.apache.avro.AvroRuntimeException: java .io.EOFException ", и небольшая полезная информация, которую я мог найти, связан с этим исключением.

Actuall Я могу получить большинство записей файла успешно (например, информация ниже, я набрал 5100 строк успешно), но это не получится в конце. В результате я не могу рассматривать все файлы твитов вместе.

Time taken: 1.512 seconds, Fetched: 5100 row(s) 
Failed with exception java.io.IOException:org.apache.avro.AvroRuntimeException: java.io.EOFException 
    15/04/15 19:59:18 [main]: ERROR CliDriver: Failed with exception java.io.IOException:org.apache.avro.AvroRuntimeException: java.io.EOFException 
    java.io.IOException: org.apache.avro.AvroRuntimeException: java.io.EOFException 
     at org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:663) 
     at org.apache.hadoop.hive.ql.exec.FetchOperator.pushRow(FetchOperator.java:561) 
     at org.apache.hadoop.hive.ql.exec.FetchTask.fetch(FetchTask.java:138) 
     at org.apache.hadoop.hive.ql.Driver.getResults(Driver.java:1621) 
     at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:267) 
     at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:199) 
     at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:410) 
     at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:783) 
     at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677) 
     at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 
    Caused by: org.apache.avro.AvroRuntimeException: java.io.EOFException 
     at org.apache.avro.file.DataFileStream.next(DataFileStream.java:222) 
     at org.apache.hadoop.hive.ql.io.avro.AvroGenericRecordReader.next(AvroGenericRecordReader.java:153) 
     at org.apache.hadoop.hive.ql.io.avro.AvroGenericRecordReader.next(AvroGenericRecordReader.java:52) 
     at org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:629) 
     ... 15 more 
    Caused by: java.io.EOFException 
     at org.apache.avro.io.BinaryDecoder.ensureBounds(BinaryDecoder.java:473) 
     at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:128) 
     at org.apache.avro.io.BinaryDecoder.readString(BinaryDecoder.java:259) 
     at org.apache.avro.io.ValidatingDecoder.readString(ValidatingDecoder.java:107) 
     at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:348) 
     at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:341) 
     at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:154) 
     at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:177) 
     at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:148) 
     at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:139) 
     at org.apache.avro.file.DataFileStream.next(DataFileStream.java:233) 
     at org.apache.avro.file.DataFileStream.next(DataFileStream.java:220) 
     ... 18 more 

Я использую ниже HQL создать таблицу

CREATE TABLE tweets 
    ROW FORMAT SERDE 
    'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
    STORED AS INPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
    OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
    TBLPROPERTIES ('avro.schema.url'='file:///home/hduser/hive-0.14.0-bin/tweetsdoc_new.avsc'); 

затем загрузить твиты файл из HDFS

LOAD DATA INPATH '/user/flume/tweets/FlumeData.1429098355304' OVERWRITE INTO TABLE tweets; 

Может кто-нибудь сказать мне возможную причину, или эффективный способ найти более подробная информация об исключении?

ответ

0

У меня была эта неприятная проблема.

Я посмотрел на полученный двоичный файл и отладил дескрипцию Avro битов.

Причиной этого EOFException было то, что Flume вставляет новый байт строки после каждого события (вы можете заметить 0x0A после каждой записи).

Avro deserializer считает, что файл еще не закончен и интерпретирует этот символ как некоторое количество блоков для чтения, но затем не может прочитать это количество блоков без удара EOF.

Смежные вопросы