一、關於Apache Ignitehtml
二、Why 選擇Apache Ignitejava
對於結構化數據處理,MB級用excel,pandas,sqlite,access,GB級用mysql,oracle,sql server,postgresql,TB級用mongodb,greenplum,PB級用hadoop,spark等等。數據量越大操做起來越費勁越費時,只適合過後慢慢分析,從spark開始內存計算就是爲了解決太費時問題,Apache Beam也延續了這種趨勢。隨着時間的推移,移動互聯網物聯網的使用,數據會成指數增加,不上大內存根本跑不快,服務器內存價格只會愈來愈便宜,內存計算只會愈來愈流行。mysql
Ignite主要內存功能強大,更方便適用,用內存來聚合數據源,處理數據。從官網的下圖能夠看出ignite有數據網格,計算網格,服務網格,sql網格,數據結構,流計算,文件系統,高級集羣等模塊,都是放在內存操做,我想主要追求的是能快速分析處理數據,實時內存應用,不像hadoop基於硬盤文件,發個命令下去,等喝完茶纔有結果。(關於內存數據網格的解釋,參見:IMDG)算法
三、Apache Ignite 歷史sql
Ignite來源於尼基塔·伊萬諾夫於2007年建立的GridGain系統公司開發的GridGain軟件,尼基塔領導公司開發了領先的分佈式內存片內數據處理技術-領先的Java內存片內計算平臺,今天在全世界每10秒它就會啓動運行一次。他有超過20年的軟件應用開發經驗,建立了HPC和中間件平臺,並在一些創業公司和知名企業都作出過貢獻,包括Adaptec, Visa和BEA Systems。尼基塔也是使用Java技術做爲服務器端開發應用的先驅者,1996年他在爲歐洲大型系統作集成工做時他就進行了相關實踐。mongodb
2014年3月,GridGain公司將該軟件90%以上的功能和代碼開源,僅在商業版中保留了高端企業級功能,如安全性,數據中心複製,先進的管理和監控等。2015年1月,GridGain經過Apache 2.0許可進入Apache的孵化器進行孵化,很快就於8月25日畢業而且成爲Apache的頂級項目,9月28日即發佈了1.4.0版,應該說發展、迭代速度很是之快。該技術相關資料較少,但確是一個頗有潛力的技術,解決了大規模、大數據量、高併發企業級或者互聯網應用面臨的若干痛點。數據庫
至目前,Apache Ignite 最新版本爲 2.6.0, 以下圖:apache
四、理解Ignite緩存
5.一、關鍵特性:分佈式內存級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關聯或者自定義業務邏輯,避免了昂貴的序列化和網絡開銷。
5.二、關鍵特性:鍵-值內存數據網格
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數據網格甚至能夠線性地增加到幾百個節點,它經過強語義的數據位置和關係數據路由,來下降冗餘數據噪聲。它能夠被視爲一個分佈式分區化的哈希映射,每一個節點能夠持有整個數據集的一部分,這意味着節點越多,緩存的數據也能夠越多。
5.三、關鍵特性:ACID事務
Ignite是一個強一致的平臺,徹底支持分佈式ACID事務,內存和磁盤層,都提供同樣的一致性保證。
Ignite的事務,能夠跨越多個節點,多個緩存(或者說表)以及多個分區。對於應用來講,樂觀鎖和悲觀鎖都是可用的,樂觀模式還支持無死鎖事務,能夠在業務代碼層面避免分佈式死鎖。
二階段提交協議:在分佈式系統中,事務可能跨越多個節點,顯然,要保證全部參與節點的數據一致性是一個很大的挑戰。好比,若是一個節點故障,故障節點的事務就不能完整提交,在這類場景中,要保證數據一致性,一個普遍使用的方法是二階段提交協議(2PC)。Ignite帶來了二階段提交協議的最快實現,另外,若是事務只涉及一個分區或者一個節點,Ignite會使用一個更快的一階段提交協議。在一個事務中,若是數據發生了變化,那麼在變化提交以前,Ignite會在本地事務映射中保存一個事務的狀態,提交時,數據會被髮送到相關的遠程節點,其中只有持有相關數據主副本的節點,纔會參與事務。
一致性和Ignite持久化 :若是使用了Ignite的原生持久化,那麼全部的更新都會寫入預寫日誌(WAL)文件中來保證一致性,即便事務執行期間集羣或者某個節點故障,也沒有問題。WAL的目的是,以附加模式將更新傳播到磁盤,這是將數據持久化到磁盤的最快方式,若是集羣或者某個節點故障,WAL提供了一個故障場景的恢復機制,集羣老是能夠恢復到最近成功提交的事務狀態。
一致性和第三方持久化 :若是Ignite做爲緩存層運行於第三方數據庫之上,好比RDBMS,Ignite仍然會保證緩存數據和外部數據的事務一致性。好比,若是RDBMS做爲持久化層,Ignite會在將提交消息發給相關的集羣節點以前,將事務寫入數據庫,這樣的話,若是在數據庫層發生事務故障,Ignite仍然會將回滾消息發給全部的相關節點,從而保持二者之間的數據一致性。
5.四、關鍵特性:並置處理
基於磁盤的系統,好比RDBMS以及NoSQL,一般使用傳統的C/S模式,這時數據是要從服務端傳輸到客戶端的,在客戶端進行處理,而後可能被丟棄。這個方法沒法擴展,由於在分佈式系統中經過網絡移動大量數據是很是昂貴的操做。
一個擴展性更好的方法是並置處理,它會反過來將計算帶到數據實際駐留的服務端節點,它會在數據實際存儲的地方執行高級的業務邏輯或者分佈式SQL,甚相當聯,避免了昂貴的序列化和網絡開銷。
5.五、關鍵特性:機器學習
Ignite的機器學習(ML)是一套簡單、可擴展以及高效的工具,能夠構建可預測的機器學習模型,而不須要昂貴的數據傳輸。
將機器和深度學習加入Ignite的原理是很簡單的,當前,若是要想讓機器學習成爲主流,數據科學家要解決兩個主要的問題:
問題#1:常規數據遷移(ETL)
首先,模型是在不一樣的系統中訓練和部署(訓練結束以後)的,數據科學家須要等待ETL或者其餘的數據傳輸過程,來將數據移至好比Apache Mahout或者Apache Spark這樣的系統進行訓練,而後還要等待這個過程結束而且將模型部署到生產環境。在系統間移動TB級的數據可能花費數小時的時間,此外,訓練部分一般發生在舊的數據集上。
問題#2:水平擴展能力缺少
第二個問題和擴展性有關。機器學習和深度學習須要處理的數據量不斷增加,已經沒法放在單一的服務器上。這促使數據科學家要麼提出更復雜的解決方案,要麼切換到好比Spark或者TensorFlow這樣的分佈式計算平臺上。可是這些平臺一般只能解決模型訓練的一部分問題,這給開發者以後的生產部署帶來了不少的困難。
Ignite的機器學習組件包括一組遺傳算法(GA),它是一種經過模擬生物進化過程來解決優化問題的一種方法。遺傳算法很是適合於以最優的方式檢索大量複雜的數據集,在現實世界中,遺傳算法的應用包括:汽車設計、計算機遊戲、機器人、投資、交通和運輸等等。
5.六、關鍵特性:多語言支持
Ignite是以Java語言爲主進行開發的,所以能夠在JVM支持的任何操做系統和架構上部署和運行,好比,Ignite能夠部署在Linux、Windows、MacOS、Oracle Solaris等操做系統上,支持x8六、x6四、SPARC、PowerPC指令集架構。
Java的API支持Ignite的全部功能,使用Java或者Scala開發的應用,相關的邏輯能夠直接嵌入Ignite,而後藉助於SQL以及鍵-值操做與集羣進行交互,執行分佈式計算和機器學習算法等等。
除了Java,Ignite還支持.NET平臺,Ignite.NET和Ignite C++使用JNI(Java Native Interface),會把大部分的調用轉發給Java,這裏須要注意的是,JNI的負載很是小,不會致使性能的降低,尤爲是在分佈式環境,總體的應用性能中網絡是主要的開銷。
使用標準的JDBC或者ODBC鏈接,能夠像其餘的SQL存儲同樣與Ignite進行交互。Ignite還爲Java、.NET和C++開發者提供原生的SQL API,性能更好。
要使用其餘的語言訪問Ignite,好比Python、Ruby、PHP或者NodeJS,能夠考慮使用Ignite的二進制客戶端協議,JDBC或者ODBC驅動,或者文檔中提到的其餘客戶端協議。
6.一、擴展特性:服務網格
服務網格能夠在集羣中任意部署自定義的服務,能夠實現和部署任意服務,好比自定義計數器,ID生成器,分級映射等。
服務網格的主要應用場景是提供了在集羣中部署各類單例服務的能力。可是,若是須要一個服務的多實例,Ignite也能保證全部服務實例的正確部署和容錯。
6.二、擴展特性:數據注入和流計算
Ignite流式計算容許以可擴展和容錯的方式處理連續不中斷的數據流。在一箇中等規模的集羣中,數據注入Ignite的比例會很高,很容易達到每秒百萬級的規模。
Ignite能夠與主要的流處理技術和框架進行集成,好比Kafka、Camel、Storm或者JMS(Java Message Service),他們能夠爲基於Ignite的架構帶來很是強大的功能。
數據加載:Ignite提供了若干種技術來對數據進行預加載,好比,開啓原生持久化後,Ignite的流處理API就是一個好的選擇,若是使用第三方存儲,那麼使用CacheStoreAPI能夠直接接入。
工做方式:
客戶端將流式數據注入Ignite;
數據在Ignite數據節點中自動分區;
數據在滑動窗口中併發處理;
客戶端在流式數據中執行併發SQL查詢;
客戶端訂閱數據變化的持續查詢。
6.三、擴展特性:RDBMS集成
Ignite能夠與任何支持JDBC驅動的關係型數據庫(RDBMS)進行集成,包括Oracle, PostgreSQL, Microsoft SQL Server, 和MySQL。
RDBMS集成嚮導 :經過Web控制檯,Ignite支持自動化的RDBMS集成,它是一個交互式的配置嚮導、管理和監控工具,功能包括:
建立和下載各類集羣的配置文件;
從任何RDBMS模式中自動化地構建Ignite的SQL元數據;
在內存緩存中執行SQL查詢;
查看查詢的執行計劃、內存模式和流化圖表。
Ignite提供的Web控制檯是一個創新的工具,它提供了豐富的功能來管理集羣,並不限於上述提到的這些功能。
6.四、擴展特性:分佈式數據結構
Ignite以分佈式的形式支持基於java.util.concurrent框架的大部分數據結構。好比,能夠在一個節點上使用java.util.concurrent.BlockingQeque加入一些東西,而後再另外一個節點上獲取它。或者有一個分佈式的ID生成器,他能夠保證全部節點上的ID惟一性。
支持的數據結構包括:
Concurrent Map (Cache)
分佈式隊列和集合
AtomicLong
AtomicReference
AtomicSequence (ID生成器)
CountDownLatch
ExecutorService
6.三、擴展特性:消息和事件
Ignite提供了集羣範圍的高性能的消息功能,支持基於發佈-訂閱以及直接點對點通訊模型的數據交換。消息能夠以有序的,也能夠以無序的方式進行交換。有序消息會稍微有點慢,可是若是使用的話,Ignite會保證收到消息的順序和發送消息的順序一致。
當在分佈式網格環境中發生各類事件時,Ignite的分佈式事件功能可使應用收到通知。能夠自動地收到集羣內的本地和遠程節點上發生的任務執行、讀寫和查詢操做的通知,事件通知也能夠分組在一塊兒而後分批或者按期地發送。
參考資料