統一批處理流處理——Flink批流一體實現原理

来源:https://www.cnblogs.com/tree1123/archive/2019/09/06/11471441.html
-Advertisement-
Play Games

實現批處理的技術許許多多,從各種關係型資料庫的sql處理,到大數據領域的MapReduce,Hive,Spark等等。這些都是處理有限數據流的經典方式。而Flink專註的是無限流處理,那麼他是怎麼做到批處理的呢? 無限流處理:輸入數據沒有盡頭;數據處理從當前或者過去的某一個時間 點開始,持續不停地進 ...


file

實現批處理的技術許許多多,從各種關係型資料庫的sql處理,到大數據領域的MapReduce,Hive,Spark等等。這些都是處理有限數據流的經典方式。而Flink專註的是無限流處理,那麼他是怎麼做到批處理的呢?

file

無限流處理:輸入數據沒有盡頭;數據處理從當前或者過去的某一個時間 點開始,持續不停地進行

另一種處理形式叫作有限流處理,即從某一個時間點開始處理數據,然後在另一個時間點結束。輸入數據可能本身是有限的(即輸入數據集並不會隨著時間增長),也可能出於分析的目的被人為地設定為有限集(即只分析某一個時間段內的事件)。

file

顯然,有限流處理是無限流處理的一種特殊情況,它只不過在某個時間點停止而已。此外,如果計算結果不在執行過程中連續生成,而僅在末尾處生成一次,那就是批處理(分批處理數據)。

批處理是流處理的一種非常特殊的情況。在流處理中,我們為數據定義滑 動視窗或滾動視窗,並且在每次視窗滑動或滾動時生成結果。批處理則不同,我們定義一個全局視窗,所有的記錄都屬於同一個視窗。舉例來說, 以下代碼表示一個簡單的Flink 程式,它負責每小時對某網站的訪問者計數,並按照地區分組。

val counts = visits   
.keyBy("region")   
.timeWindow(Time.hours(1))   
.sum("visits")

如果知道輸入數據是有限的,則可以通過以下代碼實現批處理。

val counts = visits   
.keyBy("region")   
.window(GlobalWindows.create)   
.trigger(EndOfTimeTrigger.create)   
.sum("visits")

Flink 的不尋常之處在於,它既可以將數據當作無限流來處理,也可以將它當作有限流來處理。Flink 的 DataSet API 就是專為批處理而生的,如下所示。

val counts = visits   
.groupBy("region")   
.sum("visits")

如果輸入數據是有限的,那麼以上代碼的運行結果將與前一段代碼的相同, 但是它對於習慣使用批處理器的程式員來說更友好。

Fink批處理模型

Flink 通過一個底層引擎同時支持流處理和批處理

file

在流處理引擎之上,Flink 有以下機制:

  • 檢查點機制和狀態機制:用於實現容錯、有狀態的處理;

  • 水印機制:用於實現事件時鐘;

  • 視窗和觸發器:用於限制計算範圍,並定義呈現結果的時間。

在同一個流處理引擎之上,Flink 還存在另一套機制,用於實現高效的批處理。

  • 用於調度和恢復的回溯法:由 Microsoft Dryad 引入,現在幾乎用於所有批處理器;
  • 用於散列和排序的特殊記憶體數據結構:可以在需要時,將一部分數據從記憶體溢出到硬碟上;
  • 優化器:儘可能地縮短生成結果的時間。

兩套機制分別對應各自的API(DataStream API 和 DataSet API);在創建 Flink 作業時,並不能通過將兩者混合在一起來同時 利用 Flink 的所有功能。

在最新的版本中,Flink 支持兩種關係型的 API,Table API 和 SQL。這兩個 API 都是批處理和流處理統一的 API,這意味著在無邊界的實時數據流和有邊界的歷史記錄數據流上,關係型 API 會以相同的語義執行查詢,並產生相同的結果。Table API 和 SQL 藉助了 Apache Calcite 來進行查詢的解析,校驗以及優化。它們可以與 DataStream 和 DataSet API 無縫集成,並支持用戶自定義的標量函數,聚合函數以及表值函數。

Table API / SQL 正在以流批統一的方式成為分析型用例的主要 API。

DataStream API 是數據驅動應用程式和數據管道的主要API。

從長遠來看,DataStream API應該通過有界數據流完全包含DataSet API。

Flink批處理性能

MapReduce、Tez、Spark 和 Flink 在執行純批處理任務時的性能比較。測試的批處理任務是 TeraSort 和分散式散列連接。

第一個任務是 TeraSort,即測量為 1TB 數據排序所用的時間。

TeraSort 本質上是分散式排序問題,它由以下幾個階 段組成:

