2016-03-22 10 views
0

Ich mache Join-Operation im Bienenstock. Wenn jedoch der Reduzierer 99% erreicht, bleibt der Reduzierer stecken.Wie verfälschte Daten mit Hive verarbeiten?

Dann habe ich festgestellt, dass es Skew-Daten in der Tabelle gibt. Bsp. In Tabelle A gibt es 1 Million Daten und Tabelle B hat nur 10k. In Tabelle A hat die Verbindungsspalte 80% gleiche Werte und Rest ist anders. Also Bienenstock Reducer bei diesem Wert stecken.

Hier ist meine Frage:

INSERT INTO TABLE xyz SELECT m.name, m.country, m.user_type, m.category FROM A m JOIN category n ON (m.name = n.name) where country=2 GROUP BY m.name, m.country, m.user_type, m.category; 

Also bitte mögliche Lösung vorschlagen. Wie kann ich den Join-Vorgang für diese Art von Daten verarbeiten?

+0

http://stackoverflow.com/questions/32370033/hive-join-optimization/32373086#32373086 –

+0

Danke @KishoreKumarSuthar für die Antwort. Es ist etwas cooles. –

Antwort

1

Beginnend in Hive 0.10.0 können Tabellen als schief oder zum Schiefstellen geändert werden (in diesem Fall werden nach der ALTER-Anweisung erstellte Partitionen verzerrt). Außerdem können schräge Tabellen die List-Bucketing-Funktion verwenden, indem sie die Option GESPEICHERTE AS-VERZEICHNISSE angeben. Siehe die DDL Dokumentation: Create Table, Skewed Tables und Alter Table Skewed or Stored as Directories

Als Referenz verwenden diese link.

+0

Danke für die Wiederholung, aber ich kann diesen Ansatz nicht für die tägliche Verarbeitung verfolgen. –

0

Eine Lösung für das obige Problem gefunden.

Legen Sie die folgenden Parameter fest, die vor der Ausführung der Hive-Join-Struktur eingefügt werden sollen.

set hive.optimize.skewjoin=true; 
set hive.skewjoin.key=100000; 
set hive.skewjoin.mapjoin.map.tasks=10000; 
set hive.skewjoin.mapjoin.min.split=33554432; 
set hive.exec.parallel=true; 
set hive.exec.parallel.thread.number=8; 
set hive.vectorized.execution.enabled = true; 
set hive.vectorized.execution.reduce.enabled = true; 
set hive.vectorized.execution.reduce.groupby.enabled = true; 
set hive.cbo.enable=true; 
set hive.compute.query.using.stats=true; 
set hive.stats.fetch.partition.stats=true; 
set hive.stats.fetch.column.stats=true; 
set hive.stats.autogather=true; 
set mapred.output.compress=true; 
set hive.exec.compress.output=true; 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; 
set hive.auto.convert.join=false; 

Einige Parameter müssen sich je nach Datengröße und Clustergröße ändern.

+0

Es wäre hilfreich, wenn diese Antwort Hinweise darauf hätte, warum dies funktioniert. Beispiel: Vier der Parameter scheinen eine kostenbasierte Optimierung zu aktivieren: https://hortonworks.com/blog/5-ways-make-hive-quiries-run-faster/ – dfrankow