2015-12-03 10 views
8

データセットのsortPartitionメソッドは、指定されたいくつかのフィールドに基づいてデータセットをローカルにソートします。 Flinkで大規模なデータセットを効率的に並べ替えるにはどうすればよいですか?Apache Flinkでのグローバルソート

答えて

12

Flinkは組み込みレンジ分割戦略をまだ提供していないため、これは現在簡単には実現できません。

この問題を回避するには、カスタム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"); 

は注意:カスタムパーティショナとバランスの取れたパーティションを達成するために、キーの値の範囲と分布について知っておく必要があります。

Apache Flinkでレンジ・パーティショニング(自動サンプリングあり)のサポートは現在work in progressであり、すぐに利用可能になります。

編集(2016年6月7日):バージョン1.0.0のApache Flinkにレンジ分割が追加されました。次のようにグローバルにソートデータを設定することができますサンプルに等しいサイズのパーティションのデータ分布を計算するために設定された入力データを分割範囲

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

注意。

+0

1-データセットについての洞察がない場合、どのようにパーティションを分割できますか? 2-私たちはそうする方法を見つけると仮定します。このコマンドはグローバルソートされたデータセットを出力しますか? –

+0

1)それは良い点です。カスタムパーティショナーを実装する場合は、バランスの取れたパーティションを実現するためのキーの値の範囲と分布について知っておく必要があります。リンクされたプル要求内の範囲パーティショナーは、自動的にデータをサンプリングして配布を取得します。 2)はい、パーティションを範囲指定し、各パーティションを同じキーにソートすると、出力はグローバルにソートされます。 –

関連する問題