Hazelcast發布開源流處理引擎Jet
Hazelcast主要以開源緩存和內存數據網格技術(通常稱為Hazelcast IMDG,或者只是Hazelcast)為人所熟知。然而過去的兩年中,他們一直致力于一個新的、重要的開源項目Hazelcast Jet,近日,他們宣布了這項新技術的一個主要版本。
InfoQ與Hazelcast首席執行官Greg Luck和Jet核心團隊工程師Marko Topolnik取得了聯系,進一步了解此次發布的激動人心之處。
InfoQ:據介紹,Jet是流處理領域的巨大改進。您能解釋下為什么嗎?
Luck:Jet的主要目標是讓運算速度快的大數據成為應用程序基礎設施的一部分。類似Spark和Hadoop這樣的技術過多地干擾了應用程序開發人員架構和思考。我們希望Jet可以為開發人員提供工具,讓他們專注于問題本身,而不是應用程序管道構建。
Jet還提供了突破性的性能——我們有Jet和其他引擎的橫向性能對比數據——全都是基于配備旋轉磁盤的10節點集群測得——性能數據說明了一切。
InfoQ:您能介紹下你們在Jet研發過程中所做的架構及技術決策嗎?與當前市場中已有的一些同類產品——尤其是Apache Spark——相比,它有什么與眾不同之處嗎?
Topolnik:我們決定,以“多任務處理(cooperative multithreading)”作為核心執行引擎建模的原則,也就是人們常說的“綠色線程”。這就是說,我們不是讓操作系統調度我們的工作,而是有多少CPU內核可用就啟動多少線程,運行任何東西都是這樣。我們的基本處理單元,我們稱之為tasklet,每次被調用時都會做一點工作實現與執行引擎的協作,然后就回歸本身的處理工作。由于我們使用了具有智能批處理功能的有界并發隊列,所以這種工作模式來得很自然:每個tasklet調用處理已經在隊列中的數據。
我們為什么認為這是一個好方法呢?首先,上下文切換的成本幾乎為零。從一個tasklet切換到下一個tasklet幾乎不需要任何邏輯。其次,我們獲得了CPU內核親和性的效果:tasklet不會在線程之間跳來跳去,每個工作線程都極有可能固定在一個內核上。這意味著CPU緩存命中率會很高。最后,通過檢查輸入/輸出隊列,我們就可以立即知道哪個tasklet已經準備好了運行。如果我們使用本地線程,我們就必須使用阻塞隊列,而這種隊列采用相對重量級的wait/notify機制,我們必須受操作系統支配,必須由它決定什么時候運行我們的任務。
第二個重要的決策是在所有地方都使用單生產者/單消費者的并發隊列。為了將N個上游tasklet和M個下游tasklet連接起來,我們需要NxM個隊列;不過,這讓我們可以在兩端都使用速度極快的無等待算法。我們甚至不需要寫入內存,因為我們使用了lazySet,它只需要在CPU的存儲緩沖區上將數據項加入隊列。在消費者端,在將整個隊列存入線程本地存儲后,我們只需要一個lazySet。
Luck:當然,這些想法受了Martin Thompson及其創立的Mechanical Sympathy的直接影響。
InfoQ:Hazelcast IMDG已經有了一個相當巧妙&直觀的劃分方法。Jet對此有什么改進?除了簡單地“將Runnable發送給一個特定的數據劃分”之外,在其他什么場景下可以看到大幅的改善?
Topolnik:將Runnable發送給一個劃分類似于單個DAG頂點的工作。Jet的優勢在于,它能夠讓頂點轉換其讀到的數據,生成不屬于同一個劃分的數據項,然后重新組織并發送給下游頂點,再次正確劃分。由于任何類型的map-reduce操作的reduce單元都必須觀察到所有具有相同鍵的數據項,所以這是至關重要的。為了最小化網絡流量,Jet可以首先減少本地成員生成的數據切片,然后針對每個鍵只發送一個數據項給遠程成員,而后者會將這些部分結果合并。
Luck:我們也有一個java.util.stream的分布式版本,它可以很好地與Jet架構配合,因為我們將源和匯作為Jet的核心部分。在未來版本中,我們還會將Map-with-Predicate作為一個源加入進來,讓篩選和“場投影(field projection)”充當Jet的流數據源。
InfoQ:您認為,在什么特殊的行業或場景中,Jet會產生特別的影響或者特別成功?
Luck:我們認為,Jet對IoT、金融服務、支付處理、欺詐及其他大量使用CEP(復雜事件處理)的行業都將十分有利。我們覺得,對于Jet而言,關鍵是,當你在一個業務上下文中執行DAG運算時,它能發揮多大的作用,而不僅僅是作為分析工具的一部分。
InfoQ:對于Jet,你們會遵循和IMDG一樣的產品策略嗎?也就是說,開源,但需要付費獲得支持及高級功能。
Luck:還不一定。從今天(2月8日)開始,我們將為Jet提供專業的支持,和IMDG一樣。Jet將可以很好地與IMDG結合,因此,我們預計,在Jet推出之后,IMDG的應用會增加,但是,Jet沒有哪一部分是閉源的,將來也不會有。今年晚些時候,我們可能會增加管理監控作為付費特性,雖然那比較明確,但一切都還未定。
我們目前關注的不是將用Jet賺錢——我們只是想讓它成為一個遵循Apache 2許可協議的、成功的開源項目。
InfoQ:Jet的路線圖是什么樣的?
Luck:現在發布的是0.3版本,之后我們計劃每個月發布一次。
我們還計劃在兩周之后發布0.3.1——只是稍微整理下幾個錯過0.3版本的部分。特別地,0.3.1版本將和IMDG 3.8一起發布,而且還會增加Jet集群(甚至于已經在運行的任務)彈性擴展功能。
0.4版本應該會包含大量的性能方面的工作。雖然Jet的性能已經非常出眾,但我們會對0.4做進一步的改進。我們還將增加JCache支持以及將IMDG監聽器作為一個真正的流源。當前版本已經支持IMDG,但是作為一個批處理源,所以,我們還希望增加真正的流支持。
我們已經支持Kafka和HDFS,但還需要做一些性能工作及更多的文檔,讓它們進入到一等支持狀態。
我們還有一些其他的特性,包括一個DAG可視化工具,我們希望將其作為一個Eclipse及IntelliJ插件發布。
我們希望先向社區推出Jet,然后聽聽社區的聲音——那樣一來,一旦Jet確定下來,路線圖在很大程度上將是社區驅動的。
來自:http://www.infoq.com/cn/news/2017/02/HazlecastJetOSS