Flink gelly
What is Gelly?
Neighborhood Aggregations(鄰居聚合)
Iterative Graph Processing
Vertex-centric
MessagingFunction: 給下一個超步傳送的訊息。
VertexUpdateFunction:定義一個節點對收到的訊息如何去處理
operator收到兩個輸入:
the Solution Set: 當前輸入的狀態
the Workset, 圖的一部分在下次迭代中會被重新計算
Vertex Centric迭代計算
Vertex Centric模型,也稱為”像頂點一樣思考”或”Pregel”,通過圖頂點的角度表達計算。 該計算在迭代的每一步(稱為超步)中同步地處理,在每個超步時,每個頂點執行一個UDF(User Defined Function)。 頂點之間通過訊息進行通訊,任何一個頂點可以給圖中任何其他的頂點傳送訊息,只要知道它的ID即可。
下面的圖中展示該計算模型,虛線框和並行單元對應。在每個超步中,所有的活躍頂點並行執行相同的使用者定義的計算。因為超步時同步執行的,因此每次超步中傳送的訊息都被保證傳送了到下次超步的開始。
在Gelly中使用Vertex Centric迭代,使用者只需要定義頂點的計算函式ComputeFunction即可。
該函式和最大迭代次數通過Gelly的runVertexCentricIteration函式引數指定。該方法在輸入圖上執行Vertex Centric迭代計算,並輸出更新後頂點值的新圖。可選的MessageCombiner函式可以被用於減少通訊消耗。
讓我們考慮基於Vertex Centric的單源點最短路徑演算法(SSSP)。演算法開始時,除了源頂點初始值為0,每個頂點初始值為正無窮。第一次超步計算時,源頂點將距離傳播給它的鄰居。在接下來的超步中,每個頂點檢查接收的訊息並選擇其中最小的距離值。如果該距離值比頂點當前值小,則更新頂點的值,併產生訊息傳送給其鄰居。如果頂點在超步中沒有更新它的值,則在下次超步時不會傳送任何訊息給它的鄰居。當沒有頂點的值發生更新或者達到了最大的超步迭代次數,演算法將會收斂。在這個演算法中,Message Combiner可以被用來減少傳送給目標頂點的訊息個數。
// 構建圖
Graph<Long, Double, Double> graph = ...
// 最大迭代次數
int maxIterations = 10;
// 執行vertex-centric iteration
Graph<Long, Double, Double> result = graph.runVertexCentricIteration(
new SSSPComputeFunction(), new SSSPCombiner(), maxIterations);
// 抽取結果
DataSet<Vertex<Long, Double>> singleSourceShortestPaths = result.getVertices();
//使用者定義函式
public static final class SSSPComputeFunction extends ComputeFunction<Long, Double, Double, Double> {
public void compute(Vertex<Long, Double> vertex, MessageIterator<Double> messages) {
double minDistance = (vertex.getId().equals(srcId)) ? 0d : Double.POSITIVE_INFINITY;
for (Double msg : messages) {
minDistance = Math.min(minDistance, msg);
}
if (minDistance < vertex.getValue()) {
setNewVertexValue(minDistance);
for (Edge<Long, Double> e: getEdges()) {
sendMessageTo(e.getTarget(), minDistance + e.getValue());
}
}
}
// 訊息合併
public static final class SSSPCombiner extends MessageCombiner<Long, Double> {
public void combineMessages(MessageIterator<Double> messages) {
double minMessage = Double.POSITIVE_INFINITY;
for (Double msg: messages) {
minMessage = Math.min(minMessage, msg);
}
sendCombinedMessage(minMessage);
}
}
參考:
http://flink.iteblog.com/dev/libs/gelly/iterative_graph_processing.html#vertex-centric-1
相關文章
- [Flink/FlinkCDC] 實踐總結:Flink 1.12.6 升級 Flink 1.15.4
- [Flink] Flink 版本特性的演進
- 【Flink】Flink 底層RPC框架分析RPC框架
- flink實戰--讀寫Hive(Flink on Hive)Hive
- 【Flink】深入理解Flink-On-Yarn模式Yarn模式
- flink快速入門(部署+flink-sql)SQL
- Flink模式模式
- Flink - Watermark
- Flink APIAPI
- Flink SideOutPutLateEventCustomIDE
- Flink 1.16:Hive SQL 如何平遷到 Flink SQLHiveSQL
- Flink-Kafka-Connector Flink結合Kafka實戰Kafka
- Flink Operations Playground #
- FLINK CDC同步
- flink調優
- Flink漫談
- Flink簡介
- flink CEP示例
- Flink 入門
- flink table apiAPI
- Flink實戰
- [Flink/CDC/資料整合] 資料增量整合方案:Flink CDC
- 【Flink】基於 Flink 的流式資料實時去重
- 【Flink入門修煉】2-2 Flink State 狀態
- Flink Forward k8s相關(1)--Flink部署方式ForwardK8S
- Flink狀態(一)
- FLINK CDC部署同步
- 聊聊flink水位線
- apache flink 簡介Apache
- Flink域名處理
- Flink kuduSink開發
- Flink狀態妙用
- Flink SQL Client初探SQLclient
- Flink CDC實戰
- flink window詳解
- 聊聊flink的ParallelIteratorInputFormatParallelORM
- 聊聊flink的SourceFunctionFunction
- Spark Streaming VS FlinkSpark