如何在Apache Flink中获取分区程序?

时间:2016-10-24 09:20:56

标签: scala partitioning apache-flink

我们正在尝试为Apache Flink创建一个扩展,它使用自定义分区。对于某些运营商,我们希望检查/检索使用过的分区程序。不幸的是,我找不到任何可能在给定的DataSet上执行此操作。我是否遗漏了某些内容或是否有其他解决方法?

我会从这样的事情开始:

class MyPartitioner[..](..) extends Partitioner[..] {..}
[..]
val myP = new MyPartitioner(...)
val ds = in.partitionCustom(myP, 0)

现在从另一个类我想访问分区器(如果已定义)。在Spark中我会用以下方式完成:

val myP = ds.partitioner.get.asInstanceOf[MyPartitioner]

然而,对于Flink,我找不到这种可能性。

EDIT1:

似乎可以使用suggestion of Fabian。但是,有两个限制:

(1)使用Scala时,您必须先检索基础Java DataSet,然后将其转换为PartitionOperator

(2)分区必须是最后一次操作。因此,在设置和获取分区程序之间不能使用其他操作。例如。以下是不可能的:

val in: DataSet[(String, Int)] = ???

val myP = new MyPartitioner()
val ds = in.partitionCustom(myP, 0)
val ds2 = ds.map(x => x)

val myP2 = ds2.asInstanceOf[PartitionOperator].getCustomPartitioner

谢谢你,最诚挚的问候, 菲利普

1 个答案:

答案 0 :(得分:0)

您可以将退回的DataSet投放到PartitionOperator并致电PartitionOperator.getCustomPartitioner()

val in: DataSet[(String, Int)] = ???

val myP = new MyPartitioner()
val ds = in.partitionCustom(myP, 0)

val myP2 = ds.asInstanceOf[PartitionOperator].getCustomPartitioner

请注意

  1. getCustomPartitioner()是一种内部方法(即不属于公共API的一部分),可能会在Flink的未来版本中发生变化。
  2. PartitionOperator也用于其他分区类型,例如DataSet.partitionByHash()。在这些情况下,getCustomPartitioner()可能会返回null