Flink批处理优化器之数据属性
在一段時間之前我們已介紹過IP(Interesting Property)對于優化器的意義以及它將對優化器的優化決策產生的影響。本篇我們將介紹Flink的批處理優化器中涉及到的所有的IP,我們將其統稱為數據屬性。后續我們會介紹Flink如何為優化器節點計算IP,并在之后的“剪枝”(pruning)階段發揮作用。
數據屬性
數據屬性是個統稱,來自于Flink優化器模塊定義的子包名:dataproperties,需要注意的是這里屬性的含義不是代碼實現層面上類里的屬性,而是指代對優化器的優化決策產生影響的一種指標。所以這里的屬性對應到代碼中的類。總體而言,有兩類屬性:
- 本地屬性:用于表述對本地處理的任務(如,排序)產生影響的屬性;
- 全局屬性:用于表述對跨分區的數據傳輸(如,廣播、哈希分區等)產生影響的屬性;
再結合是否不可或缺,又可進一步細分為:
- LocalProperties:本地屬性;
- GlobalProperties:全局屬性;
- RequestedLocalProperties:必不可少的本地屬性,是本地屬性的子集,一旦缺少會導致對程序錯誤地優化并返回錯誤的結果;
- RequestedGlobalProperties:必不可少的全局屬性,是全局屬性的子集,一旦缺少會導致對程序錯誤地優化并返回錯誤的結果;
另外的兩個額外的屬性:
- InterestingProperties:它就是我們常說的IP,是一個屬性容器類,包含了一系列的RequestedLocalProperties和RequestedGlobalProperties集合。IP將直接對優化器尋找最優計劃產生影響,它將會從父運算符傳遞給子運算符(以sink為頂點的倒置的遍歷樹),并告知子運算符哪些屬性可以幫助它獲得最廉價的執行方案。例如,一個Reduce運算符,將告訴其子運算符分區信息,如果子運算符是join,那么它將根據獲得的信息,保留數據分區形式并選擇更合適的執行策略。
- PartitioningProperty:分區屬性,枚舉了所有被支持的分區類型;
以上這些屬性類之間的關聯關系如下圖所示:
接下來我們會對以上這些屬性類中的關鍵字段進行解讀。
- LocalProperties
| ordering(*) | Ordering | 一個分區內部的排序方式 |
| groupedFields(*) | FieldList | 用于分組的字段集 |
| uniqueFields | Set<FieldSet> | 在合并時值唯一的字段 |
* GlobalProperties
| partitioning(*) | PartitioningProperty | 表示分區類型的屬性 |
| partitioningFields(*) | FieldList | 分區的字段 |
| ordering(*) | Ordering | 如果分區方式為范圍分區,該字段表示分區字段的排序順序 |
| uniqueFieldCombinations | Set<FieldSet> | 在合并時值唯一的字段 |
| customPartitioner(*) | Partitioner<?> | 當partitioning指定為CUSTOM_PARTITIONING時,使用的分區器 |
| distribution(*) | DataDistribution | 數據分布對象,當分區類型為RANCE_PARTITION時需要設置 |
上面兩個表格中,被標記為”*”的屬性,就是RequestedLocalProperties和RequestedGlobalProperties中的屬性。
而InterestingProperties由RequestedLocalProperties以及RequestedGlobalProperties屬性集合組成:
| localProps | Set<RequestedLocalProperties> | 必備的本地屬性集合 |
| globalProps | Set<RequestedGlobalProperties> | 必備的全局屬性集合 |
PartitioningProperty類枚舉了跨分區或并行工作節點之間數據的shuffle形式:
- ANY_DISTRIBUTION:任何可能的數據分布形式,包括隨機分區和完全復制;
- RANDOM_PARTITION:一種隨機性的非復制型的數據分布方式;
- HASH_PARTITION:基于給定鍵的哈希分區方式;
- RANGE_PARTITION:基于特定鍵的范圍分區方式;
- ANY_PARTITIONING:不在鍵上指定明確的分區方式;
- FULL_REPLICATION:將數據完全復制到每個并行的實例上去;
- FORCED_REBALANCED:強制重平衡,盡量保證每個分區上數據記錄的均等;
- CUSTOM_PARTITIONING:自定義分區,可通過分區器(Partitioner)指定;
對于這些枚舉值,哪些是事實上真正意義的分區呢?PartitioningProperty提供了一個isPartitioned方法來進行判斷:
public boolean isPartitioned() { return this != FULL_REPLICATION && this != FORCED_REBALANCED && this != ANY_DISTRIBUTION; }從代碼段中可見,非FULL_REPLICATION、非FORCED_REBALANCED以及非ANY_DISTRIBUTION,其余的都被認為是真正意義上的分區。
原文發布時間為:2017-04-09 本文作者:vinoYang 本文來自云棲社區合作伙伴CSDN博客,了解相關信息可以關注CSDN博客。
總結
以上是生活随笔為你收集整理的Flink批处理优化器之数据属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP生产订单管理与分析实例
- 下一篇: Spine 2D animation f