Apache Ignite核心特性介紹(2.5.0版) 頂 原 薦

1.摘要

1.1.Ignite是什麼?

Apache Ignite是一個以內存爲中心的分佈式數據庫緩存處理平臺,支持事務、分析以及流式負載,可以在PB級數據上享有內存級的性能。

1.1.1.Ignite定位

Ignite是不是內存數據庫?

,雖然Ignite的固化內存在內存和磁盤中都工作得很好,但是磁盤持久化可以禁用從而成爲一個純粹的內存數據庫,支持SQL和分佈式關聯。

Ignite是不是內存數據網格(IMDG)?

,Ignite是一個全功能的分佈式鍵-值數據網格,它既可以用於純內存模式,也可以帶有Ignite的原生持久化,它也可以與任何第三方數據庫集成,包括RDBMS和NoSQL。

Ignite是不是一個分佈式緩存?

,如果禁用原生持久化,Ignite就是一個分佈式緩存,它實現了JCache規範(JSR107),並且提供了比規範更多的功能,包括分區和複製分佈式模式、分佈式ACID事務、SQL查詢、原生持久化等等。

Ignite是不是分佈式數據庫?

,在整個集羣的多個節點中,Ignite中的數據要麼是分區模式的,要麼是複製模式的,這給系統帶來了伸縮性,增加了彈性。Ignite可以自動地控制數據如何分區,另外,開發者也可以插入自定義(關係)函數,以及爲了提高效率將部分數據並置在一起。

Ignite是不是關係型SQL數據庫?

不完整,儘管Ignite的目標是和其他的關係型SQL數據庫具有類似的行爲,但是在處理約束和索引方面還是有不同的。Ignite支持一級和二級索引,但是隻有一級索引支持唯一性,Ignite還不支持外鍵約束。

Ignite是不是磁盤或者只有內存的存儲?

都是,Ignite中的原生持久化是可以開關的,這使得Ignite可以持有比可用內存量大得多的數據。尤其是,少量的操作型數據集可以只保存在內存中,而更大的無法放在內存中的數據集,可以放在磁盤上,將內存作爲一個緩存層,可以獲得更好的性能。

Ignite是不是一個NoSQL數據庫?

不確切,和其他的NoSQL數據庫一樣,Ignite支持高可用和水平伸縮,但是,和其它的NoSQL數據庫不同,Ignite支持跨越整個集羣的ACID事務和SQL。

Ignite是不是事務型數據庫?

不完整,ACID事務是支持的,但是僅僅在鍵-值API級別,Ignite還支持跨分區的事務,這意味着事務可以跨越不同服務器不同分區中的鍵。

在SQL層,Ignite支持原子性,還不是事務型一致性,社區計劃在未來的版本中實現SQL事務。

Ignite是不是一個多模型數據庫?

,Ignite數據的建模和訪問,同時支持鍵值和SQL,另外,Ignite還爲在分佈式數據上的計算處理,提供了強大的API。

Ignite是不是一個鍵-值存儲?

,Ignite提供了豐富的鍵-值API,兼容於JCache (JSR-107),並且支持Java,C++和.NET。

2.關鍵特性

2.1.分佈式內存SQL數據庫

Ignite帶來了一個兼容於ANSI-99、支持水平擴展和容錯的分佈式SQL數據庫,根據需要,分佈模式既可以是跨整個集羣的分區模式,也可以是全複製模式。

和其它的分佈式SQL數據庫不同,Ignite的持久化存儲將內存和磁盤都視爲有效的存儲層,磁盤層,即原生持久化存儲,默認是禁用的,這時Ignite就是一個純粹的內存數據庫(IMjDB)。

和其他的SQL存儲一樣,也可以使用JDBC或者ODBC與Ignite進行交互,Ignite還爲Java、.NET和C++開發者提供了原生的SQL API,並且性能更好。

Ignite的一個顯著優勢是,完全支持分佈式SQL關聯,Ignite的數據關聯支持並置模式和非並置模式。如果是並置模式,關聯是在每個節點的本地可用數據集上執行,而不需要在網絡間移動大量的數據,在分佈式數據庫中,這樣的方式提供了最好的擴展性和性能。

