前言
本文基于Apache Zeppelin 0.72版本對(duì)Zeppelin的源代碼進(jìn)行分析。
什么是Zeppelin
Apache Zeppelin是一款大數(shù)據(jù)分析和可視化工具慰毅,可以讓數(shù)據(jù)分析師在一個(gè)基于Web頁面的筆記本中窃祝,使用不同的語言,對(duì)不同數(shù)據(jù)源中的數(shù)據(jù)進(jìn)行交互式分析迈着,并對(duì)分析結(jié)果進(jìn)行可視化的工具。
簡(jiǎn)單來說,Zeppelin的核心功能就是:通過不同的解釋器支持多種語言的repl鳖藕,并對(duì)返回結(jié)果進(jìn)行可視化展示。
Zeppelin的項(xiàng)目結(jié)構(gòu)
Zeppelin一個(gè)Web項(xiàng)目只锭,主要使用Java開發(fā)著恩,Maven構(gòu)建。它的語言構(gòu)成如下:
Zeppelin的maven項(xiàng)目由多個(gè)module組成,分為框架核心module和其他解釋器module喉誊。其中核心的module有8個(gè)邀摆,分別為:
- zeppelin-server
項(xiàng)目入口,通過Jetty內(nèi)嵌服務(wù)器提供WebSocekt服務(wù)和RESTful服務(wù)伍茄,并且提供了基本的權(quán)限驗(yàn)證服務(wù)栋盹。使用java編寫。 - zeppelin-zengine
實(shí)現(xiàn)Notebook的持久化和檢索服務(wù)敷矫,使用java編寫 - zeppelin-interpreter
抽象了interpreter接口例获,規(guī)定了解釋器的功能。并且提供了與zeppelin-zengine使用Thrift進(jìn)行通信的協(xié)議沪饺。使用java編寫躏敢。 - zeppelin-web
使用AngluarJS框架開發(fā)的前端。 - zeppelin-display
實(shí)現(xiàn)前臺(tái)Angular元素綁定后臺(tái)數(shù)據(jù)整葡。 - zeppelin-spark-dependencies
此module中沒有代碼件余,具體作用是使用戶可以使用zeppelin內(nèi)嵌的Spark。不過由于Zeppelin支持了太多的解釋器遭居,package size過大啼器,已經(jīng)有人提議在未來的版本中移除此模塊,詳情見Zeppelin的JIRA:https://issues.apache.org/jira/browse/ZEPPELIN-1332 - zeppelin-distribution
此模塊主要是為了Zeppelin打包使用 - helium-dev
這是在Zeppelin-0.7以后新加入的模塊俱萍,使interpreter端壳、storage等模塊可以在運(yùn)行時(shí)(Zeppelin不需要重啟)加入到Zeppelin中。不過目前helium相關(guān)的很多功能還處于Experimental階段枪蘑,因此不太建議在生產(chǎn)環(huán)境中使用损谦。
解釋器相關(guān)的module眾多,根據(jù)module的名字可以很容易看出解釋器的用途岳颇,在此不再贅述照捡。
Zeppelin用到的技術(shù)
前端
Zeppelin的前端主要使用AngularJS框架開發(fā),使用Node.js進(jìn)行包的構(gòu)建话侧。使用Jupyter Notebook實(shí)現(xiàn)記事本功能栗精,并且使用了Highlight.js和Bootstrap。
后端
Zeppelin使用了Jetty作為內(nèi)嵌服務(wù)器瞻鹏,通信方式除了WebSocket悲立,還使用Jersey框架提供了Restful服務(wù)。
由于Zeppelin的解釋器(Interpreter)是獨(dú)立的JVM進(jìn)程新博,因此Zeppelin使用Apache Commons Exec框架來使主進(jìn)程可以啟動(dòng)解釋器進(jìn)程薪夕,并且使用Thrift框架在主進(jìn)程與解釋器進(jìn)程間進(jìn)行通信。
Zeppelin還提供了Apache Shiro進(jìn)行權(quán)限控制叭披,使用Apache Lucence對(duì)Note進(jìn)行全文檢索寥殖。
Zeppelin源碼
解釋器模塊
Interpreter模塊是Zeppelin項(xiàng)目的核心模塊玩讳,以下為主要的類:
Interpreter
Interpreter是一個(gè)抽象類,規(guī)定了所有解釋器必須實(shí)現(xiàn)的功能嚼贡。所有解釋器都要繼承這個(gè)抽象類熏纯,通過不同的具體實(shí)現(xiàn),來完成不同語言的解釋執(zhí)行粤策。RemoteInterpreterService
此類由Thrift自動(dòng)生成樟澜,定義了主進(jìn)程與獨(dú)立JVM解釋器進(jìn)程間的通信協(xié)議。InterpreterGroup
一組Interpreter叮盘,用于啟動(dòng)啟動(dòng)和停止解釋器JVM的最小單元秩贰。RemoteInterpreterProcess
采用獨(dú)立JVM啟動(dòng)interpreter的具體執(zhí)行類RemoteInterpreter
遠(yuǎn)程interpreter的本地代理InterpreterSetting
維護(hù)interpreter相關(guān)元信息,維護(hù)note與interpreterGroup的關(guān)系InterpreterOption
決定Zeppelin創(chuàng)建interpreter進(jìn)程時(shí)的處理方式柔吼。InterpreterFactory
負(fù)責(zé)創(chuàng)建interpreter實(shí)例毒费,interpreter配置文件的加載與持久化,interpreterSetting的管理愈魏。
記事本模塊
Note
由paragraph組成觅玻,權(quán)限控制、共享和持久化的最小單位培漏。Paragraph
代碼執(zhí)行的最小單位溪厘,負(fù)責(zé)獲取代碼文本,執(zhí)行過程控制及返回結(jié)果獲取牌柄。Notebook
Note的manager類畸悬,負(fù)責(zé)Note的CURD,復(fù)制珊佣、導(dǎo)入導(dǎo)出蹋宦;Note和相關(guān)Interpreter配
置和運(yùn)行時(shí)映射關(guān)系的維護(hù)。NotebookServer
主要是將其他類封裝咒锻,提供WebSocket等通信服務(wù)妆档。
解釋器執(zhí)行調(diào)度器模塊
此處為“生產(chǎn)者——消費(fèi)者”模型,Note和RemoteInterpreterServer為生產(chǎn)者虫碉,Scheduler為消費(fèi)者,緩沖區(qū)為Scheduler內(nèi)部的Job隊(duì)列胸梆。產(chǎn)品為org.apache.zeppelin.scheduler.Job類敦捧。
SchedulerFactory
負(fù)責(zé)創(chuàng)建所有Scheduler,單例模式碰镜。Scheduler
調(diào)度器接口兢卵,規(guī)定了所有調(diào)度器必須實(shí)現(xiàn)的方法。FIFOScheduler
先進(jìn)先出調(diào)度器绪颖,不支持并發(fā)執(zhí)行ParallelScheduler
并發(fā)調(diào)度器秽荤,支持并發(fā)執(zhí)行RemoteScheduler
遠(yuǎn)程interpreter的代理甜奄。
記事本存儲(chǔ)模塊
- NotebookRepo
持久化層頂層接口,規(guī)定了持久化層的基本操作窃款。 - AzureNotebookRepo
數(shù)據(jù)存入Azure云的實(shí)現(xiàn)课兄。 - S3NotebookRepo
數(shù)據(jù)存入Amazon S3文件系統(tǒng)的實(shí)現(xiàn)。 - VFSNotebookRepo
數(shù)據(jù)存入文件系統(tǒng)的實(shí)現(xiàn) - GitNotebookRepo
使用Git對(duì)Note進(jìn)行版本管理的實(shí)現(xiàn) - NotebookRepoSync
使note在本地系統(tǒng)與遠(yuǎn)程系統(tǒng)之間同步的實(shí)現(xiàn)類晨继。 - ZeppelinHubRepo
存入ZeppelinHub的實(shí)現(xiàn)類烟阐。
搜索服務(wù)
- SearchService
搜索服務(wù)接口,目前只有一個(gè)實(shí)現(xiàn)類LucenceSearch - LucenceSearch
對(duì)Note進(jìn)行全文索引紊扬,方便提供搜索服務(wù)蜒茄。