2015-12-10 39 views
7

Non è possibile leggere e analizzare il file creato dallo streaming dei dati di Twitter tramite l'agente Flume di Twitter, né utilizzando Java né Avro Tools. Il mio requisito è quello di convertire il formato avro in formato JSON.File di testo Avro generato da Flume L'agente Twitter non viene letto in Java

Quando si utilizza uno di metodo, ottengo l'eccezione: org.apache.avro.AvroRuntimeException: java.io.IOException: Block size invalid or too large for this implementation: -40

sto utilizzando Hadoop vaniglia config nella nodo di cluster pseudo e la versione 2.7.1 Hadoop è

versione Flume è 1.6.0

il file di configurazione per l'agente flume twitter e il codice Java per analizzare il file avro è attaccato sotto:

TwitterAgent.sources=Twitter 
TwitterAgent.channels=MemChannel 
TwitterAgent.sinks=HDFS 
TwitterAgent.sources.Twitter.type=org.apache.flume.source.twitter.TwitterSource 
TwitterAgent.sources.Twitter.channels=MemChannel 

TwitterAgent.sources.Twitter.consumerKey=xxxxxxxxxxxxxx 
TwitterAgent.sources.Twitter.consumerSecret=xxxxxxxxxxxxxxxx 
TwitterAgent.sources.Twitter.accessToken=xxxxxxxxxxxxxxxx 
TwitterAgent.sources.Twitter.accessTokenSecret=xxxxxxxxxxxxxx 

TwitterAgent.sources.Twitter.keywords=Modi,PMO,Narendra Modi,BJP 

TwitterAgent.sinks.HDFS.channel=MemChannel 
TwitterAgent.sinks.HDFS.type=hdfs 
TwitterAgent.sinks.HDFS.hdfs.path=hdfs://localhost:9000/user/ashish/Twitter_Data 
TwitterAgent.sinks.HDFS.hdfs.fileType=DataStream 
TwitterAgent.sinks.HDFS.hdfs.writeformat=Text 
TwitterAgent.sinks.HDFS.hdfs.batchSize=100 
TwitterAgent.sinks.HDFS.hdfs.rollSize=0 
TwitterAgent.sinks.HDFS.hdfs.rollCount=10 
TwitterAgent.sinks.HDFS.hdfs.rollInterval=30 
TwitterAgent.channels.MemChannel.type=memory 
TwitterAgent.channels.MemChannel.capacity=10000 
TwitterAgent.channels.MemChannel.transactionCapacity=100 

import org.apache.avro.file.DataFileReader; 
import org.apache.avro.file.FileReader; 
import org.apache.avro.file.SeekableInput; 
import org.apache.avro.generic.GenericDatumReader; 
import org.apache.avro.generic.GenericRecord; 
import org.apache.avro.io.DatumReader; 
import org.apache.avro.mapred.FsInput; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 

import java.io.IOException; 

public class AvroReader { 

    public static void main(String[] args) throws IOException { 
     Path path = new Path("hdfs://localhost:9000/user/ashish/Twitter_Data/FlumeData.1449656815028"); 
     Configuration config = new Configuration(); 
     SeekableInput input = new FsInput(path, config); 
     DatumReader<GenericRecord> reader = new GenericDatumReader<>(); 
     FileReader<GenericRecord> fileReader = DataFileReader.openReader(input, reader); 

     for (GenericRecord datum : fileReader) { 
      System.out.println("value = " + datum); 
     } 

     fileReader.close(); 
    } 
} 

Eccezione stack trace che ho ottenuto è:

2015-12-09 17:48:19,291 WARN [main] util.NativeCodeLoader (NativeCodeLoader.java:<clinit>(62)) - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
    value = {"id": "674535686809120768", "user_friends_count": 1260, "user_location": "ユウサリ", "user_description": "「テガミバチ」に登場するザジのbotです。追加してほしい言葉などの希望があればDMでお願いします。リムーブする際はブロックでお願いします。", "user_statuses_count": 47762, "user_followers_count": 1153, "user_name": "ザジ", "user_screen_name": "zazie_bot", "created_at": "2015-12-09T15:56:54Z", "text": "@ill_akane_bot お前、なんか、\u2026すっげー楽しそうだな\u2026", "retweet_count": 0, "retweeted": false, "in_reply_to_user_id": 204695477, "source": "<a href=\"http:\/\/twittbot.net\/\" rel=\"nofollow\">twittbot.net<\/a>", "in_reply_to_status_id": 674535430423887872, "media_url_https": null, "expanded_url": null} 
    Exception in thread "main" org.apache.avro.AvroRuntimeException: java.io.IOException: Block size invalid or too large for this implementation: -40 
     at org.apache.avro.file.DataFileStream.hasNextBlock(DataFileStream.java:275) 
     at org.apache.avro.file.DataFileStream.hasNext(DataFileStream.java:197) 
     at avro.AvroReader.main(AvroReader.java:24) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
    Caused by: java.io.IOException: Block size invalid or too large for this implementation: -40 
     at org.apache.avro.file.DataFileStream.hasNextBlock(DataFileStream.java:266) 
     ... 7 more 

Inoltre devo dare lo schema Avro per il file Avro da leggere in modo corretto, in caso affermativo dove?

+0

Hai dimenticato di aggiungere il file di output memorizzato in HDFS: http://www.megafileupload.com/mq7i/FlumeData.1449730709818 – Ashu

risposta

0

Ho anche incontrato questo problema. Anche se posso vedere il tuo file di dati che non esiste più. Ho controllato questo file di dati che dovrebbe essere lo stesso con il tuo.

Ho trovato il mio file di dati era già un file contenitore avro che significa che ha il suo schema e dati.

Il file avro che ho ottenuto era molto sbagliato perché dovrebbe includere solo una testa che contiene schema avro, ma in realtà ha più testine nel suo file.

Un'altra cosa è che i tweet sono già in formato JSON, perché il flume li converte in formato avro?