2016-03-24 7 views
4

Versuchen, das Problem mit kleinen Dateien durch Komprimieren der Dateien unter Hive-Partitionen durch Insert überschreiben Partition Befehl in Hadoop.Hive-Komprimierung mit Insert überschreiben Partition

Abfrage:

SET hive.exec.compress.output=true; 
SET mapred.max.split.size=256000000; 
SET mapred.output.compression.type=BLOCK; 
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; 
set hive.merge.mapredfiles=true; 
set hive.merge.size.per.task=256000000; 
set hive.merge.smallfiles.avgsize=256000000; 


INSERT OVERWRITE TABLE tbl1 PARTITION (year=2016, month=03, day=11) 
SELECT col1,col2,col3 from tbl1 
WHERE year=2016 and month=03 and day=11; 

Eingabedateien:

Für Testzwecke Ich habe drei Dateien unter der Stock-Partition (2016.03.11) in HDFS mit der Größe von 40 MB jeder.

2016/03/11/file1.csv

2016/03/11/file2.csv

2016/03/11/file3.csv

Beispiel meines Blockes Größe ist 128, also möchte ich nur eine Ausgabedatei erstellen. Aber ich bekomme 3 verschiedene komprimierte Dateien.

Bitte helfen Sie mir, die Hive-Konfiguration zu erhalten, um die Größe der Ausgabedatei zu beschränken. Wenn ich die Komprimierung nicht verwende, erhalte ich die einzelne Datei.

Hive Version: 1.1

Antwort

1

Es ist interessant, dass Sie noch 3 Dateien bekommen, wenn die Partition angeben, wenn Komprimierung, so dass Sie in dynamische Partitionierung oder die Partitionierung Graben und konzentrieren sich auf die Anzahl der Mapper und Reduzierungen suchen möchten von Ihrem Job geschaffen werden. Wenn Ihre Dateien klein sind, könnte ich sehen, wie Sie sie alle in einer Datei auf Ihrem Ziel haben möchten, aber dann würde ich auch die Notwendigkeit einer Komprimierung für sie in Frage stellen.

Die Anzahl der in Ihrem Ziel erstellten Dateien ist direkt an die Anzahl der Reduzierungen oder Mapper gebunden. Wenn das von Ihnen geschriebene SQL reduziert werden muss, entspricht die Anzahl der erstellten Dateien der Anzahl der im Job verwendeten Reduzierungen. Dies kann durch Einstellen der Anzahl der im Job verwendeten Reduzierungen gesteuert werden.

set mapred.reduce.tasks = 1; 

In Ihrem Beispiel SQL würde es höchstwahrscheinlich keine Reduzierungen verwendet werden, so dass die Anzahl der Dateien im Ziel gleich verwendet, um die Anzahl der Mapper, die auf die Anzahl der Dateien in der Quelle gleich ist. Es ist nicht so einfach, die Anzahl der Ausgabedateien in einem Nur-Karten-Job zu steuern, aber es gibt eine Reihe von Konfigurationseinstellungen, die ausprobiert werden können.

Einstellung, um kleine Eingabedateien zu kombinieren, so dass weniger Mapper erstellt werden, der Standardwert ist false.

set hive.hadoop.supports.splittable.combineinputformat = true; 

Versuchen Sie, eine Schwelle in Bytes für die Eingabedateien einstellen, etwas unter dieser Schwelle würde versuchen, auf eine Karte umgewandelt werden beitreten, welche die Anzahl der Ausgabedateien beeinflussen können.

set hive.mapjoin.smalltable.filesize = 25000000; 

Was die Kompression ich mit der Änderung der Art der Kompression spielen würde nur verwendet werden, um zu sehen, ob das einen Unterschied in Ihrer Ausgabe macht.

set hive.exec.orc.default.compress = gzip, snappy, etc... 
+0

#Salmonerd, wie Sie sagte, dass es keine Minderer ausgeführt wird, da seine Karte nur Job ist, dass ich im Grunde bin versucht, durch kleine Dateien Problem zu lösen in größere Dateien kombiniert in hive Trenneinsatz überschrieben werden. Lass mich die von dir vorgeschlagene Konfiguration ausprobieren und ich werde zurückkommen. –

+0

Funktioniert wie erwartet. Erstellt nur eine einzelne Datei aus mehreren kleinen Dateien. –

+0

Super, welche Einstellungen hast du implementiert? – Jared