Hive-Cluster nach vs Reihenfolge von vs sortieren nach
Soweit ich das verstanden habe;
- Sortieren: nur Sorten mit in die reducer
- order by Bestellungen Dinge, die Global, aber schiebt alles in einen Reduzier -
- cluster intelligent verteilt das Zeug in Reduktionen durch die key-hash und machen eine Art von
Also meine Frage ist, ob das cluster durch eine Garantie einer globalen Ordnung? verteilen von stellt die gleichen Schlüssel, die in gleichen Reduzierstücke aber was ist mit den benachbarten Tasten?
Das einzige Dokument, das ich finden kann, dies ist hier und aus dem Beispiel scheint es, wie es Bestellungen weltweit. Aber von der definition, die ich fühle mich wie Sie nicht immer tun.
InformationsquelleAutor der Frage cashmere | 2012-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine kürzere Antwort: ja,
CLUSTER BY
garantiert Globale bestellen, vorausgesetzt, Sie sind bereit, sich mit dem mehrere Ausgabe-Dateien selbst.Die längere version:
ORDER BY x
: garantiert Globale bestellen, aber tut dies, indem Sie schieben alle Daten über nur ein reducer. Dies ist im Grunde nicht akzeptabel für große datasets. Sie sind am Ende einer sortierten Datei als Ausgabe.SORT BY x
: Bestellungen-Daten an jedes der N getrieben, aber jeder reducer erhalten können überlappende Bereiche von Daten. Sie am Ende mit N oder mehr sortiert Dateien mit überlappenden Bereichen.DISTRIBUTE BY x
: ist sichergestellt, dass jeder der N Reduzierstücke bekommt nicht überlappende Bereiche vonx
, aber nicht die Art der Ausgabe der einzelnen reducer. Sie am Ende mit N oder unsortierte Dateien mit nicht-überlappenden Bereichen.CLUSTER BY x
: ist sichergestellt, dass jeder der N Reduzierstücke bekommt, sich nicht überlappende Bereiche, sortiert dann durch diese Bereiche an die Reduzierstücke. Dies gibt Ihnen die Globale Bestellung, und ist dasselbe wie (DISTRIBUTE BY x
undSORT BY x
). Sie am Ende mit N oder mehr sortiert Dateien mit nicht-überlappenden Bereichen.Sinn? So
CLUSTER BY
im Grunde ist das mehr eine skalierbare version vonORDER BY
.InformationsquelleAutor der Antwort Lars Yencken
Lassen Sie mich klarstellen, ersten:
clustered by
nur vertreibt Ihre Schlüssel in verschiedene Eimer,clustered by ... sorted by
get buckets sortiert.Mit einem einfachen experiment (siehe unten) können Sie sehen, dass Sie nicht global order by-default. Der Grund ist, dass Standard-Partitionierer teilt Schlüssel unter Verwendung von hash-codes unabhängig von der tatsächlichen Schlüssel bestellen.
Aber Sie können Ihre Daten völlig bestellt.
Motivation ist "Hadoop: The Definitive Guide" von Tom White (3. Auflage, Kapitel 8, S. 274, Gesamt Sortieren), wo er beschreibt, TotalOrderPartitioner.
Beantworte ich Ihre TotalOrdering Frage zuerst, und dann beschreiben verschiedene Art-Verwandte-Hive-Experimente, die ich getan habe.
Im Hinterkopf behalten: was ich beschreibe, hier ist ein 'proof of concept', ich war in der Lage zu handhaben, ein einziges Beispiel mit Claudera - CDH3-Verteilung.
Ursprünglich hatte ich gehofft, dass org.apache.hadoop.mapred.lib.TotalOrderPartitioner wird den trick tun. Leider hat es nicht, weil es aussieht wie Hive-Partitionen, die von Wert, nicht der Schlüssel. So habe ich es patchen (sollte Unterklasse, aber ich habe keine Zeit dafür):
Ersetzen
mit
Nun kann der (gepatchten) TotalOrderPartitioner als Ihre Bienenkorb-Partitionierer:
Ich auch
in meinen tests.
Datei out_data2 erzählt TotalOrderPartitioner wie Eimer-Werten.
Sie generieren out_data2 durch Stichproben Ihrer Daten. In meinen tests verwendete ich 4 Eimer und die Tasten von 0 bis 10. Generiert ich out_data2 mit ad-hoc-Ansatz:
Dann ich kopierte daraus resultierenden out_data2 zu HDFS (in /user/yevgen/out_data2)
Mit diesen Einstellungen hab ich meine Daten bucketorientierten/sortiert (siehe letzten Punkt in meiner testliste).
Hier ist meine Experimente.
Erstellen von sample-Daten
bash> echo -e "1\n3\n2\n4\n5\n7\n6\n8\n9\n0" > data.txt
Erstellen grundlegende Prüfung-Tabelle:
hive> create table test(int x);
hive> load data local inpath 'data.txt' into table test;
Grundsätzlich diese Tabelle enthält die Werte von 0 bis 9, ohne Ordnung.
Demonstrieren, wie die Tabelle kopieren funktioniert (wirklich mapred.reduzieren.Aufgaben-parameter setzt die MAXIMALE Anzahl von reduce-tasks verwenden)
hive> create table test2(int x);
hive> set mapred.reduzieren.Aufgaben=4;
hive> insert overwrite table test2
wählen Sie eine.x aus test ein
join-test b
auf einem.x=b ist.x; -- stupied mitmachen zu zwingen, nicht-triviale map-reduce
bash> hadoop fs -cat /user/hive/warehouse/test2/000001_0
1
5
9
Zeigen giesst. Sie können sehen, dass die Tasten entsprechen dem Zufallsprinzip ohne jede Sortierung:
hive> create table test3(x int)
gruppiert (x) in 4 Eimer;
hive> set-Struktur.durchzusetzen.giesst = true;
hive> insert overwrite table test3
select * from test;
bash> hadoop fs -cat /user/hive/warehouse/test3/000000_0
4
8
0
Giesst mit der Sortierung. Die Ergebnisse sind teilweise sortiert, nicht ganz sortiert
hive> create table-test4(x int)
gruppiert (x) sortiert nach (x-desc)
in 4 Eimer;
hive> insert overwrite table test4
select * from test;
bash> hadoop fs -cat /user/hive/warehouse/test4/000001_0
1
5
9
Können Sie sehen, dass die Werte in aufsteigender Reihenfolge sortiert sind. Sieht aus wie Hive Fehler in CDH3?
Immer teilweise sortiert ohne cluster-Anweisung:
hive> create table-test5 als
wählen Sie "x"
aus dem test
Verteilung von x
Sortieren nach x-desc;
bash> hadoop fs -cat /user/hive/warehouse/test5/000001_0
9
5
1
Verwenden meine gepatcht TotalOrderParitioner:
hive> set-Struktur.mapred.Partitionierer=org.apache.hadoop.mapred.lib.TotalOrderPartitioner;
hive> set Gesamt.um.Partitionierer.natürlich.Bestellung=false
hive> set Gesamt.um.Partitionierer.path=/user/Ausbildung/out_data2
hive> create table-test6(x int)
gruppiert (x) sortiert nach (x) in 4 Eimer;
hive> insert overwrite table test6
select * from test;
bash> hadoop fs -cat /user/hive/warehouse/test6/000000_0
1
2
0
bash> hadoop fs -cat /user/hive/warehouse/test6/000001_0
3
4
5
bash> hadoop fs -cat /user/hive/warehouse/test6/000002_0
7
6
8
bash> hadoop fs -cat /user/hive/warehouse/test6/000003_0
9
InformationsquelleAutor der Antwort Yevgen Yampolskiy
So wie ich das verstehe, die kurze Antwort ist Nein.
Erhalten Sie überlappende Bereiche.
Vom SortBy Dokumentation:
"Cluster ist ein short-cut für die beiden Verteilen Durch und Sortieren."
"Alle Zeilen mit der gleichen Verteilung Von Spalten gehen Sie zu der gleichen reducer."
Aber es gibt keine Informationen zu Verteilen, dass durch die Garantie nicht überlappende Bereiche.
Darüber hinaus von DDL BucketedTables Dokumentation:
"Wie funktioniert Hive Verteilung der Reihen auf die buckets? Im Allgemeinen, die bucket-Zahl wird bestimmt, indem die expression hash_function(bucketing_column) mod num_buckets."
Ich nehme an, dass Cluster von im Select-Anweisung verwenden das gleiche Prinzip zum verteilen von Zeilen zwischen Reduzierstücke, weil es hauptsächliche Verwendung ist für das Auffüllen bucketorientierten Tabellen mit den Daten.
Ich erstellte Tabelle wit 1 int Spalte "a" eingefügt und die zahlen von 0 bis 9 da.
Dann setze ich die Anzahl der Reduktionen 2
set mapred.reduce.tasks = 2;
.Und auswählen von Daten aus dieser Tabelle mit Cluster-Klausel
select * from my_tab cluster by a;
Und erhielt das Ergebnis, das ich erwartet hatte:
0
2
4
6
8
1
3
5
7
9
Also erstmal reducer (Nummer 0) wurde auch noch zahlen (weil Ihre s-Modus 2 gibt 0)
und der zweite Druckminderer (Nummer 1) hat ungerade zahlen (weil Ihre s-Modus 2 ergibt 1)
So, wie "Verteilen Von" funktioniert.
Und dann "Sort By" sortiert die Ergebnisse in jedem reducer.
InformationsquelleAutor der Antwort Anton Zaviriukhin
CLUSTER erzeugt keine Globale bestellen.
Akzeptierte Antwort (von Lars Yencken) in die Irre führt, indem Sie erklärt, dass die Reduzierungen erhalten, nicht überlappende Bereiche. Als Anton Zaviriukhin richtig Punkte, die BucketedTables Dokumentation, CLUSTER VON ist im Grunde zu VERBREITEN, INDEM (wie giesst) plus SORTIEREN, INDEM Sie in jedem Eimer/reducer. Und VERTEILEN, INDEM Sie einfach die hashes und die mods in den Eimer, und während die Hash-Funktion Mai bewahren, um (hash-i > - hash-j falls i > j), mod der hash-Wert nicht.
Hier ist ein besseres Beispiel für die überlappenden Bereiche
http://myitlearnings.com/bucketing-in-hive/
InformationsquelleAutor der Antwort Edi Bice
Cluster ist pro reducer Sortieren, nicht global. In vielen Büchern auch erwähnt wird, falsch oder verwirrend. Es hat insbesondere den Einsatz, wo sagen Sie verteilen jede Abteilung spezifische reducer und dann Sortieren nach name des Mitarbeiters in jeder Abteilung und kümmern sich nicht abt Bestellung von dept ohne den cluster genutzt werden und es mehr durchführen-ant Aufwand verteilt sich zu Reduktionen.
InformationsquelleAutor der Antwort user3423890