Flink自定义分区功能

时间:2019-01-14 23:01:25

标签: scala apache-flink partitioning data-partitioning

我正在通过DataSet API在Flink上使用Scala。 我想在节点之间重新划分数据。 Spark具有让用户使用给定的numberOfPartitions参数(link)重新分区数据的功能,我相信Flink不支持该功能。 因此,我想通过实现自定义分区功能来实现这一目标。

我的数据类型为DataSet(Double,SparseVector) 数据中的示例行:

(1.0 SparseVector((2024,1.0), (2025,1.0), (2030,1.0), (2045,1.0), (2046,1.41), (2063,1.0), (2072,1.0), (3031,1.0), (3032,1.0), (4757,1.0), (4790,1.0), (177196,1.0), (177197,0.301), (177199,1.0), (177202,1.0), (1544177,1.0), (1544178,1.0), (1544179,1.0), (1654031,1.0), (1654190,1.0), (1654191,1.0), (1654192,1.0), (1654193,1.0), (1654194,1.0), (1654212,1.0), (1654237,1.0), (1654238,1.0)))

由于我的“ Double”是二进制(1或-1),因此我想根据SparceVector的长度对数据进行分区。 我的自定义分区程序如下:

class myPartitioner extends Partitioner[SparseVector]
{ 
    override def partition(key: SparseVector, numPartitions: Int): Int = {
         key.size % numPartitions
    } 
}

我将这个自定义分区称为:

data.partitionCustom(new myPartitioner(),1)

在Scala中调用myPartitioner函数时,是否可以有人帮助我了解如何将分区数指定为“ numPartitions”参数。

谢谢。

3 个答案:

答案 0 :(得分:3)

在flink中,您可以为单个运算符或使用setParallelism的所有运算符定义enviornment.setParallelism。我希望这个link能为您提供帮助。

答案 1 :(得分:1)

Spark使用repartition(n:Int)函数将数据重新分配到n个分区中,这将由n个任务处理。在我看来,这包括两个更改:数据重新分配和下游任务的数量。

因此,在Apache Flink中,我认为Partitioner映射到数据重新分配,而并行性映射到下游任务的数量,这意味着您可以使用setParallelism确定“ numPartitions”。

答案 2 :(得分:1)

我假设您使用SparseVector的长度只是为了给您一些相对随机的值以用于分区。如果是这样,那么您只需执行DataSet.rebalance()。如果您遵循任何将并行度设置为Sink的运算符(包括numPartitions),那么您应该得到很好的重新分区数据。

但是您对...want to re-partition my data across the nodes的描述使我认为您正在尝试将Spark的RDD的概念应用于Flink,这实际上是无效的。例如。假设您有numPartition个并行运算符在处理DataSet中的(重新分区的)数据,那么这些运算符将在可用TaskManager提供的插槽中运行,并且这些插槽可能在也可能不在其他物理服务器上。 / p>