2016-05-02 8 views
0

Das Anhängen an SequenceFiles scheint sehr langsam zu sein. Wir konvertieren Ordner (mit kleinen Dateien) in SequenceFiles, indem wir den Dateinamen als Schlüssel und den Inhalt als Wert verwenden. Der Durchsatz ist jedoch ziemlich niedrig mit ungefähr 2 MB/s (ungefähr 2 bis 3 Dateien pro Sekunde). Wir haben Mio. von kleinen Dateien und maximal 3 Dateien pro Sekunde ist unglaublich langsam für unsere Zwecke.HDFS Append an SequenceFile ist langsam

Was wir tun, ist ein einfaches:

for(String file : files) { 
    byte[] data = Files.readAllBytes(Paths.get(dir.getAbsolutePath() 
        + File.separatorChar + file)); 
    byte[] keyBytes = l.getBytes("UTF-8"); 
    BytesWritable key = new BytesWritable(keyBytes); 
    BytesWritable val = new BytesWritable(data); 

    seqWriter.append(key, val); 
} 

Irgendwelche Hinweise, Ideen, wie die Dinge zu beschleunigen?

Antwort

0

Die meiste Zeit ist der Übeltäter komprimiert (z. B. gzip ohne native lib-Unterstützung). Sie haben nicht erwähnt, wie Sie die seqWriter einrichten, also ist dies nur eine Vermutung.

Eine andere Sache zu beschleunigen wäre, die Dateien in Stapeln oder asynchron und parallel vorab zu holen, da die Latenz beim Herunterladen kleiner Dateien der Flaschenhals und nicht die eigentlichen Append-Operationen sein könnten.

Wenn Append der Flaschenhals ist, können Sie auch die Puffergröße erhöhen. Entweder konfigurieren Sie io.file.buffer.size (Standard 4k) oder übergeben Sie es in den Writer Builder mit der Option BufferSizeOption.

+0

Die Dateien oder lokal verfügbar auf dem Computer, der das HDFS ausführt. Wir verwenden die Komprimierung, also versuche ich, sie zu deaktivieren und mache einige Benchmarks ohne sie. – mroman

+0

Nein, Komprimierung scheint nicht der eigentliche Engpass zu sein. – mroman

+0

@mroman dann gehen und einen Profiler greifen und herausfinden, was so lange dauert;) –