Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,

Zeppelin基本框架:


源码是官方提供的最新的Zeppelin0.74版本。


index0:废话:

    研究了网上很多大神的佳作,和自己的亲身深入体验,尽自己最大努力讲的清楚一点把。

 Index1:基本模块

         看图说话:

Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,_第1张图片

         

         Zeppelin-server模块

                 Zeppelin-server:整个系统入口,提供服务器功能、权限认证以及用户校验等功能。该模块中有个ZeppelinServer类,直接run,可以打开localhost:8080,web页面。

      

     Zeppelin-zengine模块

                    Zeppelin-zengine: 实现Zeppelin中Notebook的持久化和检索功能,目录下有conf目录,helium,interpreter,notebook,search,tichet,util。

  • 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-zengine使用Thrift进行通信的协议,其实也就是在里面执行了解析器,并且与其他关联模块进行通信。

Interpreter模块是Zeppelin项目的核心模块,以下为主要的类:

  • Interpreter
    Interpreter是一个抽象类,规定了所有解释器必须实现的功能。所有解释器都要继承这个抽象类,通过不同的具体实现,来完成不同语言的解释执行。

  • RemoteInterpreterService
    此类由Thrift自动生成,定义了主进程与独立JVM解释器进程间的通信协议。

  • InterpreterGroup
    一组Interpreter,用于启动启动和停止解释器JVM的最小单元。

  • RemoteInterpreterProcess
    采用独立JVM启动interpreter的具体执行类

  • RemoteInterpreter
    远程interpreter的本地代理

  • InterpreterOption
    决定Zeppelin创建interpreter进程时的处理方式。


          Zeppelin-web模块

                          业务脚本语言编写、数据分析界面、数据可视化与结果导出,与我们用户直接交互的模块,localhost:8080就是这个模块实现的功能。
 

这四个是最主要的模块,剩下的看这个吧,网上大神整理的感觉特别好,刚拿到整个项目时,这个表格可以帮助你快速的了解整个项目的模块功能     

名称 说明 实现语言
zeppelin-server 整个系统入口,提供服务器功能、权限认证以及用户校验等功能 Java
zeppelin-zengine 实现Zeppelin中Notebook的持久化和检索功能 Java
zeppelin-interpreter 执行解释器 Java
zeppelin-web 业务脚本语言编写、数据分析界面、数据可视化与结果导出 AngularJS
zeppelin-display 让前端的AngularJS元素与后台数据进行绑定,进行数据交互 Scala
zeppelin-distribution 用于存放编译后的二进制安装包  
zeppelin-examples 示例代码,用于测试  
     
            当你cd/zeppelin/bin中启动 zeppelin-daemon.sh start 时,Zeppelin-server是整个系统的入口,在这个模块中启动一系列的服务,包括web等各个模块逐渐起来。在其他地方找到了一张模块关系图,大家可以借鉴一下。具体在哪找的我也忘了,看了太多,传送门等以后再看见了再传上。
Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,_第2张图片

========================================以上是资源整合部分=====================================

 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里面存了,可以获得user和其对应的paragraph内容
  • */
  • private transient Map 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 apps = new LinkedList<>();
 
  

主要方法:

1: 构造函数:通过构造器,将上面的参数进行初始化,无参的构造器读取系统的默认参数。

2: private static String generateId()//生成一个id,格式为:“paragraph_+时间戳+随机数”作为                                                 paragrathID作为识别

3: public Map 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 interpreterBindings>;

interpreterBindings里面是个map集合: >
Interpreter的settings里面是interpreterBindings对象,
*/
8:public Interpreter getCurrentRepl() {
  return getRepl(getRequiredReplName());
} //通过获取的用户引用的解析器名字,从factory里拿出相对应的解释器
 
  

9:public List getInterpreterCompletion() //直接上图这里

Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,_第3张图片

这是InterpreterSetting类里的字段内容

Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,_第4张图片

  10:  public List 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;
  }

  @Override
  public void run() {
    note.run(getParagraphId());
  }
}
 
  
这个paragraphrunner类继承了InterpreterContextRunner抽象类,要重写run方法,这个run方法是关键

进入run方法 是note对象的run方法,我们跟踪进入看一下。

Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,_第5张图片

Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,_第6张图片

到此为止还没完 最后又调用了submit这个方法!!!!这个submit是Scheduler抽象类的抽象方法,我们从他的实现类

FIFOScheduler.submit进去看一下!!!!

Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,_第7张图片

剩下的以后抽时间再写吧,写了四个小时了,有些地方还没缕清楚明白,未完待续!

你可能感兴趣的:(Zeppelin,zeppelin,最新版,框架,主要模块,源码分析)