2016-11-10 4 views
0

Ich möchte eine große Menge von rohen Ereignisdaten speichern und abfragen. Die Architektur, die ich verwenden möchte, ist die "Data Lake" -Architektur, in der S3 die eigentlichen Ereignisdaten enthält, und DynamoDB wird verwendet, um sie zu indexieren und Metadaten bereitzustellen. Dies ist eine Architektur, die an vielen Orten über und empfohlen gesprochen wird:Ist DynamoDB als S3-Metadaten-Index geeignet?

Allerdings bin ich kämpfen, um zu verstehen, wie DynamoDB für die Zwecke zu verwenden, von Abfragen der Ereignisdaten in S3. In der Verbindung zu dem AWS Blog oben, verwenden sie das Beispiel von mehreren verschiedenen Servern hergestellt Kundenveranstaltungen zu speichern:

S3 Pfadformat: [4-digit hash]/[server id]/[year]-[month]-[day]-[hour]-[minute]/[customer id]-[epoch timestamp].data

ZB: a5b2/i-31cc02/2015-07-05-00-25/87423-1436055953839.data

Und das Schema dieses Ereignis aufzuzeichnen in DynamoDB wie folgt aussieht:

Customer ID (Partition Key), Timestamp-Server (Sort Key), S3-Key, Size 
87423, 1436055953839-i-31cc02, a5b2/i-31cc02/2015-07-05-00-25/87423-1436055953839.data, 1234 

würde ich mag eine Abfrage wie ausführen: „Geben sie mir alle Kundenveranstaltungen von allen Servern in den letzten 24 Stunden produziert“, aber soweit ich es verstehe, ist es imp Es ist möglich, DynamoDB ohne Verwendung des Partitionsschlüssels effizient abzufragen. Ich kann den Partitionsschlüssel für diese Art von Abfrage nicht angeben.

Angesichts dieser Anforderung, sollte ich eine andere Datenbank als DynamoDB verwenden, um aufzuzeichnen, wo meine Ereignisse in S3 sind? Oder muss ich einfach ein anderes DynamoDB-Schema verwenden?

+0

Die Architektur sieht gut aus.Sie können jedoch nicht die DynamoDB-Datenbank ohne Partitionsschlüssel abfragen.Sie müssen die gesamte DynamoDB scannen, wenn Partitionsschlüssel nicht verfügbar ist.Die Alternative wäre die Global Secondary zu erstellen Index auf dem Datum/Uhrzeit-Feld – notionquest

+0

@notionquest thanks.Could Sie erweitern, was Sie mit Global Secondary Index meinen und wie es hier helfen würde? –

+0

wie a Verwenden Sie elasticsearch um das Metadat zu indizieren? Sehen Sie sich den folgenden Link an: https://aws.amazon.com/blogs/database/indexing-metadata-en-index/index.html (http://aws.amazon.com/blogs/database/indexing-metadata-) [indexing-metadata-in-amazon-elasticsearch-service-using-aws-lambda-and-python] in-amazon-elasticsearch-service-using-aws-lambda-and-python /) – Payman

Antwort

1

Die Architektur sieht mit DynamoDB-Datenbank gut und machbar aus. Die Klasse DynamoDBMapper (in AWS SDK Java vorhanden) kann zum Erstellen des Modells verwendet werden, das über nützliche Methoden zum Abrufen der Daten von S3 verfügt.

DynamoDBMapper

getS3ClientCache() Gibt den zugrunde liegenden S3ClientCache S3 für den Zugriff.

DynamoDB-Datenbank kann nicht ohne Partitionsschlüssel abgefragt werden. Sie müssen die gesamte DynamoDB-Datenbank durchsuchen, wenn der Partitionsschlüssel nicht verfügbar ist. Sie können jedoch ein Global Secondary Index (GSI) für Datum/Uhrzeit erstellen und die Daten für Ihren Anwendungsfall abfragen.

In einfachen Worten ähnelt GSI dem Index in jedem RDBMS. Der Unterschied besteht darin, dass Sie direkt die GSI und nicht die Haupttabelle abfragen können. Normalerweise ist GSI erforderlich, wenn Sie die DynamoDB für einige Anwendungsfälle abfragen möchten, wenn der Partitionsschlüssel nicht verfügbar ist. Es gibt Optionen, um ALL (oder) selektive Felder in der Haupttabelle in GSI enthalten.

Global Secondary Index (GSI)

Difference between Scan and Query in DynamoDB

Ja, in diesem Anwendungsfall, sieht aus wie GSI als Anwendungsfall nicht benötigt eine RANGE Abfrage auf Partitionsschlüssel helfen kann. Die DynamoDB unterstützt nur Gleichheitsoperatoren. DynamoDB unterstützt Bereichsabfragen für Sortierschlüssel oder andere Nicht-Schlüsselattribute, wenn der Partitionsschlüssel verfügbar ist. Möglicherweise müssen Sie die DynamoDB scannen, um diesen Anwendungsfall zu erfüllen, der kostspielig ist.

