天天看點

全面對比,深度解析 Ignite 與 Spark

經常有人拿 Ignite 和 Spark 進行比較,然後搞不清兩者的差別和聯系。Ignite 和 Spark,如果籠統歸類,都可以歸于記憶體計算平台,然而兩者功能上雖然有交集,并且 Ignite 也會對 Spark 進行支援,但是不管是從定位上,還是從功能上來說,它們差别巨大,适用領域有顯著的差別。本文從各個方面對此進行對比分析,供各位技術選型參考。

一、綜述

Ignite 和 Spark 都為 Apache 的頂級開源項目,遵循 Apache 2.0 開源協定,經過多年的發展,二者都已經脫離了單一的技術元件或者架構的範疇,向着多元化的生态圈發展,并且發展速度都很快。

Ignite

Ignite 技術來源于 GridGain 公司的商業産品,于 2014 年将絕大部分功能捐贈給 Apache 社群,并于 2015 年 8 月畢業成為 Apache 的頂級項目。Ignite 目前一直保持着高強度的快速疊代式開發,基本一個季度釋出一個大版本,從送出數量、版本釋出數量等若幹名額來評估,一直保持在 Apache 社群 300 多個開源項目的前五位。目前已經聚攏了來自多家組織或公司的衆多開發者,處于非常活躍的狀态,開發者社群和産品生态正在形成中。

Spark

作為 Hadoop 生态圈重要成員的 Spark 于 2009 年由 Matei Zaharia 在加州大學伯克利分校 AMPLab 開發,于 2013 年 6 月捐贈給 Apache 基金會并切換協定至 Apache2.0,2014 年 2 月畢業成為 Apache 的頂級項目。鑒于 Spark 核心計算模型的先進性,它吸引了衆多大企業群組織的積極參與,促成了 Spark 的高速發展和社群的空前繁榮,随着 Spark 技術不斷地向縱深發展以及向外延伸,形成了龐大的 Spark 社群和生态圈,目前幾乎成為了大資料領域影響力最大的開源項目。

二、定位

Ignite 和 Spark 都是分布式架構,都歸類于目前的大資料技術類别,二者都是利用大量記憶體的高性能,為原有的技術方案進行提速,但是定位差别很大。

Ignite

Ignite 的核心定位是一個分布式的記憶體緩存解決方案,通過将資料儲存在記憶體中,提供比傳統的基于磁盤的方案更快的性能。然後在分布式緩存的基礎上,一方面進一步深入,通過标準 SQL 功能的引入,向分布式記憶體資料庫的方向發展,一方面功能不斷擴充,引入了記憶體計算、流資料處理、機器學習等功能。Ignite 部署靈活,可以輕易地內建進已有的系統,非常友善地與已有的資料庫系統內建(NoSQL、HDFS 也支援),為已有的業務進行加速服務。不颠覆已有架構,是 Ignite 很重要的邏輯。

Spark

Spark 的核心定位是一個分布式統一大資料分析引擎,通過先進的 RDD 模型和大量記憶體的使用,解決了使用 Hadoop 的 MapReduce 進行多輪疊代式計算的性能問題。然後在 RDD 的基礎上不斷完善,引入了 Dataset 和 DataFrame、SparkSQL、Spark Streaming、SparkML 等更進階的功能。Spark 對 Hadoop 技術棧有非常好的支援,很多可以直接內建,雖然也可以支援 RDBMS 的讀寫,但是這不是 Spark 主要的關注方向。

三、核心技術

Ignite 和 Spark 核心技術截然不同。

Ignite

Ignite 的核心資料結構為分布式哈希,即鍵-值型存儲,和 Redis 等可以歸于同一類,對于分布式記憶體資料庫,核心技術來源于 H2 資料庫,也即 Ignite 對 SQL 的支援來源于 H2 的 SQL 引擎。Ignite 的核心計算模型為 MapReduce+支援 SQL 查詢的緩存優化。

Ignite 的記憶體資料模型為固化記憶體架構,同時支援記憶體存儲和磁盤存儲(可選)。資料儲存在堆外,是以隻要記憶體夠用,不用擔心記憶體溢出,也不用擔心大量占用記憶體導緻垃圾回收暫停。

Spark

Spark 的核心是建立在統一的抽象 RDD 之上,使得 Spark 的各個元件可以無縫進行內建,在同一個應用程式中完成大資料計算任務。RDD 的設計理念源自 AMP 實驗室發表的論文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。RDD 可以認為是 MapReduce 的超集,也即 RDD 也可以實作傳統的 MapReduce 計算機制。