除了標準的SQL,Ignite還提供了強大的處理API。

  • 鍵值API:Ignite的鍵值API可以使用戶以鍵值存儲的方式與Ignite交互,除了JCache規範(JSR107)支持的標準鍵值操作,Ignite還提供了分佈式ACID事務、持續查詢、掃描查詢這樣的擴展支持;
  • 並置處理:這個方式允許直接在數據所在的節點直接執行分佈式SQL關聯或者自定義業務邏輯,避免了昂貴的序列化和網絡開銷。

2.2.鍵-值內存數據網格

Ignite提供了廣泛的鍵-值API,可以作爲一個內存數據網格,可以將Ignite視爲一個分佈式分區化的哈希映射,每個節點持有整個數據集的一部分,和其他的內存數據網格(IMDG)不同,Ignite可以同時將數據保存在內存和磁盤上,因此也就可以存儲比可用物理內存多得多的數據。

目前,Ignite數據網格是分佈式架構支持ACID事務或者原子化數據更新最快的實現之一。

第三方數據庫

通過在應用和數據庫層之間嵌入一個分佈式緩存,Ignite會改進已有第三方數據庫的性能和可擴展性,比如RDBMS、NoSQL或者基於Hadoop的存儲,這種做法不需要對已有的數據進行替換,通過通讀和通寫,會保持與底層數據庫的同步,Ignite會自動地與底層數據庫事務進行合併,向用戶透明地提供事務保證。

但是,這種方法也有限制,比如,SQL和掃描查詢只能處理保存在緩存中的數據,不包括外部數據庫,因爲Ignite無法索引外部數據,如果希望磁盤上的數據也應該被索引到並且可以通過SQL訪問,建議使用Ignite的原生持久化。

JCache API

Ignite的鍵-值API符合JCache規範(JSR107),支持如下功能:

  • 內存鍵值存儲;
  • 基本的緩存操作;
  • ConcurrentMap API;
  • 並置處理(EntryProcessor);
  • 事件和指標;
  • 可插拔的持久化。

擴展鍵-值API

除了標準的JCache API,Ignite還支持分佈式的ACID事務、持續查詢、並置處理等等。

Ignite數據網格甚至可以線性地增長到幾百個節點,它通過強語義的數據位置和關係數據路由,來降低冗餘數據噪聲。它可以被視爲一個分佈式分區化的哈希映射,每個節點可以持有整個數據集的一部分,這意味着節點越多,緩存的數據也可以越多。

2.3.ACID事務

Ignite是一個強一致的平臺,完全支持分佈式ACID事務,內存和磁盤層,都提供一樣的一致性保證。

Ignite的事務,可以跨越多個節點,多個緩存(或者說表)以及多個分區。對於應用來說,樂觀鎖和悲觀鎖都是可用的,樂觀模式還支持無死鎖事務,可以在業務代碼層面避免分佈式死鎖。

二階段提交協議

在分佈式系統中,事務可能跨越多個節點,顯然,要保證所有參與節點的數據一致性是一個很大的挑戰。比如,如果一個節點故障,故障節點的事務就不能完整提交,在這類場景中,要保證數據一致性,一個廣泛使用的方法是二階段提交協議(2PC)。

Ignite帶來了二階段提交協議的最快實現,另外,如果事務只涉及一個分區或者一個節點,Ignite會使用一個更快的一階段提交協議。在一個事務中,如果數據發生了變化,那麼在變化提交之前,Ignite會在本地事務映射中保存一個事務的狀態,提交時,數據會被髮送到相關的遠程節點,其中只有持有相關數據主副本的節點,纔會參與事務。

一致性和Ignite持久化

如果使用了Ignite的原生持久化,那麼所有的更新都會寫入預寫日誌(WAL)文件中來保證一致性,即使事務執行期間集羣或者某個節點故障,也沒有問題。

WAL的目的是,以附加模式將更新傳播到磁盤,這是將數據持久化到磁盤的最快方式,如果集羣或者某個節點故障,WAL提供了一個故障場景的恢復機制,集羣總是可以恢復到最近成功提交的事務狀態。