Entweder Sie haben über alternatives Datenmodell nachgedacht, wo Sie nach Partitionsschlüssel abfragen oder eine andere Datenbank verwenden können.

+0

Die GSI-Dokumente sagen: "Jeder globale sekundäre Index muss einen Partitionsschlüssel haben, und kann einen optionalen Sortierschlüssel haben." Ich denke, dies bedeutet, dass es das Problem des effizienten Abrufens von Datensätzen über einen Zeitbereich nicht lösen wird. –

+0

Im obigen Anwendungsfall sollte Timestamp-Server der Partitionsschlüssel von GSI sein. – notionquest

+0

Wenn ich den Zeitstempel als Partitionsschlüssel verwende, muss ich auch einen Wert angeben, wenn ich den Index abfrage. Nochmals aus der Dokumentation: "Sie müssen den Indexnamen, die Abfragekriterien für den Indexpartitionsschlüssel und den Sortierschlüssel (falls vorhanden) angeben." Bedeutet das wiederum, dass ich keine effizienten Bereichsabfragen durchführen kann? –

1

Erstens, ich habe gelesen, dass gleiche AWS Blog-Seite zu: https://aws.amazon.com/blogs/big-data/building-and-maintaining-an-amazon-s3-metadata-index-without-servers/

Die einzige Möglichkeit, diese Arbeit mit DynamoDB machen kann, ist:

  • ein weiteres Attribut hinzufügen namens „foo“ und setzen gleiche Wert 1 für alle Artikel
  • fügen Sie ein weiteres Attribut „Zeitstempel“ und setzte Unix-Zeitstempel gab
  • erstellen GSI mit Partition Schlüsseln „foo“ und Bereichsschlüssel „Zeitstempel“ genannt, und Projekt all andere Attribute

Sieht ein bisschen schmutzig aus, nicht wahr? Dann können Sie die Elemente der letzten 24 Stunden mit dem Partitionsschlüssel 1 abfragen (alle Objekte haben 1) und diesen Zeitstempel-Bereichsschlüssel verwenden. Nun, die Probleme:

  1. GSI mit allen Elementen mit gleichen Partition Schlüssel? Die Leistung wird saugen, wenn Daten gorws große
  2. Kosten mehr mit einem GSI

Sie über die Kosten als auch denken sollte. Denken Sie über Ihre Datenaufnahmequote nach. Wenn Sie 1000 Objekte pro Sekunde in einen Bucket legen, kostet das ungefähr 600 US-Dollar pro Monat und 600 US-Dollar mehr bei GSI. Nur wegen dieser Abfrage benötigen (letzte 24 Stunden), müssen Sie 600 $ mehr ausgeben.

Ich habe die gleichen Probleme beim Entwerfen dieses Metadatenindex. DynamoDB sieht einfach nicht richtig aus. Dies ist immer der Fall, wenn Sie versuchen, DynamoDB so zu verwenden, dass Sie ein RDBMS verwenden. Weil ich nur wenige Suchanfragen benötige wie deine. Ich habe über ElasticSearch und das s3 Listing River Plugin nachgedacht und es sieht auch nicht gut aus, da ich ES Cluster und Speicher verwalten muss. Was ist mit CloudSearch? Mit Blick auf die Grenzen stimmt auch CloudSearch nicht.

Meine Anforderungen:

  1. Lage sein, das jüngste Objekt mit einem bestimmten Präfix innerhalb eines Bereichs bestimmten Zeit
  2. der Lage sein, Objekte zuzugreifen zuzugreifen
  3. maximale Leistung aus S3 von Hash-Strings erhalten im Schlüsselraum für AWS EMR, Athena oder Redshift Spectrum

Ich bin hier alles verloren. Ich habe sogar über die S3 Versionierungsfunktion nachgedacht, da ich das neueste Objekt ganz natürlich bekommen kann. Alles scheint nicht ganz richtig zu sein und AWS-Dokumente und Blog-Artikel sind voller Verwirrungen.

Dies ist, wo ich für die ganze Woche bin stecken :(

bei AWS Menschen nur Diagramme Liebe Zeichnung. Wenn sie ein neues Architekturschema oder ein Konzept einzuführen, sie eine Reihe von AWS Produktsymbolen setzt nur da und sagen Sie, es ist schön integriert

+0

Ich dachte sogar über Epochen Zeitstempel in den Objektschlüsseln wie im binären Zahlenformat. z.B. 4238429332 wäre wie "111011010101010101010101". dann können Sie LIST mit einem bestimmten Präfix erhalten, das Ihnen einen bestimmten Zeitbereich gibt. Erraten Sie, was? S3 get LIST Anfragen sind viel teurer als DynamoDB read provisioning price. Wenn Sie das Ergebnis irgendwie bis zum Limit von 1000 Objekten verwenden können, könnte es Sinn machen, aber das war nicht mein Fall. – gini09

+0

sieht es so aus, als ob AWS ein neues Feature für S3 macht. Es gibt ein Team namens "S3 Indexing Team" und sie stellen ein ... https://www.amazon.jobs/en/jobs/468608 – gini09

Verwandte Themen