2014-10-13 13 views
5

Ich habe eine große Menge von Daten in S3 in Form von ein paar hundert CSV-Dateien, die ~ 1,7 TB insgesamt (unkomprimiert) sind. Ich versuche, es auf einen leeren Tisch in einem Redshift-Cluster zu kopieren.Warum verwenden Redshift COPY-Abfragen (viel) mehr Speicherplatz für Tabellen mit einem Sortierschlüssel

Der Cluster ist leer (keine anderen Tabellen) und hat 10 dw2.large Knoten. Wenn ich einen Sortierschlüssel in der Tabelle einstelle, verbraucht der Kopierbefehl den gesamten verfügbaren Speicherplatz auf 25% des Weges und bricht ab. Wenn kein Sortierschlüssel vorhanden ist, wird die Kopie erfolgreich abgeschlossen und verwendet nie mehr als 45% des verfügbaren Speicherplatzes. Dieses Verhalten ist konsistent, unabhängig davon, ob ich auch einen Verteilungsschlüssel gesetzt habe oder nicht.

Ich weiß nicht wirklich, warum das passiert, oder wenn es erwartet wird. Hat jemand dieses Verhalten gesehen? Wenn ja, hast du Vorschläge, wie du das umgehen kannst? Eine Idee wäre es, jede Datei einzeln zu importieren, aber ich würde gerne einen Weg finden, Redshift mit diesem Teil selbst zu arbeiten und alles in einer Abfrage zu erledigen.

Antwort

7

Antwort vom Redshift-Team. Der Cluster benötigt einen freien Speicherplatz von mindestens dem 2,5-fachen der Größe der eingehenden Daten, der als temporärer Speicher für die Sortierung verwendet werden soll. Sie können den Cluster vergrößern, die Daten kopieren und die Größe erneut ändern.

+0

2.5x die Größe der eingehenden Daten? Das erscheint lächerlich. Es ist nicht eine konstante Anzahl von Reihen, die Sie einfügen, aber es ist tatsächlich abhängig von der Größe der Zeilen? – michaelsnowden

+0

Wir hatten auch große Probleme damit. Unser Cluster hatte zu Beginn des Imports 40% Festplattenbenutzung und würde den ganzen Weg auf 100% gehen und manchmal sogar den Import abstürzen, was lächerlich erscheint. –

0

Jede dw2.large-Box hat einen Speicherplatz von 0,16 TB. Wenn Sie sagten, dass Sie einen Cluster von 10 Knoten haben, beträgt der verfügbare Gesamtspeicher ungefähr 1,6 TB. Sie haben erwähnt, dass Sie etwa 1,7 TB Rohdaten (unkomprimiert) in Rotverschiebung laden müssen.

Wenn Sie Daten mithilfe von Kopierbefehlen in die Rotverschiebung laden, komprimiert redshift automatisch Ihre Daten und lädt sie. , wenn Sie jede Tabelle db laden Sie Komprimierungscodierung von unten Abfrage

Select "column", type, encoding 
from pg_table_def where tablename = 'my_table_name' 

Sobald Sie Ihre Daten geladen werden sehen können, wenn Tabelle keine Sortierschlüssel hat. Sehen Sie, welche Komprimierung angewendet wird. Ich schlug vor, Sie Tabelle löschen und erstellen Sie jedes Mal, wenn Sie die Daten für Ihre Tests laden Damit Kompressionen Codieren jedes Time.once Sie Ihre Tabelle mit Kopierbefehle untenstehenden Link und Feuer-Skript sehen laden analysiert werden Tischgroesse

http://docs.aws.amazon.com/redshift/latest/dg/c_analyzing-table-design.html zu bestimmen

Da, wenn Sie Sortierschlüssel für Ihre Tabelle anwenden und Daten laden, belegt der Sortierschlüssel auch etwas Speicherplatz.

Da Tabelle ohne Sortierschlüssel weniger Speicherplatz benötigt als Tabelle mit Sortierschlüssel.

Sie müssen sicherstellen, dass die Komprimierung auf die Tabelle angewendet wird.

Wenn wir den Sortierschlüssel anwenden, benötigen Sie mehr Speicherplatz. Wenn Sie den Sortierschlüssel anwenden, müssen Sie prüfen, ob Sie die Daten auch in sortierter Reihenfolge laden, damit die Daten sortiert gespeichert werden. Dies müssen wir vermeiden vacuum Befehl zum Sortieren der Tabelle nach Daten geladen werden.

Verwandte Themen