四、部署模型

Ignite 和 Spark 的組網基本模式有很大的不同,但在更高層面的資源管理上,支援能力是差不多的。

Ignite

Ignite 叢集基于無共享架構,所有的叢集節點都是平等的、獨立的,整個叢集不存在單點故障。 通過靈活的 Discovery SPI 元件,Ignite 節點可以自動地發現對方,是以隻要需要,可以輕易地對叢集進行縮放。

Ignite 可以獨立運作,可以組成叢集,可以運作于 Kubernetes 和 Docker 容器中,也可以運作在 Apache Mesos 以及 Hadoop Yarn 上,可以運作于虛拟機和雲環境,也可以運作于實體機,從技術上來說,叢集部署在哪裡,是沒有限制的。

Ignite 還支援嵌入式部署,也就是和應用內建在一起。

Spark

Spark 支援四種分布式部署方式:分别是 Standalone、Spark on Mesos、Spark on YARN 和 Kubernetes。

Spark 的部署屬于 Master/Slave 模式,可能存在單點故障問題,但是可以通過 ZooKeeper 解決。

五、功能

記憶體計算

Ignite 和 Spark 都有記憶體計算的能力,尤其記憶體計算是 Spark 的主打功能,從技術原理上來看它們的能力:SparkRDD > Ignite MapReduce+Cache > Hadoop MapReduce。

但具體來說,Ignite 的計算模型優于 Hadoop 毋庸置疑。但是 Ignite 和 Spark,雖然 Ignite 技術原理上不如 SparkRDD 先進,但是落實到具體的實踐中,則要看具體的業務場景、技術人員對技術和設計的掌控力、代碼優化程度等,無法直接下結論,這個要具體問題具體分析。

Spark 擅長的多輪疊代式計算、互動式計算、圖計算等,Ignite 則沒有對應的解決方案。

Ignite

Ignite 的計算功能原理與 Hadoop 一緻,都是 MapReduce 範式,即可以将一個批量任務拆分為多個部分,然後在不同的節點并行執行,這樣就可以并行地利用所有節點的資源,來減少計算任務的整體執行時間。

但是 Ignite 的計算有兩個重要的獨特之處,一個是鑒于 Ignite 靈活的部署模型,Ignite 可以是離線計算,也可以是線上計算,對于線上的場景,比如 OLTP 業務,它可以通過将請求中的計算負載同步地放在多個可用節點上,然後将結果傳回,這樣可以提高整個系統的擴充性和容錯能力。 另一個是計算可以和資料并置,即計算會被發送到要處理的資料所在的節點,這樣會使開銷最小化。

Spark

Spark 的計算模型從原理上來說,作為 MapReduce 的超集是非常先進的,Spark 也具有 MapReduce 的機制和開發接口,是以用 Spark 實作 MapReduce 計算模型是可以的。

Spark 的核心概念 RDD,作為一個通用的資料抽象,着重解決了 MapReduce 模型在處理多輪疊代式算法(比如機器學習、圖算法等)的性能瓶頸,避免了中間結果落盤導緻的大量資料複制、磁盤 IO 和序列化開銷。但是 Spark 的計算功能是按照離線系統設計的,無法實作 Ignite 的線上計算功能。

存儲支援能力

Ignite 和 Spark 都可以将第三方存儲作為資料來源用作後續的處理,兩者對第三方存儲的支援程度、側重點完全不同。這裡說的第三方存儲,暫時劃分為傳統的 RDBMS 和 NoSQL(HDFS、Hive、Cassandra 等)。但是 Ignite 在支援第三方存儲的同時,本身還具有原生持久化的能力。

Ignite

RDBMS:Ignite 作為一個緩存系統,天然對 RDBMS 有良好的支援,基本上隻要支援 JDBC/ODBC 協定的資料庫都沒有問題。對于資料的加載、資料的讀寫及其一緻性(事務)保證、各種工具的支援、各種通信協定的支援都一應俱全,是一個完整的方案;

NoSQL:Ignite 對于各種 NoSQL 資料庫的支援是有限的,因為功能定位的原因,不是任何 NoSQL 産品都适合和 Ignite 整合進而提升能力,就目前來說,Ignite 在不同的功能場景對 NoSQL 提供了支援,包括對 HDFS 的支援,也包括與 Cassandra 的原生內建;

