Apache Flink 中的全局排序

Global sorting in Apache Flink

数据集的sortPartition方法根据一些指定的字段在本地对数据集进行排序。如何在 Flink 中以高效的方式对大型数据集进行全局排序?

目前这不太容易实现,因为 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");

注意:为了使用自定义分区器实现均衡分区,您需要了解key的取值范围和分布。

目前 work in progress 支持 Apache Flink 中的范围分区器(自动采样),应该很快就会可用。

编辑(2016 年 6 月 7 日):范围分区已添加到 Apache Flink 版本 1.0.0。您可以按如下方式对数据集进行全局排序:

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

请注意,范围分区对输入数据集进行采样以计算大小相等的分区的数据分布。