Ich arbeite an einem Projekt, das Schlüssel / Wert-Informationen für einen Benutzer speichert, der HBase verwendet. Wir sind dabei, das von uns verwendete HBase-Schema zu überarbeiten. Die zwei Optionen, die diskutiert werden, sind:
Was sind die Design-Kompromisse der beiden Ansätze? Ist man dem anderen vorzuziehen? Gibt es irgendwelche Gründe, die Daten nicht mit Avro oder Thrift zu speichern?
Zusammenfassend kann ich sagen, dass ich verschiedene Spalten pro Taste verwenden möchte.
1) Offensichtlich erzwingen Sie, dass der Client Avro / Thrift verwendet, was eine weitere Abhängigkeit darstellt. Diese Abhängigkeit bedeutet, dass Sie die Möglichkeit bestimmter Tools, wie BI-Tools, die erwarten, dass Werte in den Daten ohne Umwandlung gefunden werden, entfernen können.
2) Unter dem avro / sparf-Schema sind Sie ziemlich gezwungen, den gesamten Wert über den Draht zu bringen. Abhängig davon, wie viele Daten hintereinander liegen, spielt dies keine Rolle. Aber wenn Sie nur an "Stadt" -Feldern / Spalten-Qualifier interessiert sind, müssen Sie immer noch "Zahlungen", "Kreditkarteninformationen" usw. erhalten. Dies kann auch ein Sicherheitsproblem darstellen.
3) Updates, falls erforderlich, werden mit Avro / Thrift schwieriger. Beispiel: Sie entscheiden sich für einen 'hasIphone6' Schlüssel. Avro / Thrift: Sie werden gezwungen, die Zeile zu löschen und eine neue mit dem hinzugefügten Feld zu erstellen. Unter dem Spaltenschema wird ein neuer Eintrag mit nur der neuen Spalte angehängt. Für eine einzelne Zeile, nicht groß, aber wenn Sie dies zu einer Milliarde Zeilen machen, muss es eine große Verdichtungsoperation geben.
4) Wenn konfiguriert, können Sie die Komprimierung in HBase verwenden, die die avro / thrift Serialisierung überschreiten kann, da sie über eine Spaltenfamilie statt nur für den einzelnen Datensatz komprimieren kann.
5) BigTable-Implementierungen wie HBase funktionieren sehr gut mit sehr breiten, spärlichen Tabellen, so dass es nicht zu Leistungseinbußen kommen wird, wie Sie es vielleicht erwarten.
Die richtige Antwort ist etwas komplizierter, also gebe ich dir zuerst den tl; dr.
Verwenden Sie Avro / Thrift / Protobuf
Sie müssen ein Gleichgewicht zwischen der Anzahl der zu puffernden Felder und Spalten herstellen.
Normalerweise möchten Sie Felder ("Schlüssel" in Ihrer ursprünglichen Frage), auf die häufig zugegriffen wird, in eine Art Avro-Datensatz einfügen, weil Sie, wie von cmonkey erwähnt, keine zusätzlichen Daten abrufen wollen. t verwenden.
Wenn Sie Ihre Zeile sehr weit ausdehnen, erhöhen Sie die Suchzeiten beim Abrufen einer Teilmenge von Spalten, weil HFiles gespeichert werden. Um festzustellen, was optimal ist, kommt es wieder auf Ihre Zugriffsmuster an.
Ich möchte auch darauf hinweisen, dass Sie sich durch die Verwendung von Avro auch mit Evolvabilität ausstatten. Sie müssen die Zeile nicht löschen und sie erneut mit dem Datensatz hinzufügen, der ein neues Feld enthält. Avro hat Regeln für Abwärtskompatibilität und Vorwärtskompatibilität. Dies macht Ihr Leben tatsächlich viel einfacher, weil Sie sowohl neue als auch alte Datensätze lesen können, ohne Ihre Daten neu zu schreiben oder Aktualisierungen für älteren Client-Code zu erzwingen.
Sie sollten fast immer Kompression in HBase verwenden (SNAPPY ist immer eine gute Wahl).