原生持久化:Ignite 基于固化記憶體架構,提供了原生持久化,可以同時處理存儲于記憶體和磁盤上的資料和索引,它将記憶體計算的性能和擴充性與磁盤持久化和強一緻性整合到一個系統中。 原生持久化以有限的性能損失,透明地提供了更強大的功能,即使整個叢集重新開機,記憶體不需要預熱,資料可以直接通路。

Spark

RDBMS:SparkRDD 可以将 RDBMS 作為資料來源之一,支援 RDBMS 資料的批量讀寫,也支援各種類型的 RDBMS,但是 Spark 對 RDBMS 的讀寫,屬于批量模式,Spark 更多地會将 RDBMS 作為分析型業務的資料來源之一,最後如有必要,則将業務分析的結果批量回寫 RDBMS;

NoSQL:Spark 原生支援 JDBC、JSON、Parquet、csv、libsvm 以及 orcFile 等,也可以通過擴充接口自定義資料源。Spark 可以直接或者通過各種連接配接器讀取 Hive、Hbase、Cassandra 中的資料,然後建立對應的 RDD,寫入也是同理,這個能力是 Ignite 所不具備的;

原生持久化:Spark 不具備原生的持久化能力。

SQL

Ignite 和 Spark 都支援 SQL,但是兩者的定位和能力,有所不同。

Ignite

Ignite SQL 目前的文法相容于 ANSI-99,支援查詢、删除、更新與插入,但文法和功能與标準并不完全一緻。Ignite 如果做好了資料并置,SQL 查詢的性能是很好的,同時 Ignite 還支援索引,這都進一步提升了 Ignite SQL 的能力。另外,Ignite SQL 對緩存的功能進行了極大的增強,通常用于緩存的線上查詢和計算,用于離線資料處理也是可以的。

Spark

SparkSQL 最初來源于 Shark 項目,後來兩者進行了合并,SparkSQL 建構于 Dataset/DataFrame 機制基礎上,目前隻支援查詢,主要适用于分析型業務以及對來自不同資料源的結構化資料進行處理。它也可以進行互動式查詢,因為不支援索引等等原因,是以性能較差,響應時間可能較長。

資料一緻性(事務)

Ignite

Ignite 整體來說對事務的支援還不完善,具體來說,在鍵-值 API 層面,有完善的事務機制,主要原理來自于經過優化的二階段送出協定,但是 SQL 層面的 DML 語句還不支援事務,未來版本會解決該問題。

在計算層面,因為支援豐富的程式設計接口,也可以非常容易地與各種開源的 ORM 架構內建,是以也可以友善地對事務進行細粒度的控制,比如 CRUD 都是沒問題的。

Spark

SparkSQL 本身并不提供事務機制。Spark 本身也不适用于 RDBMS 的細粒度資料維護,RDBMS 對于 Spark 來說,隻是資料的一個來源和存儲地之一,通常都是批量操作,如果批量操作失敗,Spark 有容錯機制可以重來,以保證整體的一緻性。

流計算

Spark 有 Spark Streaming,Ignite 也支援流資料處理。

Ignite

Ignite 可以與主流的流處理技術和架構進行內建,比如 Kafka、Camel、Storm 與 JMS,提供可擴充和容錯的能力。流處理技術為 Ignite 提供了一種資料加載機制,針對流式資料,Ignite 也提供了各種處理和查詢功能。Ignite 社群官方提供了 10 種流處理技術的內建實作,利用統一的 API,開發者也可以自行開發流處理技術實作。Ignite 為所有流入 Ignite 的資料以可擴充和容錯的方式提供至少一次保證。

Spark

Spark Streaming 是基于 Spark 的流式批處理引擎,其基本原理是把輸入資料以某一時間間隔批量的處理,即以時間為機關切分資料流,每個切片内的資料對應一個 RDD,進而可以采用 Spark 引擎進行快速計算。其同樣支援衆多的資料源,内部的資料表示形式為 DStream。Spark Streaming 吞吐量高,可以做複雜的業務邏輯,但是秒級别的延遲是否符合業務需求需要确認。Spark Streaming 可以與 Spark 其他技術完美內建,包括 SparkML、SparkSQL 等。

機器學習

Ignite 和 Spark 都支援機器學習。

Ignite