一致性和第三方持久化

如果Ignite作爲緩存層運行於第三方數據庫之上,比如RDBMS,Ignite仍然會保證緩存數據和外部數據的事務一致性。比如,如果RDBMS作爲持久化層,Ignite會在將提交消息發給相關的集羣節點之前,將事務寫入數據庫,這樣的話,如果在數據庫層發生事務故障,Ignite仍然會將回滾消息發給所有的相關節點,從而保持兩者之間的數據一致性。

2.4.並置處理

基於磁盤的系統,比如RDBMS以及NoSQL,通常使用傳統的C/S模式,這時數據是要從服務端傳輸到客戶端的,在客戶端進行處理,然後可能被丟棄。這個方法無法擴展,因爲在分佈式系統中通過網絡移動大量數據是非常昂貴的操作。

一個擴展性更好的方法是並置處理,它會反過來將計算帶到數據實際駐留的服務端節點,它會在數據實際存儲的地方執行高級的業務邏輯或者分佈式SQL,甚至關聯,避免了昂貴的序列化和網絡開銷。

2.5.機器學習

Ignite的機器學習(ML)是一套簡單、可擴展以及高效的工具,可以構建可預測的機器學習模型,而不需要昂貴的數據傳輸。

將機器和深度學習加入Ignite的原理是很簡單的,當前,如果要想讓機器學習成爲主流,數據科學家要解決兩個主要的問題:

問題#1:常規數據遷移(ETL)

首先,模型是在不同的系統中訓練和部署(訓練結束之後)的,數據科學家需要等待ETL或者其他的數據傳輸過程,來將數據移至比如Apache Mahout或者Apache Spark這樣的系統進行訓練,然後還要等待這個過程結束並且將模型部署到生產環境。在系統間移動TB級的數據可能花費數小時的時間,此外,訓練部分通常發生在舊的數據集上。

問題#2:水平擴展能力缺乏

第二個問題和擴展性有關。機器學習和深度學習需要處理的數據量不斷增長,已經無法放在單一的服務器上。這促使數據科學家要麼提出更復雜的解決方案,要麼切換到比如Spark或者TensorFlow這樣的分佈式計算平臺上。但是這些平臺通常只能解決模型訓練的一部分問題,這給開發者之後的生產部署帶來了很多的困難。

無ETL和大規模擴展性

Ignite的機器學習依賴於Ignite基於內存的存儲,這給機器學習和深度學習任務帶來了大規模的擴展性,並且取消了在不同系統間進行ETL產生的等待。比如,在Ignite集羣的內存和磁盤中存儲的數據上,開發者可以直接進行深度學習和機器學習的訓練和推理,然後,Ignite提供了一系列的機器學習和深度學習算法,對Ignite的分佈式並置處理進行優化,這樣在處理大規模的數據集或者不斷增長的輸入數據流時,這樣的實現提供了內存級的速度和近乎無限的擴展性,而不需要將數據移到另外的存儲。通過消除數據的移動以及長時間的處理等待,Ignite的機器學習可以持續地進行學習,可以在最新數據到來之時實時地對決策進行改進。

容錯和持續學習

Ignite的機器學習能夠對節點的故障容錯。這意味着如果在學習期間節點出現故障,所有的恢復過程對用戶是透明的,學習過程不會被中斷,就像所有節點都正常那樣獲得結果。

遺傳算法

Ignite的機器學習組件包括一組遺傳算法(GA),它是一種通過模擬生物進化過程來解決優化問題的一種方法。 遺傳算法非常適合於以最優的方式檢索大量複雜的數據集,在現實世界中,遺傳算法的應用包括:汽車設計、計算機遊戲、機器人、投資、交通和運輸等等。

2.6.多語言支持

Ignite是以Java語言爲主進行開發的,因此可以在JVM支持的任何操作系統和架構上部署和運行,比如,Ignite可以部署在Linux、Windows、MacOS、Oracle Solaris等操作系統上,支持x86、x64、SPARC、PowerPC指令集架構。

Java的API支持Ignite的所有功能,使用Java或者Scala開發的應用,相關的邏輯可以直接嵌入Ignite,然後藉助於SQL以及鍵-值操作與集羣進行交互,執行分佈式計算和機器學習算法等等。

