2017-05-18 9 views
0

Ich möchte in eine partitionierte Strukturtabelle aus einer anderen Strukturtabelle einfügen. Die Daten werden in einer einzigen Partition in der Zieltabelle gespeichert. Das Problem ist, dass alle Reduzierstücke sehr schnell fertig sind, aber einer der Reduzierstücke nimmt viel Zeit in Anspruch, da alle Arbeiten an diesen einzelnen Reduzierer gehen.So erzwingen Sie, dass Zeilen gleichmäßig verteilt werden, um in einer partitionierten Tabelle von einer anderen Tabelle unter den Reduzierern Zeilen zu verteilen, um die Leistung zu verbessern

Ich möchte einen Weg finden, eine Arbeit gleich verteilt unter allen Reduzierern zu setzen. Gibt es einen Weg dazu? Wie kann ich die Leistung des Insert-Überschreibens verbessern?

Quelle Tabelle DDL:

CREATE EXTERNAL TABLE employee (id INT,first_name String,latst_name String,email String,gender String) STORED AS TEXTFILE '/emp/data' 

TARGET DDL TABLE:

CREATE EXTERNAL TABLE employee_stage (id INT,first_name String,latst_name String,email String,gender String) PARTITIONED BY (batch_id bigint) STORED AS ORC LOCATION '/stage/emp/data' 

ist hier, um die Daten-Snapshot

1 Helen Perrie [email protected] Female 
2 Rafaelita Jancso [email protected] Female 
3 Letti Kelley [email protected] Female 
4 Adela Dmisek [email protected] Female 
5 Lay Reyner [email protected] Male 
6 Robby Felder [email protected] Male 
7 Thayne Brunton [email protected] Male 
8 Lorrie Roony [email protected] Male 
9 Hodge Straun [email protected] Male 
10 Gawain Tomblett [email protected] Male 
11 Carey Facher [email protected] Male 
12 Pamelina Elijahu [email protected] Female 
13 Carmelle Dabs [email protected] Female 
14 Moore Baldrick [email protected] Male 
15 Sheff Morin [email protected] Male 
16 Zed Eary [email protected] Male 
17 Angus Pollastrone [email protected] Male 
18 Moises Hubach [email protected] Male 
19 Lilllie Beetham [email protected] Female 
20 Mortimer De Hooge [email protected] Male 

Die Quelltabelle mehr als 100 Millionen Datensätze enthält.

Hier ist die Hql, die ich verwende.

insert overwrite table employee_stage 
PARTITION (batch_id) 
SELECT 
    id, 
    first_name, 
    latst_name, 
    email, 
    gender, 
    123456789 as batch_id 
FROM employee; 

Die Daten werden in einer einzigen Partition gespeichert.

Bitte lassen Sie mich in diesem Zustand wissen, wie kann ich die Leistung verbessern? Gibt es eine Möglichkeit, die Zeilen gleichmäßig auf alle Reduzierungen zu verteilen?

+0

Können Sie zusätzliche Informationen geben? Wie ist Ihr Tisch partitioniert? Was ist dein Datensatz? – Constantine

+0

** (1) ** Bitte fügen Sie die zusätzlichen Informationen zu Ihrem ursprünglichen Beitrag hinzu und löschen Sie die Kommentare ** (2) ** Bitte geben Sie die DDL für beide Tabellen und den Code, den Sie verwenden, um die Zieltabelle –

+0

@DuduMarkovitz I habe die DDL und hql hinzugefügt. Finden Sie bitte. –

Antwort

1

Ich nehme an, Sie tun keine Joins oder andere schwere Transformationen in Ihrer insert overwrite Abfrage und Skew ist wirklich während des Einfügens passiert. Denn wenn du das tust, sollte die Frage nicht über Einfügen sein.

Versuchen Sie, distribute by batch_id Ihrer Einfügeabfrage hinzuzufügen und erneut auszuführen. Wenn Sie immer noch mit Schräglauf laufen, überprüfen Sie Ihre Daten. Es gibt zu viele Daten für eine bestimmte batch_id oder vielleicht haben Sie eine Menge Nullen. Es gibt verschiedene Ansätze, mit schiefen Daten umzugehen. Eine davon besteht darin, schiefe Schlüssel herauszufiltern und sie separat zu laden. Überprüfen Sie, dass die lang laufenden Reduziergeräte den Job-Tracker protokollieren. Dadurch erhalten Sie mehr Informationen darüber, wo ein Problem besteht.

+0

Die gesamten Daten in der Quelltabelle ist für eine einzige Batch-ID. So dass alle Reihen für den einzelnen Reducer gehen. Kann ich den Bienenstock zwingen, die Reihen gleichmäßig unter allen Reduzierern zu verteilen? –

+0

versuchen, einen anderen gleichmäßig verteilten Schlüssel zu verteilen. Idealerweise sollte es viele Reduzierstücke geben und jedes Reduzierstück wird seine eigene Datei erstellen. Überprüfen Sie auch diese Eigenschaft: 'set hive.exec.reducers.bytes.per.reducer = 67108864;' um sicherzustellen, dass Sie nicht zu viele Daten pro Reduzierer haben – leftjoin

+0

Standardwert ist 1G.Wenn Sie es auf 67108864 setzen, werden mehr Reduzierer erstellt, die die Parallelität erhöhen. Und stellen Sie sicher, dass Sie keine 'Order by' oder etwas anderes haben, was dazu führt, dass alle Daten auf einem einzelnen Reducer laufen – leftjoin

Verwandte Themen