Ignite 從 2.5 版本開始,提供了完整的機器學習解決方案,Ignite 的機器學習有兩個優點:一個是如果已經在 Ignite 中持有了大量的資料,那麼繼續在 Ignite 中進行機器學習的訓練和推理,就不需要在不同系統間進行 ETL 的等待,提高效率。另一個是 Ignite 提供了一系列的機器學習和深度學習算法,對 Ignite 的分布式并置處理進行優化,這樣在處理大規模的資料集或者不斷增長的輸入資料流時,提供了記憶體級的速度和近乎無限的擴充性,而不需要将資料移到另外的存儲。目前支援的算法包括回歸、分類、聚類以及對資料進行預處理等。另外 Ignite 還支援了一組遺傳算法,該算法适合于以最優的方式檢索大量複雜的資料集。

Spark

Spark 很早就包含了機器學習庫,RDD 模型面向的一個主要場景就是機器學習這樣的多輪疊代式計算。目前的 Spark 機器學習庫有 2 個實作,正在逐漸向 SparkML 過渡,SparkML 基于 DataFrame API,更強大更靈活,而傳統的 MLlib 會處于維護狀态。SparkML 基于 DataFrames 對 API 進行了統一,使用體驗更友好。可以使用 SparkSQL 等更進階的功能,支援流水線,特别是特征變換。Spark 的機器學習因為 RDD 的原因性能更好,支援的算法也更多。

圖計算

Ignite

暫不支援

Spark

Spark 中包含了 GraphX,這是一個圖計算元件。它在 RDD 基礎上引入了新的 Graph 抽象,為了支援圖形計算,GraphX 公開了一組基本運算符(例如子圖、連接配接頂點和聚合消息)以及 Pregel API 的優化變型。此外,GraphX 還包括了越來越多的圖形算法和構造者,以簡化圖形分析任務。

開發語言和用戶端協定

Ignite

Ignite 是以 Java 語言為主進行開發的,是以可以在 JVM 支援的任何作業系統和架構上部署和運作。Java 的 API 支援 Ignite 的所有功能,使用 Java 或者 Scala 開發的應用,相關的邏輯可以直接嵌入 Ignite,然後借助于 SQL 以及鍵-值操作與叢集進行互動,執行分布式計算和機器學習算法等等。

除了 Java,Ignite 還支援 .NET 平台與 C++,Ignite.NET 和 Ignite C++ 使用 JNI,會把大部分的調用轉發給 Java。

Ignite 還支援使用标準的 JDBC 或者 ODBC 連接配接,可以像其它 SQL 存儲一樣與 Ignite 進行互動。Ignite 還為 Java、.NET 和 C++ 開發者提供原生的 SQL API,性能更好。

Ignite 還支援其它的語言通路,比如 Python、Ruby、PHP 與 NodeJS,另外還可以考慮使用 Ignite 的二進制用戶端協定接入叢集。

Spark

Spark 使用 Scala 語言開發,目前支援使用 Scala、Java、Python、R 語言開發 Spark 程式。

監控運維工具支援

Ignite

Ignite 開源版沒有提供圖形化的監控工具,但是提供了簡易的指令行工具,同時為了簡化開發,Ignite 提供了圖形化的 Web 控制台。

Ignite 運作時可以通過 API 接口擷取大量的名額,通過程式設計的方式了解叢集的狀況。

如果需要強大的監控運維工具,可以購買 GridGain 的商業版軟體和服務。如果搭建的是一個小規模的叢集,鑒于 Ignite 的無共享架構,部署運維都是比較簡單的。

Spark

Spark 啟動後會有一個 Web 控制台,雖然不是很美觀,但是可以從總體上看到 Spark 的目前運作狀态。

Spark 屬于 Master/Slave 模式,如果直接拿開源版本搭建大規模叢集,部署運維還是非常麻煩的,但是國内有很多廠商開發包含 Spark 元件的大資料平台,為部署和運維提供了很大的便利。

六、總結

綜上所述,Ignite 和 Spark 功能都很全面,已經脫離了簡單開源技術元件的範圍,都成為了自成體系的開源大資料平台。上面主要對 Ignite 和 Spark 的主要功能做了簡單的梳理對比,不一定全面,也沒有對其各自特有的功能進行梳理。但經過這麼一些分析,還是可以得出這樣一個結論:兩者差别很大,定位不同,是以會有不同的适用領域。

Ignite