除了Java,Ignite還支持.NET平臺,Ignite.NET和Ignite C++使用JNI,會把大部分的調用轉發給Java,這裏需要注意的是,JNI的負載非常小,不會導致性能的下降,尤其是在分佈式環境,整體的應用性能中網絡是主要的開銷。

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

要使用其他的語言訪問Ignite,比如Python、Ruby、PHP或者NodeJS,可以考慮使用Ignite的二進制客戶端協議,JDBC或者ODBC驅動,或者文檔中提到的其他客戶端協議。

3.擴展特性

3.1.服務網格

服務網格可以在集羣中任意部署自定義的服務,可以實現和部署任意服務,比如自定義計數器,ID生成器,分級映射等。

服務網格的主要應用場景是提供了在集羣中部署各種單例服務的能力。但是,如果需要一個服務的多實例,Ignite也能保證所有服務實例的正確部署和容錯。

3.2.數據注入和流計算

Ignite流式計算允許以可擴展和容錯的方式處理連續不中斷的數據流。在一箇中等規模的集羣中,數據注入Ignite的比例會很高,很容易達到每秒百萬級的規模。

Ignite可以與主要的流處理技術和框架進行集成,比如Kafka、Camel、Storm或者JMS,他們可以爲基於Ignite的架構帶來非常強大的功能。

數據加載 Ignite提供了若干種技術來對數據進行預加載,比如,開啓原生持久化後,Ignite的流處理API就是一個好的選擇,如果使用第三方存儲,那麼使用CacheStoreAPI可以直接接入。

工作方式:

  1. 客戶端將流式數據注入Ignite;
  2. 數據在Ignite數據節點中自動分區;
  3. 數據在滑動窗口中併發處理;
  4. 客戶端在流式數據中執行併發SQL查詢
  5. 客戶端訂閱數據變化的持續查詢

3.3.RDBMS集成

Ignite支持與各種持久化存儲進行集成,它可以接入數據庫、導入模式、配置索引類型、以及自動化地生成所有必要的XML OR映射配置和Java領域模型POJO,他們可以很容易地導入自己的開發工程。

Ignite可以與任何支持JDBC驅動的關係型數據庫(RDBMS)進行集成,包括Oracle, PostgreSQL, Microsoft SQL Server, 和MySQL。

RDBMS集成嚮導 通過Web控制檯,Ignite支持自動化的RDBMS集成,它是一個交互式的配置嚮導、管理和監控工具,功能包括:

  • 創建和下載各種集羣的配置文件;
  • 從任何RDBMS模式中自動化地構建Ignite的SQL元數據;
  • 在內存緩存中執行SQL查詢;
  • 查看查詢的執行計劃、內存模式和流化圖表。

這個Web控制檯是一個創新的工具,它提供了豐富的功能來管理集羣,並不限於上述提到的這些功能。

3.4.分佈式數據結構

Ignite以分佈式的形式支持基於java.util.concurrent框架的大部分數據結構。比如,可以在一個節點上使用java.util.concurrent.BlockingQeque加入一些東西,然後再另一個節點上獲取它。或者有一個分佈式的ID生成器,他可以保證所有節點上的ID唯一性。

支持的數據結構包括:

  • Concurrent Map (Cache)
  • 分佈式隊列和集合
  • AtomicLong
  • AtomicReference
  • AtomicSequence (ID生成器)
  • CountDownLatch
  • ExecutorService

3.5.消息和事件

Ignite提供了集羣範圍的高性能的消息功能,支持基於發佈-訂閱以及直接點對點通信模型的數據交換。消息可以以有序的,也可以以無序的方式進行交換。有序消息會稍微有點慢,但是如果使用的話,Ignite會保證收到消息的順序和發送消息的順序一致。

當在分佈式網格環境中發生各種事件時,Ignite的分佈式事件功能可以使應用收到通知。可以自動地收到集羣內的本地和遠程節點上發生的任務執行、讀寫和查詢操作的通知,事件通知也可以分組在一起然後分批或者定期地發送。

4.架構

