zeppelin源码初探
主要看整个运行的流程。
1.组件部分
Paragraph代表着一段代码以及支撑其执行所需要的“环境信息”,是代码执行的最小单位。Paragraph的职责如下:
1. 获取代码文本,并解析分离类似%Spark的interpreter声明段和可执行代码段。
2. 代码执行,以及执行过程控制(进度和终止)
3. 代码执行结果获取
4. 代码中变量查找以及替换
Note是单个’记事本’的内存对象,是zeppelin管理的最小单位,无论是做权限控制、共享、还是持久化,都是以Note为粒度的。从类关系上看,Note是由一些列的有序Paragraph组成,因此其绝大部分职责都是与管理Paragraph有关:
Notebook实际上是Note的Manager,职责如下:
1. Note的CRUD,克隆、导入/导出
2. Note和相关Interpreter配置时和运行时映射关系维护
3. Note cron式调度执行控制
NotebookServer的主要功能是将Notebook、Note、Paragraph、Interpreter等类封装的能力,通过WebSocket的形式对web 客户端提供出去,所以其具体的职责包括:
1. 维护WebSocket连接与Note之间映射关系
2. 处理客户端和服务器之间的双向通信(通过WebSocket,具体的通信协议见:Message类),包括消息的序列化/反序列化,消息解析和服务端处理、处理结果的向客户端广播/单播发送等。
3. Note的CRUD操作以及Paragraph的CRUD操作、执行、导入、导出时的权限控制
4. 前后端AngularObject的双向bind处理
5. WebSocket客户端合法性校验(checkOrigin)
ZeppelinServer是各个组件的”组装者”,它是系统的主入口,职责如下:
1. 内嵌jetty服务器,支持以WebSocket和REST两种方式对外暴露系统功能
2. 创建NotebookServer实例,建立起处理WebSocket Connection和消息处理的服务端
3. 创建Notebook需要的相关依赖,如Note持久化服务(NotebookRepo)、Note的全文索引服务(SearchService),并完成向Note、Paragraph的注入。
4. Note权限配置文件的加载以及初始化
5. InterpreterFactory的初始化
6. 初始化动态依赖加载器(DependencyResolver)
2.运行部分
当我们启动zeppelin-daemon.sh start时:
- 这个脚本里面定义了这样一个ZEPPELIN_MAIN=org.apache.zeppelin.server.ZeppelinServer变量。而ZeppelinServer是各个组件的”组装者”,它是系统的主入口
- 在ZeppelinServer中启动了一系列的服务,包括web
NotebookServer是一个webSocket,在他的onMessage方法中,根据不同的消息类型,调用不同的方法
当我们运行一个mysql的select语句时,onMessage收到的消息是:消息是一个json的字符串,op即为我们的操作(运行这个代码块),data包含了一些信息。
{ "op": "RUN_PARAGRAPH"