5

Gibt es eine Möglichkeit, Hive anzuweisen, Daten in mehrere Ausgabedateien aufzuteilen? Oder vielleicht die Größe der Ausgabedateien begrenzen.Hive - Dateien in Dateien aufteilen

Ich plane Redshift zu verwenden, die Splitting-Daten in mehrere Dateien empfiehlt parallele Laden zu ermöglichen http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html

Wir alle Daten in hive vorverarbeiten aus, und ich frage mich, ob es einen Weg gibt, sagen zu erstellen 10 1 GB-Dateien, die das Kopieren zu einer Rotverschiebung beschleunigen könnten.

Ich betrachtete https://cwiki.apache.org/Hive/adminmanual-configuration.html und https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties aber ich kann nichts

Antwort

10

Es gibt ein paar Möglichkeiten, wie Sie über Aufspalten Hive Ausgabe finden gehen könnte. Der erste und einfachste Weg ist die Anzahl der Reduzierstücke einzustellen. Da jeder die Schreibvorgänge auf seine eigene Ausgabedatei reduziert, entspricht die Anzahl der von Ihnen angegebenen Reduzierungen der Anzahl der geschriebenen Ausgabedateien. Beachten Sie, dass einige Hive-Abfragen nicht zu der Anzahl der von Ihnen angegebenen Reduzierungen führen (z. B. SELECT COUNT(*) FROM some_table führt immer zu einem Reduzierer). Um die Anzahl der Reduzierungen angeben führen dies vor Ihrer Suchanfrage:

set mapred.reduce.tasks=10 

Eine weitere Möglichkeit, in mehrere Ausgabedateien aufteilen könnte, wäre haben Hive die Ergebnisse Ihrer Abfrage in einer partitionierten Tabelle einzufügen. Dies würde zu mindestens einer Datei pro Partition führen. Damit dies sinnvoll ist, müssen Sie eine vernünftige Spalte für die Partitionierung haben. Zum Beispiel möchten Sie nicht in einer eindeutigen ID-Spalte partitionieren oder Sie hätten eine Datei für jeden Datensatz. Dieser Ansatz garantiert mindestens die Ausgabedatei pro Partition und höchstens numPartitions * numReducers. Hier ist ein Beispiel (mach dir keine Sorgen über hive.exec.dynamic.partition.mode, es muss gesetzt sein, damit diese Abfrage funktioniert).

hive.exec.dynamic.partition.mode=nonstrict 

CREATE TABLE table_to_export_to_redshift (
    id INT, 
    value INT 
) 
PARTITIONED BY (country STRING) 

INSERT OVERWRITE TABLE table_to_export_to_redshift 
PARTITION (country) 
SELECT id, value, country 
FROM some_table 

Um weitere feinkörnige Kontrolle zu bekommen, können Sie Ihre eigene reduzieren Skript schreiben, und das Skript schreiben, um mehrere Dateien reduzieren müssen hive passieren. Sobald Sie Ihren eigenen Reducer schreiben, können Sie so ziemlich alles tun, was Sie wollen.

Schließlich können Sie den Versuch unternehmen, Hive so zu manövrieren, dass Sie die gewünschte Anzahl von Dateien ausgeben können, und diese dann selbst auseinander brechen, sobald Hive fertig ist. Standardmäßig speichert Hive seine Tabellen unkomprimiert und im Nur-Text-Verzeichnis im Warehouse-Verzeichnis (z. B. /apps/hive/warehouse/table_to_export_to_redshift). Sie können Hadoop-Shell-Befehle, einen MapReduce-Job oder Pig verwenden oder sie in Linux ziehen und sie so aufteilen, wie Sie möchten.

Ich habe keine Erfahrung mit Redshift, daher sind einige meiner Vorschläge möglicherweise aus irgendeinem Grund nicht für Redshift geeignet.

Ein paar Anmerkungen: Das Teilen von Dateien in mehr, kleinere Dateien ist im Allgemeinen für Hadoop schlecht. Sie erhalten möglicherweise eine höhere Geschwindigkeit für Redshift, aber wenn die Dateien von anderen Teilen des Hadoop-Ökosystems (MapReduce, Hive, Pig usw.) verbraucht werden, kann es zu Leistungseinbußen kommen, wenn die Dateien zu klein sind (obwohl 1 GB ausreichen). . Stellen Sie außerdem sicher, dass die zusätzliche Verarbeitungs-/Entwicklerzeit die Zeiteinsparungen wert ist, die Sie für die Parallelisierung Ihrer Redshift-Datenlast erhalten.

+0

Super, danke –

+1

Ihr Beispiel macht keine Partitionierung. Sowohl die Befehle "CREATE TABLE" als auch "INSERT OVERWRITE" müssen die zu verwendenden Partition (en) angeben. – libjack

+0

@libjack Danke, dass du das eingefangen hast. Oben behoben. –