4.1.集羣和部署

Ignite集羣基於無共享架構,所有的集羣節點都是平等的,獨立的,整個集羣不存在單點故障。

通過靈活的Discovery SPI組件,Ignite節點可以自動地發現對方,因此只要需要,可以輕易地對集羣進行縮放。 Ignite可以獨立運行,可以組成集羣,可以運行於Kubernetes和Docker容器中,也可以運行在Apache Mesos以及Hadoop Yarn上,可以運行於虛擬機和雲環境,也可以運行於物理機,從技術上來說,集羣部署在哪裏,是沒有限制的。

服務端、客戶端和協議

Ignite中定義有兩種類型的節點,客戶端和服務端節點,分別有不同的用途。

服務端節點作爲數據和計算的容器,一旦接入,Ignite就會作爲分佈式數據庫(或者叫數據網格)存儲數據,然後參與查詢的處理、計算的執行、數據流處理等等。

而對於客戶端節點,提供了遠程接入分佈式數據庫(一組服務端節點)的功能,Ignite的原生客戶端可以使用完整的Ignite API,包括SQL、事務、計算、數據流、服務等等。

除了客戶端節點,還可以通過Ignite的二進制客戶端協議、JDBC/ODBC驅動、REST API接入集羣。

公共雲

對於公共雲環境,Ignite原生集成了Amazon AWS以及Google Compute Engine,對於其他的雲環境,Ignite集成了JCloud,它支持了大部分的已有云服務商

容器

Ignite完全支持容器環境,Ignite與Docker的集成可以在服務啓動之前,自動地將業務代碼構建並且部署進Ignite。

Ignite也可以部署在Kubernetes中,可以自動地部署和管理容器化的應用。

資源管理器

Ignite提供了對Hadoop YarnKubernetesApache Mesos的原生支持,可以很容易地部署到這些環境。

4.2.基於內存的存儲

Ignite基於分佈式的內存架構,它將內存計算的性能和擴展性,與磁盤持久化和強一致性整合到一個系統中。

基於內存的方式和傳統的基於磁盤的方式的主要不同是,Ignite將內存視爲全功能的存儲,而不是像傳統大多數數據庫那樣僅僅是一個緩存層。比如,Ignite可以運行於純內存模式,這時它就是一個內存數據庫(IMDB)和內存數據網格(IMDG)。

另一方面,如果打開了持久化,Ignite就變成了一個處理是在內存中進行的基於內存的系統,但是數據和索引又持久化到磁盤上。這裏與傳統的基於磁盤的RDBMS或NoSQL系統的主要區別是,Ignite支持強一致、水平擴展、並且同時支持SQL和鍵-值處理API。

並置和C/S處理

基於磁盤的系統,比如RDBMS或者NoSQL,通常採用傳統的C/S模式,數據需要從服務端傳輸到要處理的客戶端,通常最終又被廢棄,這種方法不可擴展,因爲在分佈式系統中,通過網絡移動大量數據是非常昂貴的開銷。 一個更有擴展性的方式是,通過將計算放在數據實際存儲的服務端上,反過來實現並置處理,這個方法可以直接在數據實際存放的地方直接執行業務邏輯或者分佈式SQL關聯,避免了昂貴的序列化和網絡開銷。

分區和複製

根據配置,Ignite在內存存儲中,可以是分區模式,也可以是複製模式,複製模式中,數據在集羣中的每個節點都有一份副本,而分區模式,Ignite會在多個集羣節點上對數據進行平均拆分,因此可以在內存及磁盤上存儲TB級的數據。

冗餘

Ignite可以配置多個副本,來保證故障時的數據彈性。

一致性

不管使用哪種複製方案,Ignite都會保證整個集羣的數據一致性。

Ignite作爲內存存儲

持久化對Ignite來說是可選的,這時整個集羣就會工作於純內存模式,所有的數據和索引都會只存儲於內存中,這樣會得到最高的性能,因爲數據不需要寫入磁盤。爲了避免可能的節點故障導致數據丟失,建議適當地配置一些備份(或者叫複製因子)。

Ignite持久化

