2015-12-03 10 views
8

Die Methode sortPartition eines Datasets sortiert das Dataset basierend auf bestimmten Feldern lokal. Wie kann ich meinen großen Datensatz global effizient in Flink sortieren lassen?Globale Sortierung in Apache Flink

Antwort

12

Dies ist derzeit nicht einfach möglich, da Flink noch keine integrierte Bereichspartitionierungsstrategie bietet.

Ein Work-around ist eine benutzerdefinierte zu implementieren Partitioner:

DataSet<Tuple2<Long, Long>> data = ... 
data 
    .partitionCustom(new Partitioner<Long>() { 
    int partition(Long key, int numPartitions) { 
     // your implementation 
    } 
    }, 0) 
    .sortPartition(0, Order.ASCENDING) 
    .writeAsText("/my/output"); 

Hinweis: Um ausgewogene Partitionen mit einem benutzerdefinierten Partitionierer zu erreichen, müssen Sie über den Wertebereich und die Verteilung der Schlüssel wissen .

Unterstützung für einen Bereich Partitionierer (mit automatischer Abtastung) in Apache Flink ist derzeit work in progress und sollte in Kürze verfügbar sein.

Bearbeiten (7. Juni 2016): Bereichspartitionierung wurde zu Apache Flink mit Version 1.0.0 hinzugefügt. Sie können global Art ein Datensatz wie folgt:

DataSet<Tuple2<Long, Long>> data = ... 
data 
    .partitionByRange(0) 
    .sortPartition(0, Order.ASCENDING) 
    .writeAsText("/my/output"); 

Beachten Sie, dass Proben, die die Eingangsdaten eingestellten Bereich Aufteilen einer Datenverteilung für gleich große Partitionen zu berechnen.

+0

1- Wenn wir keinen Einblick in den Datensatz haben, wie können wir ihn partitionieren? 2 angenommen, wir finden einen Weg, dies zu tun. Gibt dieser Befehl ein global sortiertes Dataset aus? –

+0

1) Das ist ein guter Punkt. Wenn Sie einen benutzerdefinierten Partitionierer implementieren, sollten Sie den Wertebereich und die Verteilung des Schlüssels kennen, um ausgeglichene Partitionen zu erzielen. Der Bereichspartitionierer in der verknüpften Pull-Anforderung tastet die Daten automatisch ab, um eine Verteilung zu erhalten. 2) Ja, wenn Sie die Partition partitionieren und jede Partition nach demselben Schlüssel sortieren, wird die Ausgabe global sortiert. –

Verwandte Themen