2014-07-18 2 views
20

Ho un lavoro Map-Reduce con un mapper che prende un record e lo converte in un oggetto, un'istanza di MyObject, che è inviato a JSON usando Jackson. Il valore è solo un altro campo di testo nel record.Strange Jackson Carattere non valido ((CTRL-CHAR, codice 0)) Eccezione in Map Reduce Combiner

Il pezzo rilevante del mappatore è simile al seguente:

ObjectMapper mapper = new ObjectMapper(); 
MyObject val = new MyObject(); 
val.setA(stringA); 
val.setB(stringB); 
Writer strWriter = new StringWriter(); 
mapper.writeValue(strWriter, val); 
key.set(strWriter.toString()); 

Le uscite del mappatore vengono inviati ad un combinatore che unmarshalls l'oggetto JSON e aggrega coppie di valori-chiave. E 'concettualmente molto semplice ed è qualcosa di simile:

classe
public void reduce(Text key, Iterable<IntWritable> values, Context cxt) 
    throws IOException, InterruptedException { 
    int count = 0; 
    TermIndex x = _mapper.readValue(key.toString(), MyObject.class); 
    for (IntWritable int : values) ++count; 
    ... 
    emit (key, value) 
} 

La MyObject è costituito da due campi (entrambe le stringhe), ricevere/metodi set e un costruttore di default. Uno dei campi memorizza frammenti di testo basati su una scansione Web, ma è sempre una stringa.

public class MyObject { 
    private String A; 
    private String B; 

    public MyObject() {} 

    public String getA() { 
    return A; 
    } 
    public void setA(String A) { 
    this.A = A; 
    } 
    public String getB() { 
    return B; 
    } 
    public void setIdx(String B) { 
    this.B = B; 
    } 
} 

Il mio lavoro MapReduce sembra funzionare benissimo fino a raggiungere alcuni record, che non posso facilmente accesso (perché il mapper sta generando i record da un crawl), e viene gettata la seguente eccezione:

Error: com.fasterxml.jackson.core.JsonParseException: 

    Illegal character ((CTRL-CHAR, code 0)): only regular white space (\r, \n, \t) is allowed between tokens 
    at [Source: [email protected]; line: 1, column: 3] 

Qualcuno avrebbe qualche suggerimento sulla causa di questo?

+0

Usa okhttp 1.5.1. Spero che risolva il tuo problema. – SkyWalker

+1

Mi rendo conto che hai detto che non hai un accesso facile ma ti suggerisco di terminare la ricerca per indicizzazione e rimuovere i caratteri di controllo spuri come 0 (NULL) dallo stream e poi passarlo a Jackson. Ho visto feed finanziari per vari titoli avere dati spuri come questo che devono sempre essere abbattuti. Molto probabilmente è un difetto sul lato mittente. – sagneta

+0

A livello basso qualcosa sta iniettando byte null (byte 0) nello stream e il parser non li accetta (non sono validi per JSON). Devi capire come e perché questo accade; potrebbe essere molte cose tra cui problemi di concorrenza o tempistiche (cercando di analizzare il contenuto prima che venga caricato nel buffer). – StaxMan

risposta