Ich habe mich gefragt, ob jemand genau weiß, was ein S3-Präfix ist und wie es mit den von Amazon veröffentlichten S3-Ratenlimits interagiert :
Amazon S3 skaliert automatisch auf hohe Anforderungsraten. Beispielsweise kann Ihre Anwendung mindestens 3.500 PUT / POST / DELETE- und 5.500 GET-Anforderungen pro Sekunde und Präfix in einem Bucket erreichen. Die Anzahl der Präfixe in einem Bucket ist unbegrenzt.
Während das wirklich klar ist, bin ich mir nicht ganz sicher, was ein Präfix ist?
Benötigt ein Präfix ein Trennzeichen?
Wenn wir einen Bucket haben, in dem wir alle Dateien auf der "Root" -Ebene speichern (vollständig flach, ohne Präfix / Trennzeichen), zählt dies als einzelnes "Präfix" und unterliegt es den oben angegebenen Ratenbeschränkungen?
Die Art und Weise, wie ich die Dokumentation von amazon interpretiere , legt mir nahe, dass dies der Fall ist und dass die flache Struktur als ein einziges "Präfix" betrachtet wird. (dh es würde den oben genannten veröffentlichten Tarifgrenzen unterliegen)
Angenommen, Ihr Bucket (vom Administrator erstellt) enthält vier Objekte mit den folgenden Objektschlüsseln:
Entwicklung / Projekte1.xls
Finanzen / Statement1.pdf
Privat / taxdocument.pdf
s3-dg.pdf
Der Schlüssel s3-dg.pdf hat kein Präfix, daher wird sein Objekt direkt auf der Stammebene des Buckets angezeigt. Wenn Sie den Ordner Development / öffnen, wird das Projects.xlsx-Objekt darin angezeigt.
Würde im obigen Beispiel s3-dg.pdf einem anderen Ratenlimit (5500 GET-Anforderungen / Sekunde) unterliegen als jedes der anderen Präfixe (Entwicklung / Finanzen / Privat)?
Was verwirrender ist, ist, dass ich ein paar Blogs über Amazon gelesen habe, in denen die ersten N Bytes als Partitionsschlüssel verwendet wurden und die Verwendung von Präfixen mit hoher Kardinalität empfohlen wurden. Ich bin mir nur nicht sicher, wie dies mit einem Bucket mit einer "flachen Dateistruktur" interagiert. .
quelle
s3-dg.pdf
den der Partitionsschlüssel wäres3-dg.
, siehe meine erweiterte Antwort unten.Antworten:
Sie haben Recht, die Ankündigung scheint sich zu widersprechen. Es ist einfach nicht richtig geschrieben, aber die Informationen sind korrekt. Zusamenfassend:
Als Referenz finden Sie hier eine Antwort des AWS-Supports auf meine Anfrage zur Klärung:
quelle
folder1/sub1/
Dies scheint in einer Amazon-Release-Mitteilung unklar zu sein
https://aws.amazon.com/about-aws/whats-new/2018/07/amazon-s3-announces-increased-request-rate-performance/
quelle
Damit AWS Milliarden von Anforderungen pro Sekunde verarbeiten kann, müssen die Daten aufgespalten werden, um den Durchsatz zu optimieren. Dazu teilen sie die Daten basierend auf den ersten 6 bis 8 Zeichen des Objektschlüssels in Partitionen auf. Denken Sie daran, dass S3 kein hierarchisches Dateisystem ist, sondern nur ein Schlüsselwertspeicher, obwohl der Schlüssel häufig als Dateipfad zum Organisieren von Daten verwendet wird, Präfix + Dateiname.
Dies ist kein Problem, wenn Sie weniger als 100 Anfragen pro Sekunde erwarten. Wenn Sie jedoch ernsthafte Anforderungen haben, müssen Sie über die Benennung nachdenken.
Für einen maximalen parallelen Durchsatz sollten Sie berücksichtigen, wie Ihre Daten verwendet werden, und die unterschiedlichsten Zeichen am Anfang Ihres Schlüssels verwenden oder sogar 8 zufällige Zeichen für die ersten 8 Zeichen des Schlüssels generieren.
Angenommen, die ersten 6 Zeichen definieren die Partition:
files/user/bob
wäre schlecht, da sich alle Objekte auf einer Partition befinden würdenfiles/
.2018-09-21/files/bob
wäre fast genauso schlimm, wenn nur heutige Daten von der Partition gelesen würden2018-0
. Aber etwas besser, wenn die Objekte aus den vergangenen Jahren gelesen werden.bob/users/files
wäre ziemlich gut, wenn wahrscheinlich verschiedene Benutzer die Daten gleichzeitig von der Partition aus verwenden würdenbob/us
. Aber nicht so gut, wenn Bob bei weitem der meistbeschäftigte Benutzer ist.3B6EA902/files/users/bob
wäre am besten für die Leistung, aber schwieriger zu referenzieren, wo der erste Teil eine zufällige Zeichenfolge ist, wäre dies ziemlich gleichmäßig verteilt.Abhängig von Ihren Daten müssen Sie an einen bestimmten Zeitpunkt denken, wer was liest, und sicherstellen, dass die Schlüssel mit genügend Variationen beginnen, um eine angemessene Partitionierung zu ermöglichen.
Nehmen wir für Ihr Beispiel an, dass die Partition aus den ersten 6 Zeichen des Schlüssels stammt:
für den Schlüssel wäre
Development/Projects1.xls
der PartitionsschlüsselDevelo
für den Schlüssel wäre
Finance/statement1.pdf
der PartitionsschlüsselFinanc
für den Schlüssel wäre
Private/taxdocument.pdf
der PartitionsschlüsselPrivat
für den Schlüssel wäre
s3-dg.pdf
der Partitionsschlüssels3-dg.
quelle
3,500 PUT/POST/DELETE and 5,500 GET requests per second per prefix
bezieht sich auf Partitionen. Sie wissen nicht genau, wie viele Partitionen für Ihre Daten erstellt wurden, aber wenn Sie die ersten Zeichen ausreichend variieren, können Sie den maximalen Anforderungsdurchsatz erzielen.Die positive Antwort darauf war für mich etwas irreführend. Wenn dies die Pfade sind
Bucket / Ordner1 / Sub1 / Datei
Bucket / Ordner1 / Sub2 / Datei
Bucket / 1 / Datei
Bucket / 2 / Datei
Ihr Präfix für die Datei wäre tatsächlich
Ordner1 / Sub1 /
Ordner1 / Sub2 /
1 / Datei
2 / Datei
https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html Bitte siehe Dokumente. Ich hatte Probleme mit dem führenden '/', als ich versuchte, Schlüssel mit dem Luftstrom-s3hook aufzulisten.
quelle
/file
am Ende haben sollten.S3-Präfixe wurden früher durch die ersten 6-8 Zeichen bestimmt.
Dies hat sich Mitte 2018 geändert - siehe Ankündigung https://aws.amazon.com/about-aws/whats-new/2018/07/amazon-s3-announces-increased-request-rate-performance/
Aber das ist die halbe Wahrheit . Tatsächlich sind Präfixe (in alter Definition) immer noch wichtig.
S3 ist kein traditioneller „Speicher“ - jedes Verzeichnis / Dateiname ist ein separates Objekt in einem Schlüssel- / Wertobjektspeicher. Außerdem müssen die Daten partitioniert / aufgeteilt werden, um sie auf Billiarden von Objekten zu skalieren. Also ja, dieses neue Sharding ist ein bisschen "automatisch", aber nicht wirklich, wenn Sie einen neuen Prozess erstellt haben, der mit verrückter Parallelität zu verschiedenen Unterverzeichnissen darauf schreibt. Bevor der S3 aus dem neuen Zugriffsmuster lernt, kann es zu einer S3-Drosselung kommen, bevor die Daten entsprechend neu gehostet / neu partitioniert werden.
Das Erlernen neuer Zugriffsmuster braucht Zeit. Die Neupartitionierung der Daten nimmt Zeit in Anspruch.
Mitte 2018 haben sich die Dinge verbessert (~ 10-facher Durchsatz für einen neuen Bucket ohne Statistik), aber es ist immer noch nicht das, was es sein könnte, wenn die Daten ordnungsgemäß partitioniert werden. Um fair zu sein, wird dies möglicherweise nicht auf Sie angewendet, wenn Sie nicht über eine Menge Daten verfügen oder das Muster für den Zugriff auf Daten nicht sehr parallel ist (z. B. Ausführen eines Hadoop / Spark-Clusters auf vielen Tbs Daten in S3 mit Hunderten + von Aufgaben, die parallel auf denselben Bucket zugreifen).
TLDR :
"Alte Präfixe" spielen immer noch eine Rolle. Schreiben Sie Daten in das Stammverzeichnis Ihres Buckets, und das Verzeichnis der ersten Ebene bestimmt dort das "Präfix" (machen Sie es zum Beispiel zufällig).
"Neue Präfixe" funktionieren, aber zunächst nicht. Das Laden dauert einige Zeit.
PS. Ein anderer Ansatz: Sie können sich an Ihren AWS TAM wenden (falls vorhanden) und ihn bitten, einen neuen S3-Bucket vorab zu partitionieren, wenn Sie erwarten, dass eine Menge Daten ihn bald überfluten werden.
quelle
Wenn Sie S3 mit Athena, EMR / Hive oder Redshift Spectrum abfragen, kann das Erhöhen der Anzahl der Präfixe das Hinzufügen weiterer Partitionen bedeuten (da die Partitions-ID Teil des Präfixes ist). Wenn Sie datetime als einen Ihrer Partitionsschlüssel verwenden, wächst die Anzahl der Partitionen (und Präfixe) automatisch, wenn im Laufe der Zeit neue Daten hinzugefügt werden, und die Gesamtzahl der maximalen S3-GETs pro Sekunde steigt ebenfalls.
quelle