我用Awesome-Graphs看論文:解讀Naiad

来源:https://www.cnblogs.com/fanzhidongyzby/p/18332138/naiad
-Advertisement-
Play Games

這次向大家分享Microsoft發表在SOSP'13的另一篇關於流處理系統論文Naiad,TimelyDataflow是它的開源實現。該論文促進了後續的流圖系統的設計與創新,從其調度框架設計中也可以看到TuGraph Analytics調度器的影子。 ...


Naiad論文《Naiad: A Timely Dataflow System》

前面通過文章《論文圖譜當如是:Awesome-Graphs用200篇圖系統論文打個樣》向大家介紹了論文圖譜項目Awesome-Graphs,並分享了Google的Pregel、OSDI'12的PowerGraph、SOSP'13的X-Stream。這次向大家分享Microsoft發表在SOSP'13的另一篇關於流處理系統論文Naiad,TimelyDataflow是它的開源實現。該論文促進了後續的流圖系統的設計與創新,從其調度框架設計中也可以看到TuGraph Analytics調度器的影子。

對圖計算技術感興趣的同學可以多做瞭解,也非常歡迎大家關註和參與論文圖譜的開源項目:

提前感謝給項目點Star的小伙伴,接下來我們直接進入正文!

摘要

Naiad是一個可執行有環數據流的分散式數據並行系統,提供了高吞吐的批處理、低延遲的流處理,以及迭代和增量計算的能力。

1. 介紹

支持特性:

  • 迴圈結構化,支持反向邊(feedback)。
  • 有狀態的數據流節點,支持無需全局協調的生產消費能力。
  • 節點收齊特定輪次/迭代的輸入後的通知機制。

2. 及時數據流

數據流圖可以包含嵌套的迴圈結構,時間戳用於區分數據是由哪個輪次/迭代產生的。

2.1 圖結構

及時數據流圖包含輸入/輸出節點,輸入節點從外部的生產者接受消息序列,輸出節點將消息序列發送到外部消費者。
外部的生產者為每個消息打標了一個輪次(epoch),當沒有消息需要輸入時,會主動通知輸入節點。
生產者也可以關閉輸入節點,表示輸入節點將不會再收到任何消息。
輸出節點的消息也會打標這個輪次,同樣當沒有消息需要輸出時,也會通知外部消費者。

及時數據流圖裡可以包含嵌套的迴圈上下文(loop contexts):

  • 入口點(ingress vertex):數據流圖的邊進入迴圈上下文必須經過入口點,如I。
  • 出口點(egress vertex):數據流圖的邊離開迴圈上下文必須經過出口點,如E。
  • 反饋點(feedback vertex):迴圈上下文內必須包含反饋點,如F。


針對上圖所表達的計算語義解釋:

關鍵概念:邏輯時間戳(logical timestamp):

  • e:消息的輪次。
  • k:迴圈嵌套的深度。
  • c:向量,每層迴圈的迭代次數。


邏輯時間戳變化規則:

  • 經過入口點:c增加一個維度,初始化為0,表示迴圈開始。
  • 經過反饋點:c的最後一個維度+1,表示迴圈次數累計。
  • 經過出口點:c的最後一個維度提出,恢覆成與入口點一致。

邏輯時間戳大小比較,t1=(e1, <c1, ..., cm>),t2=(e2, <c1, ..., cn>):

  • 條件1:整數比較,e1 < e2。
  • 條件2:字元串比較,c1 + ... + cm < c1 + ... + cn。

2.2 節點計算

數據流的節點可以接收、發送帶邏輯時間戳的消息(message),以及通知(notification)。

每個節點v實現兩個回調函數:

  1. v.OnRecieve(Edge e, Message m, Timestamp t):接收消息。
  2. v.OnNotify(Timestamp t):接收通知。

並可以調用系統提供的兩個函數:

  1. this.SendBy(Edge e, Message m, Timestamp t):發送消息。
  2. this.NotifyAt(Timestamp t):發送通知。

