轉載本文需註明出處:微信公眾號EAWorld,違者必究。
本文介紹了 SparkSQL 和 Flink 對於批流支持的特性以及批流一體化支持框架的難點。在介紹批流一體化實現的同時,重點分析了基於普元 SparkSQL-Flow 框架對批流支持的一種實現方式。希望對大家的工作有所幫助,也希望能對 DatasetFlow 模型作為框架實現提供一些啟發。
目錄:
1.SparkSQL 和 Flink 對於批流支持的特性介紹
2.基於SparkSQL-Flow的批量分析框架
3.基於SparkStreaming SQL模式的流式處理支持
4.對於批流一體化ETL的思考
一、SparkSQL 和 Flink
對於批流支持的特性介紹
關於流和批的一些爭論
對於廣泛使用的Spark和新秀Flink,對於批和流實現方式上,以及在論壇和一些文章上,對批和流都有不同看法。批是流的特例 還是 流是批的特例?
1.從批的角度看,流是多個批次一份一份的進行。無限個這樣批次構成整個流處理流程,類如SparkStreaming的處理模式;
2.從流的角度看,批是流的有限流處理。它只不過在某個時間點,完成某個條件停止了而已;類如 Flink 的處理模式;
Spark 和 Flink 都具有流和批處理能力,但是他們的做法是截然相反。Spark Streaming是把流轉化成一個個小的批來處理,這種方案的一個問題是我們需要的延遲越低,額外開銷佔的比例就會越大,這導致了Spark Streaming很難做到秒級甚至亞秒級的延遲。Flink是把批當作一種有限的流,這種做法的一個特點是在流和批共享大部分代碼的同時還能夠保留批處理特有的一系列的優化。數據倉庫早期以及大數據早期都是從批處理開始的,所以很多系統都是從批處理做起,包括Spark。在批處理上Spark有著較深的積累,是一個比較優秀的系統。隨著技術的發展,很多原來只有批處理的業務都有了實時的需求,流處理將會變得越來越重要,甚至成為一些數據分析的主要場景,如實時管控、預警相關。
Spark 和 Flink 的異同點
Flink 早期僅支持流式處理,這幾年的Flink無論從API組織,還是運行方式,還是多樣性都越來越像Spark。
批和流是數據融合的兩種應用形態
傳統的數據融合通常基於批模式。在批的模式下,我們會通過一些周期性運行的ETL JOB,將數據從關係型資料庫、文件存儲向下遊的目標資料庫進行同步,中間可能有各種類型的轉換。
與批模式相比相比, 其最核心的區別是將批量變為實時:輸入的數據不再是周期性的去獲取,而是源源不斷的來自於業務的日誌、消息隊列的消息。進而通過一個實時計算引擎,進行各種聚合運算,產生輸出結果,並且寫入下遊。Spark 和 Flink 都能夠支持批和流兩種概念。只不過像 Flink,其原生就是為流而生,所以在流處理上更自然。
Spark 是有太多包袱,Spark 最早採用 RDD 模型,達到比 MapReduce 計算快 100 倍的顯著優勢,對 Hadoop 生態大幅升級換代。RDD 彈性數據集是分割為固定大小的批數據,自動容錯、位置感知、本地計算、可調度可伸縮等眾多重要特性。RDD 提供了豐富的底層 API 對數據集做操作,為持續降低使用門檻,Spark 社區開始開發高階 API:DataFrame/DataSet,Spark SQL 作為統一的 API,掩蓋了底層,同時針對性地做 SQL 邏輯優化和物理優化。Spark 早期的主要目標是替代 MapReduce,MapReduce 是大數據批處理的核心模型。
二、基於SparkSQL-Flow的
分析框架
何為 SparkSQL-Flow
1.一個由普元技術部提供的基於 SparkSQL 的開發模型;
2.一個可二次定製開發的大數據開發框架,提供了靈活的可擴展 API;
3.一個提供了 對文件,資料庫,NoSQL、流處理等統一的數據開發模式;
4.基於 SQL 的開發語言和 XML 的模板配置,支持 SparkSQL UDF 的擴展管理;
5.支持基於 Spark Standlone,Yarn,Mesos 資源管理平臺;
6.支持多種平臺Kerberos認證(開源、華為、星環)等平臺統一認證;
SparkSQL Flow XML 概覽
用戶只需要定義 Source,Transformer,Target 幾個核心組件:
1.Source 數據源:支持Data、DB、File、NoSQL、MQ 等眾多源;
2.Transformer 為上述定義的數據源和已有的Transformer 間的組合操作,一般為SQL;
3.Target 為輸出目標,支持show、DB、File、NoSQL、MQ 等眾多目標,支持類型基本和源相同;
4.用戶可以在Properties定義一些變量,作為Source/Transformer/Target 的宏替換;
SparkSQL Flow 適合的場景
1.批量 ETL;
2.非實時分析服務;
3.流式 ETL;
支持從多種獲得數據源:
1.支持文件:JSON、TextFile(CSV)、ParquetFile、AvroFile
2.大數據:Hive、HDFS
3.支持RDBMS資料庫:PostgreSQL、 MySQL、Oracle
4.支持 NOSQL 資料庫:Hbase、MongoDB、Redis
5.Streaming:JMS、AMQP、Kafka、Socket
三、基於SparkStreaming
SQL模式的流式處理支持
SparkSQL-Flow 流式處理支持
ALL in SQL 的設計,能給數據開發人員提供極大方便,複雜SQL的表達能力也不弱。
SparkSQL-Flow 流式處理和批處理的配置沒什麼不同,定義一個流式 Source,如Kafka。流或批模式是由 Source 的實現決定。SparkSQL-Flow 在加載底層 SPI 來識別該 Source 是 Streaming 模式,還是批處理模式。加載時,配置的 Source 中有任意一個是 Streaming 類型,則認為是流處理模式。
SparkSQL-Flow流處理過程中的關聯
在 ETL 或者一些實時流處理中,我們常常需要對數據做一些關聯,如字典表關聯、欄位轉義等操作。這在 數據處理業務場景中很常見。
我們在 Flow XML 中定義多個Source,這樣在流處理過程中,流可以在任意 Transformer 中關聯其他 Source 表中的欄位。另外,我們可以對作為關聯的 Source(Transformer的結果亦可) 做 cache 處理,這樣根據 Spark 的模式,該表處於內存中,且整個Job 運行時不會再次觸發該Source 的 Stage,可以提高性能。
除了使用 Select ... Join 的方式關聯,還可以使用自定義 UDF 的方式關聯欄位,UDF 中可以有轉換、調用資料庫、可以調用 RESTApi 等等。
四、對於批流一體化ETL的思考
Kettle ETL 工具
提到 ETL 不得不提 Kettle。批、流、數據源、多樣性 大多數設計的ETL工具在他面前都相形見絀。
Kettle 作業是生成了一個 dbr 文件,該 dbr 本質上是 Kettle 支持的特有規範的一種 XML,Kettle 是實現了執行該 XML 規範的一種解釋器。
但是 Kettle 的缺點很明顯,他的數據處理都是 Local 模式,對於大數據系統,把數據拉到運行節點再計算缺陷是很明顯的。並且作業無法並行化,雲化,無法利用大規模集群的算力。
DataX
DataX 是阿里開源的一個異構數據源離線同步工具,致力於實現包括關係型資料庫(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各種異構數據源之間穩定高效的數據同步功能。
DataX設計理念
DataX本身作為數據同步框架,將不同數據源的同步抽象為從源頭數據源讀取數據的Reader插件,以及向目標端寫入數據的Writer插件,理論上DataX框架可以支持任意數據源類型的數據同步工作。同時DataX插件體系作為一套生態系統, 每接入一套新數據源該新加入的數據源即可實現和現有的數據源互通。
DataX 理論上也支持流處理,不過他的處理方式跟 Spark 類似,流是當做無限的批來處理。如果了解SpringBatch的話,DataX 更像是多線程的 SpringBatch 的架構。DataX 沒有提供設計器,他提供了豐富的Reader和Writer和易擴展的插件系統。和 Kettle一樣,DataX 也需要把數據拉到本地計算,並不具有分布式處理能力。
理想中的批流一體ETL
具有如 Kettle 般的算子表達能力,又具有完全的大數據處理能力。
SparkSQL-Flow 是基於Spark架構,天生具有分布式、本地計算、完全SQL開發的批流一體化計算框架。
數據中臺之批流融合框架和產品
框架、計算平臺:
1.Spark
2.Flink
3.Datax
4.SparkSQL-Flow
相關產品:
1.DataWorks
2.DataPipeline
DataWorks: DataWorks(數據工場,原大數據開發套件)是阿里雲重要的PaaS(Platform-as-a-Service)平臺產品,為您提供數據集成、數據開發、數據地圖、數據質量和數據服務等全方位的產品服務,一站式開發管理的界面,幫助企業專注於數據價值的挖掘和探索。
DataPipeline: 批流一體的數據融合平臺 .主要用於各類數據融合、數據交換場景。支持大數據、分布式、水平擴展、圖形化設計器的數據交換平臺。
SparkSQL-Flow實現了一個以SparkSQL為基礎,以XML為載體的一種批流解釋器。在國內某大型保險內供數項目所使用。大大減少了Spark程序開發難度,並且有預留了Spark原生優化。且以SQL的方式開發數據大大降低了業務梳複雜度以及保證了供數、驗數算法口徑的一致性。
關於作者:震秦,普元資深開發工程師。專注於大數據開發 8 年,擅長 Hadoop 生態內各工具的使用、優化和部分定製開發。曾參與國內多省市公安項目實施,負責大數據數倉設計、批處理和調度工具實現。