2016-10-22 2 views
1

Wir verbrauchen sehr große Datenmengen, die so schnell wie möglich geschrieben werden müssen, und wir verwenden HDFS, daher bevorzugen wir es, es zu verwenden. Die Daten sind fast unstrukturiert, und wir werden selten grundlegende Abfragen an ihnen vornehmen. Die Daten sind flach mit einigen Feldern, wobei jede Zeile andere Daten darstellt.Datenspeicherformat für unstrukturierte Datenzeilen auf HDFS

key1=str key2=30.3 key3=longtexthere 

Eine weitere Datenreihe:

key1=3 key5=abc 

SequenceFile schien die natürlichste, aber ich konnte nicht finden, wie in einem einzigen SequenceFile mehr Zeilen zu speichern.

Gegenwärtig haben wir in unserer temporären Lösung mehrere Writer, die in mehrere Textdateien schreiben. Wenn also Abfragen benötigt werden, lesen wir sie parallel. Die aktuellen Textdateien enthalten jedoch 1000 Zeilen, und ich denke nicht, dass das Erstellen einer einzelnen SequenceFile für jede Zeile machbar wäre. Es würde viel Aufwand für das Speichern von Metadaten und das Lesen von viel zu vielen Dateien auf einmal verursachen.

Ich denke, das Problem kann mit HBase oder Cassandra, einer Kolumunar-Datenbank gelöst werden, aber wir müssen fast HDFS verwenden. Fehle ich etwas mit SequenceFiles oder sollten wir wirklich eine Columunar-Datenbank verwenden?

+0

Haben Sie eine feste Anzahl von Schlüsseln/Spalten? – oae

+0

@oae Nein, obwohl sie nicht behoben sind, werden sie selten erweitert, dh manchmal fügen wir neue Spalten hinzu, aber die alten Daten haben sie nicht. – Mustafa

Antwort

1

So Sequenz Dateiformat ist wie folgt: <key, value> <key, value> <key, value> ... wo der Schlüssel ist ein WritableComparable und der Wert ist ein Writable. Nun, was viele Menschen tun - und Sie könnten das gleiche tun - ist:

  • Nur den Schlüssel verwenden oder den Wert ‚Spalte‘
  • eine benutzerdefinierte Beschreibbare implementieren, die eine Reihe von anderen Writables Wraps (Nennen Sie es Datensatz, Zeile, ...)

So können Sie alles modellieren, was Sie wollen. Diese beschreibbare Aufzeichnung kann ein festes Schema haben, so wie sie 'IntWritable, Text, IntWritable, IntWritable' enthält (abhängig von Ihren Feldern). Oder falls Sie keine anderen Typen unterstützen möchten, können Sie die vorhandene ArrayWritable als Ihre 'Aufzeichnung' verwenden. Wissen das Schema jeder Datei (zB in die Metadaten der Sequenzdatei einfügen, können Sie lesen auf Dateien mit verschiedenen/evolvierten Schemas.

So ist es eine Menge Handarbeit, aber bauen kann sehr effizient und flexible Struktur.Niemals verwendet, aber betrachten Sie http://pangool.net/userguide/schemas.html, denken Sie, dass sie bereits ein flexibles Record/Tuple-Schema oben auf Sequenzdateien modelliert

Bottom Line, ich denke, Sie können erreichen, was Sie mit Sequenzdateien wollen. Allerdings würde ich empfehlen, auch spaltenförmige Dateiformate wie Parquet oder ORC files zu betrachten.Diese kommen mit ihren eigenen Kompromissen, aber Sie werden eine höhere Kompressionsrate und sel haben ective liest (Spaltenprojektion, Filter Pushdown). Außerdem müssen Sie die Schema/Tupel-Struktur nicht erfinden.