Ignite 以緩存為中心建構大資料體系,底層存儲模型更偏向傳統關系型資料架構,上層為應用開發的便利做了大量的工作,包括為各種常見語言和協定提供支援。中間核心層在緩存的基礎上不斷向外擴充,功能日趨豐富強大。

Ignite 從定位上來說有兩個突出點,一是可以獨立組網,建構獨立的大資料平台,然後企業在其上開發全新的大資料應用,包括緩存、計算、流資料處理、機器學習應用等等。二是還可以與傳統應用緊密整合,在不颠覆已有架構的前提下,幫助使用者進行傳統應用的分布式架構轉型。為運作多年的複雜、運作緩慢、技術架構落後的業務系統,提供加速能力的同時,引入衆多的先進功能,大幅提升原有系統的能力進而延長已有架構的壽命,産生更大的價值,保護客戶原有投資。

Ignite 的定位和架構,與 Hadoop 體系大資料元件有很大的不同,但是并不沖突,即使企業已經部署了基于 Hadoop 技術體系的大資料平台,那麼也可以繼續引入 Ignite 作為補充。

Spark

Spark 以計算為中心建構大資料體系,底層存儲對各種資料源進行了抽象,總體上更偏向非結構化的資料,上層應用支援多種語言,核心層基于 RDD 模型,然後進行了大量的擴充,支援了更多更進階的功能,比如 SparkSQL、Spark Streaming、SparkML 與 Spark GraphX 等。Spark 的核心優勢是進行多輪疊代式計算、互動式計算以及圖計算等。

Spark 是圍繞 RDD 建構生态,使用者可以以 Spark 為中心搭建大資料平台,滿足大量資料的擷取、清洗、處理、加載、計算、存儲等需求,核心定位是解決大資料的分析問題。雖然 Spark 的計算能力也可以處理傳統的關系型資料,但這并非 Spark 的強項,是以和傳統業務系統并沒有太多的交集。企業基于 Spark 搭建大資料平台之後,其上的應用基本需要全新開發。傳統的資料處理業務,即使适合用 Spark 實作,原有的業務邏輯也無法直接、簡單地移植進入 Spark 技術堆棧。Spark 技術堆棧更适合用于處理傳統技術處理起來很麻煩、性能很差、資料量又很大的非結構化資料,Spark 适合對衆多系統的相關資料進行整合,通過分析後能産生更大價值的業務場景。

作者

李玉珏,架構師,有豐富的架構設計和技術研發團隊管理經驗,社群技術翻譯作者以及撰稿人,開源技術貢獻者。Apache Ignite 技術中文文檔翻譯作者,長期在國内進行 Ignite 技術的推廣/技術支援/咨詢工作。

本文系作者投稿文章。歡迎投稿。

投稿内容要求

網際網路技術相關,包括但不限于開發語言、網絡、資料庫、架構、運維、前端、DevOps(DevXXX)、AI、區塊鍊、存儲、移動、安全、技術團隊管理等内容。

文章不需要首發,可以是已經在開源中國部落格或網上其它平台釋出過的。但是鼓勵首發,首發内容被收錄可能性較大。

如果你是記錄某一次解決了某一個問題(這在部落格中占絕大比例),那麼需要将問題的前因後果描述清楚,最直接的就是結合圖文等方式将問題複現,同時完整地說明解決思路與最終成功的方案。

如果你是分析某一技術理論知識,請從定義、應用場景、實際案例、關鍵技術細節、觀點等方面,對其進行較為全面地介紹。

如果你是以實際案例分享自己或者公司對諸如某一架構模型、通用技術、程式設計語言、運維工具的實踐,那麼請将事件相關背景、具體技術細節、演進過程、思考、應用效果等方面描述清楚。

其它未盡 case 具體情況具體分析,不虛的,文章投過來試試先,比如我們并不拒絕就某個熱點事件對其進行的報導、深入解析。

*對大資料的概念都是模糊不清的,大資料是什麼,能做什麼,學的時候,該按照什麼線路去學習,學完往哪方面發展,想深入了解,想學習的同學歡迎加入大資料學習qq群:458345782,有大量幹貨(零基礎以及進階的經典實戰)分享給大家,并且有清華大學畢業的資深大資料講師給大家免費授課,給大家分享目前國内最完整的大資料高端實戰實用學習流程體系 .

全面對比,深度解析 Ignite 與 Spark

小禮物走一走,來簡書關注我

繼續閱讀