全面對比,深度解析 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 技術的推廣/技術支持/諮詢工作。


分享到:


相關文章: