Zeppelin 架构:
首先我们来了解下 Zeppelin的架构, Zeppelin 主要分3层。
Web前端
Zeppelin Server
Interpreter
Zeppelin前端负责前端页面的交互,通过Rest API 和WebSocket的方式与Zeppelin Server进行交互。
Zeppelin Server是一个Web server,负责管理所有的note,interpreter 等等,Zeppelin Server不做具体的代码执行,会交给Interpreter来执行代码
Interpreter 是一个独立的进程,负责具体前端用户提交的代码的执行(比如Spark Scala代码或者SQL代码等等)。Zeppelin Server与 Interpreter 自己是通过thrift 来进行通信,而且是双向通信。Zeppelin支持目前大部分流行的大数据引擎,上图只展示了其中3种比较常用的引擎:Flink,Spark,Jdbc
Zeppelin Server是独立的进程,进程日志在logs目录下的 zeppelin-{user}-{host}.log, 每个Interpreter也是一个独立的进程,进程日志是 logs目录下的 zeppelin-interpreter-{interpreter}-*.log, 所以如果碰到任何问题可以先去这两个log文件里去查找线索
关于zeppelin采用WebSocket技术的必要性问题,这里也做一下简单分析。zeppelin是共享式、Notebook式的大数据分析环境,以repl的方式执行以Paragraph为最小粒度的代码段。
1. 首先repl的方式强调实时反馈执行结果,特别是在大数据环境下,一段代码可能需要执行很长时间,在执行的过程中,zeppelin的用户期望看到执行进度和中间结果,需要在前后端之间建立一个长连接,便于实时传递数据。
2. 另外zeppelin的另一个亮点是其结果可视化能力,需要在前后台传递图片,并且支持较大数据量的传输的能力(相对传统http技术)。
3. 再者,由于是共享式环境,一个Note可能被多个用户同时看到、甚至编辑,需要在各个已经打开了同一个Note的web客户端之间同步Note的代码、执行结果和进度信息。
zeppelin 涉及到的技术
前端:
AngularJS
zeppelin 前端websocket 发送请求代码:zeppelin-web\src\components\websocket\websocket-message.service.js
后端:
Zeppelin使用了Jetty作为内嵌服务器,通信方式除了WebSocket,还使用Jersey框架提供了Restful服务。
由于Zeppelin的解释器(Interpreter)是独立的JVM进程,因此Zeppelin使用Apache Commons Exec框架来使主进程可以启动解释器进程,并且使用Thrift框架在主进程与解释器进程间进行通信。
Zeppelin还提供了Apache Shiro进行权限控制,使用Apache Lucence对Note进行全文检索。
后端启动服务的代码(Zeppelin Server 程序的入口类):zeppelin-server\src\main\java\org\apache\zeppelin\server\ZeppelinServer.java
后端接收websocket请求的代码:zeppelin-server\src\main\java\org\apache\zeppelin\socket\NotebookServer.java
后端接受rest请求的代码:zeppelin-server\src\main\java\org\apache\zeppelin\rest\NotebookRestApi.java
参考:
Apache Zeppelin · 语雀
https://www.jianshu.com/p/02596c7a2342
https://blog.csdn.net/swimhigh/article/details/80755666#comments_8150094
https://code-monkey.top/2019/06/12/Zeppelin%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-note%E7%9A%84%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B/
https://blog.csdn.net/spacewalkman/article/details/69230145
zeppelin涉及到的相关技术介绍:
(1)websocket 介绍
WebSocket 教程 - 阮一峰的网络日志
Websocket技术的Java实现(上篇)_@serverendpoint路径_KeepStruggling的博客-CSDN博客
(2)java8 function新特性
Java8新特性二: Functional Interfaces - 知乎
(3)commons-exec 执行command命令
程序员的福音 - Apache Commons Exec - 知乎
(4)thrift
Apache Thrift系列详解(一) - 概述与入门 - 掘金