(1) 讀取階段:從 HDFS 文件中讀取數據分區;

(2) 本地排序階段:對上述分區進行部分排序;

(3) 混洗階段:將數據按照 key 重新分佈到處理節點上;

(4) 終排序階段:生成排序輸出;

(5) 寫入階段:將排序後的分區寫入 HDFS 文件。

file

Hadoop 發行版包含對 TeraSort 的實現,同樣的實現也可以用於 Tez,因為 Tez 可以執行通過MapReduce API 編寫的程式。Spark 和 Flink 的 TeraSort 實現由 Dongwon Kim 提供.用來測量的集群由 42 台機器組成,每台機器 包含 12 個 CPU 內核、24GB 記憶體,以及 6 塊硬碟。

file

結果顯示,Flink 的排序時間比其他所有系統都少。 MapReduce 用了2157 秒,Tez 用了1887 秒,Spark 用了2171 秒,Flink 則 只用了 1480 秒。

第二個任務是一個大數據集(240GB)和一個小數據集(256MB)之間的分散式散列連接。結果顯示,Flink 仍然是速度最快的系統,它所用的時間分別是 Tez 和 Spark 的 1/2 和 1/4.

file

產生以上結果的總體原因是,Flink 的執行過程是基於流的,這意味著各個處理階段有更多的重疊,並且混洗操作是流水線式的,因此磁碟訪問操作更少。相反,MapReduce、Tez 和 Spark 是基於批的,這意味著數據在通過網路傳輸之前必須先被寫入磁碟。該測試說明,在使用Flink 時,系統空閑時間和磁碟訪問操作更少。

值得一提的是,性能測試結果中的原始數值可能會因集群設置、配置和軟體版本而異。

因此,Flink 可以用同一個數據處理框架來處理無限數據流和有限數據流,並且不會犧牲性能。

更多Flink相關文章:

穿梭時空的實時計算框架——Flink對時間的處理

Flink快速入門--安裝與示例運行

大數據實時處理的王者-Flink

Flink,Storm,SparkStreaming性能對比

更多實時計算,Flink,Kafka的技術文章歡迎關註實時流式計算

file


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博主負責的項目主要採用阿裡雲資料庫MySQL,最近頻繁出現慢SQL告警,執行時間最長的竟然高達5分鐘。導出日誌後分析,主要原因竟然是**沒有命中索引和沒有分頁處理**。其實這是非常低級的錯誤,我不禁後背一涼,團隊成員的技術水平亟待提高啊。 ...
  • [TOC] 歷時兩天,踩了無數坑最後搭建成功。。。 準備 兩台伺服器都安裝jdk1.8(最好裝在相同路徑)。 "hadoop 下載" "hbase 下載" 這裡使用hadoop 2.7.3和hbase1.2.4 伺服器配置 以下1 3步驟中兩台伺服器都要配置 1、修改hostname 主節點修改成m ...
  • 轉自:http://www.maomao365.com/?p=6740 摘要: 下文講述sqlserver操作中遇到單引號的處理方法sqlserver 資料庫中可以存儲任何字元,因為在資料庫中字元都是以二進位數據的形式存儲在磁碟上,下文講述遇到單引號如何插入至資料庫中。 單引號:因為單引號在sql中 ...
  • 今天做了一個需要用到觸發器實現的功能中間去到了各種問題,還好最後都解決了; 整個過程中真是遇到了不少錯誤: ORA-04091: 表 KPGO.T_ISSUER 發生了變化, 觸發器/函數不能讀它 ORA-04092: COMMIT 不能在觸發器中 ORA-04098:觸發器“xx.xxx”無效且未 ...
  • 昨天重新設置了mysql的密碼 因為之前一直都是不用密碼登錄的 因為是公司資料庫還是要密碼 但是加了密碼我今天打開navicat,連接資料庫,一直報1862 然後再控制台重新設置一下密碼就好了 就可以了 ...
  • oracle資料庫前言 oracle sqllesson1 Selecting Rowslesson2 Sorting & Limiting Selected Rowslesson3 Single Row Functionslesson4 Displaying Data from Multiple ...
  • 1.查找錯誤日誌文件路徑 mysql> show variables like "log_error"; 2.查找日誌文件路徑 mysql> show variables like "general_log_file"; 3.查找慢查詢日誌文件路徑 mysql> show variables lik... ...
  • [mysqld] log_bin = mysql-bin binlog_format = mixed expire_logs_days = 7 # 超過7天的binlog刪除 slow_query_log = 1 long_query_time = 3 # 慢查詢時間 超過3秒則為慢查詢 slow-... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...