對於數據流邊e=(u, v),u.SendBy將觸發v.OnRecieve,u.NotifyAt將觸發v.onNotify。
數據流系統保證v.OnNotify(t)一定發生在v.OnRecieve(e, m, t')之後,其中t' < t,即保證處理完所有t之前的消息後再處理通知,以讓節點具備機會清理t之前的工作狀態。
這種機制保證了消息處理不會發生時光回溯(backwards in time)。

如下示例代碼描述了一個雙出的數據流節點實現distinct、count運算元的邏輯。

class DistinctCount<S,T> : Vertex<T>
{
    Dictionary<T, Dictionary<S,int>> counts;
    void OnRecv(Edge e, S msg, T time)
    {
        if (!counts.ContainsKey(time)) {
            counts[time] = new Dictionary<S,int>();
            this.NotifyAt(time);
        }
        if (!counts[time].ContainsKey(msg)) {
            counts[time][msg] = 0;
            this.SendBy(output1, msg, time);
        }
        counts[time][msg]++;
    }
    void OnNotify(T time)
    {
        foreach (var pair in counts[time])
        this.SendBy(output2, pair, time);
        counts.Remove(time);
    }
}

2.3 實現及時數據流

數據流處理受限於未處理的事件(events:消息、通知)和數據流圖的結構。

關鍵概念:pointstamp:

  • u.SendBy(e, m, t):生成pointstamp (t, e)。
  • u.NotifyAt(t):生成pointstamp (t, v)。

單線程調度器實現:

  • 維護一個激活pointstamp(active pointstamp) 集合,集合大小至少為1。對於每個pointstamp,有兩個計數器:
    • OC(occurrence count):未完成的pointstamp數。
    • PC(precursor count):上游激活的pointstamp數。
  • 系統初始化時,為輸入節點生成第一個pointstamp,其中t=e,OC=1,PC=0。當e完成後,繼續生成t=e+1的pointstamp。
  • 當激活pointstamp p時,初始化PC為上游所有激活的pointstamp數,並遞增下游節點所有pointstamp的PC值。
  • 當OC[p]=0時,從active集合刪除p,並遞減下游節點所有pointstamp的PC值。
  • 當PC[p]=0時,表示上游沒有激活的pointstamp影響到p,則稱p是frontier,調度器會把所有通知發送給frontier。

OC的計算規則為:

3. 分散式實現

  • Naiad集群包含多個進程,每個進程包含多個worker,worker管理數據流節點的一個分區。
  • worker之間通過本地的共用記憶體或者遠程TCP連接交換消息。
  • 進程遵循分散式進度追蹤協議(Progress Tracking Protocol),用於協調通知的分發。

3.1 數據並行

  • 邏輯數據流圖:stages+connectors。
  • connectors包含一個分區函數。
  • 運行時邏輯數據流圖被展開為物理數據流圖,stage被替換為一組節點,connectors被替換為一組邊。

3.2 Workers

  • 分發消息優先於分發通知。
  • 分發策略多樣,如基於最早的pointstamp分發降低端到端延遲。
  • worker使用共用隊列進行通信。
  • 如果分發的目標節點在同一個worker,那麼SendBy會直接調用目標節點的OnRecieve。
  • 如果存在環則需要強制進入隊列,或者控制遞歸深度避免系統過載。

3.3 分散式進度追蹤

  • 每個worker維護各自的狀態,通過廣播OC進行狀態共用。
  • 優化手段:
    • 使用映射的pointstamp實現進度跟蹤,以降低併發衝突和更新規模。
    • 更新廣播前先進行本地聚合。

3.4 錯誤容忍和可用性

  • Checkpoint和Restore介面。

3.5 預防抖動

  • 網路。
  • 數據結構競爭。
  • 垃圾回收。

4. 使用Naiad寫程式

5. 性能評估

6. 現實應用

  • 批量迭代圖計算
  • 批量迭代機器學習
  • 流式無環計算
  • 流式迭代圖分析

7. 總結

Naiad通過允許程式按需協調,支持了混合的同步+非同步計算。

作者:Florian 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則作者保留追究法律責任的權利。
若本文對你有所幫助,您的 關註 推薦 是我分享知識的動力!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文節選自清華大學出版社出版的圖書《數據資產管理核心技術與應用》,作者為張永清等著。 從Spark 執行計劃中獲取數據血緣 因為數據處理任務會涉及到數據的轉換和處理,所以從數據任務中解析血緣也是獲取數據血緣的渠道之一,Spark 是大數據中數據處理最常用的一個技術組件,既可以做實時任務的處理,也可以 ...
  • 本文分享自天翼雲開發者社區《redis漸進式rehash》,作者:l****n Redis是k-v型資料庫,其內部設計了一種dict類型的數據結構用來存儲鍵值結構。 dict 通常的存儲結構是 Key-Value 形式的,通過 Hash 函數對 key 求 Hash 值來確定 Value 的位置,因 ...
  • 《數據資產管理核心技術與應用》是由清華大學出版社出版的一本圖書,該圖書主要特點如下: 1、依托於大數據技術,獨家解密數據血緣的底層技術實現 2、詳解數據資產管理的知識體系和核心技術 3、應用元數據管理和數據建模技術,充分發揮出數據資產的更大潛力和價值。 4、全書從元數據、數據血緣、數據質量、數據服務 ...
  • 因為在工作中需要推動Apache DolphinScheduler的升級,經過預研,從1.3.4到3.1.2有的體驗了很大的提升,在性能和功能性有了很多的改善,推薦升級。 查看官方的升級文檔,可知有提供升級腳本,如果只是跨小版本的更新那麼只用執行腳本就好了,但跨多個大版本升級時依然容易出現各種問題, ...
  • 近日,2024可信資料庫發展大會在北京召開,主題為“自主、創新、引領”。大會重磅發佈多項中國信通院及中國通信標準化協會大數據技術標準推進委員會(CCSA TC601)在資料庫領域最新研究和實踐成果。一眾資料庫領域的專家、學者、創業者匯聚一堂,圍繞金融、電信、能源與政務領域的資料庫應用創新帶來切實的落... ...
  • 最近我們遇到很多客戶需求是把Talend遷移到WhaleStudio,主要是發現WhaleStudio支持的數據源多很多,從各個版本的SAP到AWS Redshift,S3,從MangoDB CDC到 Neo4J甚至各種國產信創數據源,可謂應有盡有。同時,客戶發現WhaleStudio同步效率比Ta ...
  • 這次向大家分享一篇流圖處理系統論文GraphBolt,看如何基於計算曆史的方式實現增量圖計算,並保證與全量圖計算語義的一致性。 ...
  • 寫在前面 今天繼續前面的20題之後的練習,數據都是一樣的,可以直接使用,來看看你的sql功底降了沒。 基礎20題 #1.查詢每個員⼯的姓名、郵箱、職位名稱以及所在部⻔名稱。 SELECT CONCAT(last_name,first_name) as 姓名, email, job_title, de ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...