可以有兩種方式開啓持久化,第一個方式是,使用它自己的分佈式、ACID以及兼容SQL的持久化,這可以透明地與所有的內存架構透明且高效地集成。

如果開啓了原生持久化,Ignite會在磁盤上存儲數據的超集,然後在內存中存儲儘可能多的數據。比如,一共有100條數據,內存有能力存儲20條,那麼磁盤會存儲所有的100條,而爲了高性能,內存可以只緩存20條。

Ignite與第三方數據庫

第二個開啓持久化的方式,是將Ignite部署在已有的第三方數據庫之上,比如RDBMS、Apache Cassandra或者MongoDB。這種方式通過將部分數據的副本放在內存中,用於對底層數據庫進行加速。Ignite支持通讀和通寫模式,確保數據一致性以及兩者之間的同步。

4.3.固化內存

Ignite基於固化內存架構,如果開啓了原生持久化,可以同時處理存儲於內存和磁盤上的數據和索引。

固化內存架構,它將內存計算的性能和擴展性,與磁盤持久化和強一致性整合到一個系統中。

Ignite固化內存的操作方式,類似於比如Linux這樣的操作系統的虛擬內存。但是兩者的顯著區別是,如果開啓了持久化存儲,除了將真個或者部分數據保存在內存中,還會將整個數據集加上索引放在磁盤上,而虛擬內存只是在內存用盡時才使用磁盤,磁盤只是用於交換用途。

Ignite原生持久化

Ignite原生持久化是數據持久化的一個非常靈活、可擴展以及方便的方式,它廣泛應用於應用需要一個分佈式內存數據庫的場景中。

Ignite的原生持久化是一個分佈式的、ACID、兼容SQL的磁盤存儲,它可以與Ignite的固化內存無縫地集成,Ignite原生持久化是可選的,可以打開和關閉,如果關閉,Ignite就是一個純內存存儲。

下面是Ignite作爲一個平臺,如果固化內存和原生持久化同時使用的優勢和特點:

內存

  • 堆外內存
  • 避免明顯的GC暫停
  • 自動碎片整理
  • 可預測的內存消耗
  • 高SQL性能

磁盤

  • 可選的持久化
  • 支持閃存、SSD以及Intel的3D Xpoint
  • 存儲數據的超集
  • 全事務化(預寫日誌WAL)
  • 集羣瞬時啓動

第三方持久化

Ignite可以用於已有第三方數據庫的緩存層,包括RDBMS、NoSQL或者HDFS。該方式用於對保存數據的底層數據庫進行加速,Ignite將數據保存在內存中,在多個節點中進行分佈,提供了更快的數據訪問,它減少了應用和數據庫之間因爲數據移動導致的網絡負載。但是與原生持久化相比,是有很多限制的,比如,SQL查詢只能在內存中保存的數據上執行,因此,首先需要將數據預先從磁盤加載到內存中。

交換空間

如果不希望使用原生持久化或者第三方持久化,還可以開啓交換,這時,如果內存過載,內存中的數據會被移動到磁盤上的交換空間中,如果開啓了交換空間,Ignite將數據存儲於內存映射文件(MMF)中,根據當前的內存使用量,操作系統會將MMF的內容交換到磁盤。交換空間通常用於避免由於內存過載導致的內存溢出錯誤(OOME),以及需要更多時間來對集羣進行縮放,從而對數據集進行更平均的分佈的場景。

5.數據可視化

Ignite可以與很多數據可視化工具集成,通過圖表或者豐富的圖形,協助對存儲在分佈式緩存中的數據進行分析和解釋,甚至提供可操作的建議。

IgniteWeb控制檯

Ignite的Web控制檯是一個基於Web的交互式管理工具, 功能包括:

  • 創建、下載Ignite的各種配置;
  • 從RDBMS中自動加載SQL元數據;
  • 接入Ignite集羣然後執行SQL;
  • 管理和監控Ignite節點和緩存;
  • 查看堆、CPU以及其它有用的節點和緩存的指標;

Tableau

Tableau是一個聚焦於商業智能的交互式數據可視化工具,通過Ignite的ODBC驅動,Tableau就可以接入Ignite集羣,功能包括:

  • 查詢集羣中存儲的分佈式數據;
  • 緩存數據的表格或者圖形展示;
  • 使用Tableau支持的各種方式對數據進行分析;

