Hive — split-Daten in Dateien
Ist es, einen Weg zu weisen Hive zum aufteilen der Daten in mehrere Ausgabe-Dateien? Oder vielleicht cap die Größe der Ausgabe-Dateien.
Ich bin der Planung bis zur Nutzung die Rotverschiebung, die empfiehlt Aufspaltung der Daten in mehrere Dateien zu ermöglichen das parallele laden http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html
Wir Vorverarbeiten alle Daten in hive, und ich Frage mich, ob es einen Weg gibt, zu erstellen, zu sagen, 10 1-GB-Dateien, die Sie kopieren, um die Rotverschiebung schneller.
War ich bei der Suche https://cwiki.apache.org/Hive/adminmanual-configuration.html und https://cwiki.apache.org/confluence/display/Hive/Configuration+Eigenschaften aber ich kann nichts finden,
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Möglichkeiten, wie Sie gehen könnte, über die Spaltung Hive-Ausgabe. Der erste und einfachste Weg ist, um die Anzahl der Reduktionen. Da jeder reduziert, schreibt zu seiner eigenen Ausgabe-Datei, die Anzahl der Reduktionen, die du angibst, entsprechen der Anzahl der output-Dateien geschrieben. Beachten Sie, dass einige Hive-Abfragen wird nicht in der Anzahl der Reduktionen, die Sie angeben (zum Beispiel
SELECT COUNT(*) FROM some_table
immer Ergebnisse in einem reducer). Bestimmen Sie die Anzahl der Reduktionen führen Sie dies, bevor Sie Ihre Abfrage:Einem anderen Weg könnte man aufteilen in mehrere Ausgabe-Dateien wäre Bienenstock legen Sie die Ergebnisse der Abfrage in einer partitionierten Tabelle. Das Ergebnis wäre mindestens eine Datei pro partition. Für diesen Sinn zu machen, müssen Sie einige vernünftige Spalte partition auf. Zum Beispiel, Sie würde nicht wollen, um die partition auf eine eindeutige id-Spalte oder du hast eine Datei für jeden Datensatz. Dieser Ansatz garantiert mindestens die Ausgabe-Datei pro partition, und bei den meisten
numPartitions * numReducers
. Hier ist ein Beispiel (keine Sorge, zu viel überhive.exec.dynamic.partition.mode
es muss festgelegt werden, für die diese Abfrage zu arbeiten).Bekommen, mehr feinkörnige Kontrolle, Sie können schreiben Sie Ihre eigenen zu reduzieren Skript übergeben hive und haben reduzieren, dass ein script schreiben, um mehrere Dateien. Sobald Sie schreiben Sie Ihre eigenen reducer, Sie kann so ziemlich, was Sie wollen.
Schließlich können Sie verzichten, die versuchen zu manövrieren-Struktur in der Ausgabe Ihres gewünschten Anzahl von Dateien und nur brechen Sie auseinander, sich selbst einmal Hive ist getan. Standardmäßig Hive speichert seine Tabellen unkomprimiert und in plain text im warehouse-Verzeichnis (ex
/apps/hive/warehouse/table_to_export_to_redshift
). Sie können die Hadoop-shell-Befehle, ein MapReduce-job, Schwein, oder ziehen Sie Sie in Linux und brechen Sie auseinander, wie du willst.Ich habe keine Erfahrung mit Rotverschiebung, so dass einige meiner Vorschläge möglicherweise nicht geeignet für den Verzehr durch Rotverschiebung aus welchem Grund auch immer.
Ein paar Anmerkungen: Aufteilen von Dateien in mehrere, kleinere Dateien ist in der Regel schlecht für Hadoop. Sie erhalten möglicherweise eine Erhöhung der Geschwindigkeit für die Rotverschiebung, aber wenn die Dateien verbraucht, die von anderen teilen der Hadoop-ökosystem (MapReduce, Hive, Pig, etc) finden Sie möglicherweise ein performance-Verlust, wenn die Dateien zu klein sind (obwohl 1GB wäre in Ordnung). Auch stellen Sie sicher, dass die zusätzliche Verarbeitung/Entwickler Zeit Wert ist die Zeitersparnis, die Sie erhalten parallel zu Ihrer Rotverschiebung Daten laden.
CREATE TABLE
undINSERT OVERWRITE
Befehle müssen Sie die partition(en) zu verwenden.mapred.reduce.tasks
ist der Schlüssel, aber Nachteil ist, dass man nicht direkt Steuern, die Größe der Dateien. Die Weitergabe der Daten zu Reduzierstücke können Sie einDISTRIBUTE BY field
KlauselINSERT OVERWRITE DIRECTORY
Abfrage und senden alle mapper Ergebnisse mit dem gleichen Feldwert mit dem gleichen reducer. Sie können möglicherweise verwenden Sie diese zum nutzen Ihrer Daten. Zum Beispiel, ich habe diese verwendet werden, wenn die Erhebung von Daten über 1 Woche; wenn ichmapred.reduce.tasks=7
undDISTRIBUTE BY date
kann ich 7 relativ ähnlich große Dateien.