Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,
Zeppelin基本框架:
源码是官方提供的最新的Zeppelin0.74版本。
index0:废话:
研究了网上很多大神的佳作,和自己的亲身深入体验,尽自己最大努力讲的清楚一点把。
Index1:基本模块
看图说话:
Zeppelin-server模块
Zeppelin-server:整个系统入口,提供服务器功能、权限认证以及用户校验等功能。该模块中有个ZeppelinServer类,直接run,可以打开localhost:8080,web页面。
Zeppelin-zengine模块
- Note
- 由paragraph组成,权限控制、共享和持久化的最小单位。
- Paragraph
- 代码执行的最小单位,负责获取代码文本,执行过程控制及返回结果获取。
- Notebook
- Note的manager类,负责Note的CURD,复制、导入导出;Note和相关Interpreter配
- 置和运行时映射关系的维护。
- NotebookServer
- 主要是将其他类封装,提供WebSocket等通信服务。
- NotebookRepo
- 持久化层顶层接口,规定了持久化层的基本操作。
- AzureNotebookRepo
- 数据存入Azure云的实现。
- S3NotebookRepo
- 数据存入Amazon S3文件系统的实现。
- VFSNotebookRepo
- 数据存入文件系统的实现
- GitNotebookRepo
- 使用Git对Note进行版本管理的实现
- NotebookRepoSync
- 使note在本地系统与远程系统之间同步的实现类。
- ZeppelinHubRepo
- 存入ZeppelinHub的实现类。
InterpreterSetting
维护interpreter相关元信息,维护note与interpreterGroup的关系- InterpreterFactory
- 负责创建interpreter实例,interpreter配置文件的加载与持久化,interpreterSetting的管理。
Zeppelin-interpreter模块
Interpreter模块是Zeppelin项目的核心模块,以下为主要的类:
Interpreter
Interpreter是一个抽象类,规定了所有解释器必须实现的功能。所有解释器都要继承这个抽象类,通过不同的具体实现,来完成不同语言的解释执行。RemoteInterpreterService
此类由Thrift自动生成,定义了主进程与独立JVM解释器进程间的通信协议。InterpreterGroup
一组Interpreter,用于启动启动和停止解释器JVM的最小单元。RemoteInterpreterProcess
采用独立JVM启动interpreter的具体执行类RemoteInterpreter
远程interpreter的本地代理InterpreterOption
决定Zeppelin创建interpreter进程时的处理方式。
Zeppelin-web模块
这四个是最主要的模块,剩下的看这个吧,网上大神整理的感觉特别好,刚拿到整个项目时,这个表格可以帮助你快速的了解整个项目的模块功能
名称 | 说明 | 实现语言 |
zeppelin-server | 整个系统入口,提供服务器功能、权限认证以及用户校验等功能 | Java |
zeppelin-zengine | 实现Zeppelin中Notebook的持久化和检索功能 | Java |
zeppelin-interpreter | 执行解释器 | Java |
zeppelin-web | 业务脚本语言编写、数据分析界面、数据可视化与结果导出 | AngularJS |
zeppelin-display | 让前端的AngularJS元素与后台数据进行绑定,进行数据交互 | Scala |
zeppelin-distribution | 用于存放编译后的二进制安装包 | |
zeppelin-examples | 示例代码,用于测试 | |
========================================以上是资源整合部分=====================================
Zeppelin源码:Zepplin-zengine部分
了解这部分源码之前我们先了解一下相关的基本几个类吧:
Paragraph:是执行部件的表现形式,也就是执行的最小单元,对应在web上我们写的代码,我将它比作日记本的每一行字
作用:1:获取代码文本,分离出用户设置的解析器例如%sql,得到相对应解释器的信息,解析用户写的代码段
2:继承Jobl类,代码执行,控制代码过程是开始还是中止,对应用户在web页面上的操作
3:执行结果的返回
note :是notebook的内存对象,zeppelin管理比如持久化,或者共享的最小单元,很多功能与管理Paragraph有关,
对应web上多个代码框,我将它比喻成日记本的一页纸。
notebook:是note的collection,是note的管理者,可以把它看作一个日记本。
作用:1:note的增删改查,克隆,导出,导入
2:维护note和相关解释器的映射,包括note与interpreter的映射,interpreter与具体配置的映射
=============下面从执行最小的单元开始Paragraph介绍吧=============
public class Paragraph extends Job implements Serializable, Cloneable
/* job是一个抽象类,可以控制job的中断,运行等对应着web端的控制,即Paragraph的执行状态受job控制 */
主要字段:
- 1:private static final long serialVersionUID = -6328572073497992016L;//实现序列化的UID
- 2:private static Logger logger = LoggerFactory.getLogger(Paragraph.class);//日志输出
- 3:/*
- 是 Interpreter 接口的工厂类,各种 Interpreter,
- 其实这个类创建出来的全部都是主进程中的代理)都是从这个类中创造出来的,
- 换句话说,这个类专门为独立的解释器进程创建代理对象
- */
- 4:private transient InterpreterFactory factory;
- 5:private transient InterpreterSettingManager interpreterSettingManager;//Interpreter设置类对象
- 6:private transient AuthenticationInfo authenticationInfo;//身份验证用的
- 7:/**
- userParagraphMap里面存了<key:用户名,value :paragraph对象>,可以获得user和其对应的paragraph内容
- */
- private transient Map<String, Paragraph> userParagraphMap = Maps.newHashMap();
- 8:String text;//代码文本内容
- 9:String user;//用户名
- 10:Date dateUpdated;//更新时间
- 11:public GUI settings //GUI 表单和参数变量设置,主要是记录一些客户端属性配置
- 12:Object results;//结果属性
- 13:
/** * Applicaiton states in this paragraph * 应用程序的状态:loading;unloded;loaded;error * 把每个应用的状态存到了List中 */
private final List<ApplicationState> apps = new LinkedList<>();
主要方法:
1: 构造函数:通过构造器,将上面的参数进行初始化,无参的构造器读取系统的默认参数。
2: private static String generateId()//生成一个id,格式为:“paragraph_+时间戳+随机数”作为 paragrathID作为识别
3: public Map<String, Paragraph> getUserParagraphMap() //得到UserParagraphMap字段内容,对 外调用这个私有化字段用的
4: public void clearUserParagraphs() //清除内容
5: public static String getRequiredReplName(String text)
/*
根据text内容,将用户引用的解析器名,比如在web端输入%sql 将sql分离出来:先判断text是否以%开头,如果返回null。调用默认的interpreter,
如果不为空,从text开头遍历,遇到回车或者“( ”或者空白字符就停止,然后截取text字段返回给head即为引用的解释器名字
*/
6: public String getScriptBody() //从getRequiredReplName这里的下角标开始截取到最后就是脚本内容了返回text
7: public Interpreter getRepl(String name)
{return factory.getInterpreter(user, note.getId(), name);}
/*
内部是通过
getInterpreterSettings这个方法,获取Map<String, List<String> interpreterBindings>;
而
interpreterBindings里面是个map集合:<key:noteId,value:Interpreter的settings<list> >
Interpreter的settings里面是interpreterBindings对象,
*/
8:public Interpreter getCurrentRepl() {
return getRepl(getRequiredReplName()); } //通过获取的用户引用的解析器名字,从factory里拿出相对应的解释器
9:public List<InterpreterCompletion> getInterpreterCompletion() //直接上图这里
这是InterpreterSetting类里的字段内容
10: public List<InterpreterCompletion> completion(String buffer, int cursor)//这个方法对具体的代码进行 解析
11:protected boolean jobAbort() { //中止job
12:
public InterpreterContextRunner getInterpreterContextRunner() { /* ParagraphRunner(note对象,noteid,jobid) note里面是对paragraph的一系列解析呀管理呀设置呀包括对应的Interpreter的信息呀,监听等,并且控制paragraph的crut */ return new ParagraphRunner(note, note.getId(), getId());
}
13:重点内部静态类,代码执行的关键地方
static class ParagraphRunner extends InterpreterContextRunner {private transient Note note;public ParagraphRunner(Note note, String noteId, String paragraphId) {super(noteId, paragraphId);this.note = note;}@Overridepublic void run() {note.run(getParagraphId());} }
这个paragraphrunner类继承了InterpreterContextRunner抽象类,要重写run方法,这个run方法是关键
进入run方法 是note对象的run方法,我们跟踪进入看一下。
到此为止还没完 最后又调用了submit这个方法!!!!这个submit是Scheduler抽象类的抽象方法,我们从他的实现类
FIFOScheduler.submit进去看一下!!!!
剩下的以后抽时间再写吧,写了四个小时了,有些地方还没缕清楚明白,未完待续!
Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,相关推荐
- 黯然微信小程序杂记(二):小程序最新版登录并进行缓存模块的实现 附源码
黯然微信小程序杂记(二):小程序最新版登录进行缓存模块的实现 附源码 一.功能描述 二.mine.wxml界面图片 三.mine.wxml代码 四.mine.wxss代码 五.mine.js代码 六. ...
- Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统
Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统 0.环境 1.MQTT 源码下载(也可以去官网下载) 2.MQTT源码解压成功复制 src/mqtt 文件夹到工程中 3.我 ...
- django模块http之cookie源码解析
上一章对django的HttpResponse的源码进行分析,对上一篇存在的cookie源码问题,用这篇博客进行分析,若想看关于HttpResponse详解的可点击django模块http之HttpR ...
- php 授权模块,PHP免授权功能模块:智慧农场小程序 1.8.9后台模块前端小程序源码模块插件...
功能模块:智慧农场小程序 1.8.9后台模块+前端小程序源码 内容介绍: 版本号:1.8.9 – 普通版注意:1.本次更新需要重新上传小程序 2.本次更新内容较多,请注意备份–新增小程序自己添加收货地 ...
- Python torch 模块,randperm() 实例源码
参考Python torch 模块,randperm() 实例源码 - 云+社区 - 腾讯云 torch.randperm(n, *, out=None, dtype=torch.int64, lay ...
- Tengine怎么去安装第三方模块、以及安装源码中的模块
Tengine怎么去安装第三方模块 检查配置文件nginx.conf的内容编辑后是否有错误 nginx -t 有以下错误,需要下载第三方模块 nginx: [emerg] unknown direct ...
- 未能加载文件或程序集rsy3_abp vnext2.0之核心组件模块加载系统源码解析
abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...
- abp vnext2.0之核心组件模块加载系统源码解析
abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...
- 【C#+SQL Server+打印组件】实现电商快递单打印系统 五:快递单打印模块设计(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.快递单打印模块概述 由于一个用户可能使用多种类型的快递单,所以在快递单打印窗体中提供了自由选择快递单种类的功能,在确定使用某一种快递单后,程序将 ...
- 【C#+SQL Server+打印组件】实现电商快递单打印系统 六:快递单查询模块设计(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.快递单查询模块概述 打印后的快递单记录被保存到数据库中,快递单查询窗体提供了查询打印记录,修改打印记录,删除打印记录以及重新打印单据的功能 实现 ...
最新文章
- [emuch.net]MatrixComputations(1-6)
- Android实用应用程序源码
- led灯串怎么摆造型_如何驱动LED灯串小绝招
- tensorflow 1.0 学习:参数初始化(initializer)
- spark wordcount完整工程代码(含pom.xml)
- 用文本指导文本:基于文本的自监督可控文本生成模型
- 看微软 Windows 30年发展简史,你用过最早的系统版本是什么?
- Unity Android解决信息流广告关闭报错
- eq linux_音乐家和音乐爱好者的开放硬件 | Linux 中国
- 顺序线性表的基本操作(C语言实现)
- Scrapy:学习笔记(2)——Scrapy项目
- 【重识 HTML + CSS】定位
- wordpress数据库转移
- 突破XXX,冲上Google+
- 20200105每日一句
- 2019-01-01T00:00:00.000Z 这种时间日期类型格式是属于:格林尼治时间
- paddle 基础函数 cosine_decay
- C语言:数组排序(插入法排序)
- 蒙特卡洛方法求圆周率
- 预训练模型微调 | 一文带你了解Adapter Tuning
热门文章
- 有监督的SAR变化检测公开数据集
- 【微信H5开发】the permission value is offline verifying
- ArcGIS Pro与ArcGis区别
- Spatiotemporal Multi-Graph Convolution Network for Ride-Hailing Demand Forecasting
- CobaltStrike木马免杀代码篇之python反序列化分离免杀(一)
- Oracle初学者入门指南-什么是DSI?
- 睡不着?用药成瘾?深受失眠困扰的北上广白领们必看
- 失业的程序员(十二):潜意识的智商
- html图片幻灯片效果,使用CSS3实现的超酷幻灯图片效果
- 如何添加网络打印机-查看IP地址就可以