Zeppelin

Apache Zeppelin是一個基於Web的記事本,可以交互式地對數據進行分析,通過Ignite的JDBC驅動,Zeppelin就可以接入集羣,功能包括:

 - 通過Ignite的SQL解釋器獲取分佈式數據;
- 緩存數據的表格或者圖形展示;
- 通過Scala執行分佈式的計算。

6.Hadoop & Spark

6.1.Spark共享內存層

Ignite共享RDD

Apache Ignite提供了一個Spark RDD抽象的實現,他允許跨越多個Spark作業時方便地在內存內共享狀態,在不同的Spark作業、worker或者應用之間,IgniteRDD爲內存中的相同數據提供了一個共享、可變的視圖,原生的SparkRDD無法在多個Spark作業或者應用之間進行共享。

IgniteRDD作爲Ignite分佈式緩存的視圖,既可以在Spark作業執行進程中部署,也可以在Spark workder中部署,也可以在它自己的集羣中部署。根據預配置的部署模型,狀態共享既可以只存在於一個Spark應用的生命週期的內部(嵌入式模式),或者也可以存在於Spark應用的外部(獨立模式)。

雖然SparkSQL支持豐富的SQL語法,但是它沒有實現索引。這樣即使在一個不太大的數據集上執行查詢,也可能花費比較長的時間,因爲需要對數據進行全部掃描。如果使用Ignite,開發者可以配置一級和二級索引,帶來上千倍的性能提升。

Ignite DataFrames

Spark的DataFrame API引入了模式的概念來描述數據,這樣Spark就可以以表格的形式管理模式和組織數據。簡而言之,DataFrame就是組織成命名列的分佈式數據集合。它從概念上來說,等價於關係數據庫的表,會促使Spark執行查詢優化器,產生比RDD更高效的執行計劃,而RDD僅僅是集羣中的一個分區化的元素集合。

Ignite擴展了DataFrame,如果將Ignite作爲Spark的內存層,會簡化開發以及提高性能,好處包括:

  • 通過向Ignite讀寫DataFrames,可以在Spark作業之間共享數據和狀態;
  • 通過高級的索引以及避免數據在網絡中的移動,優化Spark的查詢執行計劃,使Spark查詢速度更快;

6.2.內存文件系統

Ignite一個獨有的技術就是叫做Ignite文件系統(IGFS)的分佈式內存文件系統,IGFS提供了和Hadoop HDFS類似的功能,但是僅僅在內存內部。事實上,除了他自己的API,IGFS實現了Hadoop的文件系統API,並且可以透明地加入Hadoop或者Spark應用。

IGFS將每個文件中的數據拆分爲獨立的數據塊然後將他們存儲在分佈式內存緩存中。然而和Hadoop HDFS不同,IGFS不需要一個name節點,並且用一個哈希函數自動地確定文件數據位置。

IGFS可以獨立部署,也可以部署在HDFS之上,不管是哪種情況,他對於HDFS中存儲的文件都是一個透明的緩存層。

IGFS可以與原生的Apache Hadoop發行版集成,也可以與Cloudera CDH、Hortonworks HDP集成。

Tachyon替代

在Spark環境中IGFS可以透明地替代Spark環境中的Tachyon文件系統,鑑於IGFS是基於久經考驗的Ignite數據網格技術,他會比Tachyon有更好的讀和寫性能,並且更穩定。

Hadoop文件系統

如果打算使用IGFS作爲Hadoop文件系統,可以參考Hadoop集成文檔,這時IGFS和HDFS並沒有什麼不同。

6.3.內存MapReduce

Apache Ignite帶來了一個Hadoop MapReduce API的內存實現,他比原生的Hadoop MapReduce實現有了顯著的性能提升。Ignite MapReduce比Hadoop性能更好,是因爲基於推的資源分配以及進程內的計算和數據的並置。

另外,因爲IGFS不需要一個name節點,當使用IGFS時,Ignite MapReduce作業會在一個鏈路內直達IGFS數據節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章