簡體   English   中英

Flink自定義分區功能

[英]Flink Custom Partition Function

我在Flink上使用Scala和DataSet API。 我想在節點之間重新划分數據。 Spark有一個函數,允許用戶使用給定的numberOfPartitions參數( 鏈接 )重新分區數據,我相信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”參數。

謝謝。

在弗林克您可以定義setParallelism單個操作員或使用所有運營商enviornment.setParallelism 我希望這個鏈接可以幫到你。

Spark使用repartition(n:Int)函數將數據重新分配到n個分區,這些分區將由n個任務處理。 從我的角度來看,這包括兩個變化:數據重新分配和下游任務的數量。

因此,在Apache Flink中,我認為分區程序映射到數據重新分配,並行性映射到下游任務的數量,這意味着您可以使用setParallelism來確定“numPartitions”。

我假設你正在使用SparseVector的長度只是為了給你一些相對隨機的值來用於分區。 如果這是真的,那么你可以做一個DataSet.rebalance() 如果您通過任何運算符(包括Sink )將其設置為numPartitions ,那么您應該獲得很好的重新分區數據。

但是你對...want to re-partition my data across the nodes的描述...want to re-partition my data across the nodes讓我覺得你正在嘗試將Spark的RDD概念應用到Flink,這不是真正有效的。 例如,假設您有numPartition並行運算符處理DataSet中的(重新分區)數據,那么這些運算符將在可用TaskManagers提供的插槽中運行,並且這些插槽可能位於不同的物理服務器上,也可能不位於不同的物理服務器上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM