Zeppelin源码分析(2)——编译、调试和Maven modules分析 - Duttor

专注人工智能在金融领域的应用

Zeppelin源码分析(2)——编译、调试和Maven modules分析

Zeppelin本质上是一个Web应用程序,它以独立的JVM进程方式来启动Interpreter(解释器),交互式(repl)执行各种语言的代码片段,并将结果以HTML代码片段的形式返回给前端UI。

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

主要技术栈如下:

  1. 前端:AngularJS、Node.JS、WebSocket、Grunt、Bower、Highlight.js、BootStrap3js
  2. 后端:Jetty(embedding)、Thrift、Shiro(权限)、Apache common-exec、Jersey REST API

Zeppelin的编译

编译环境:JDK7.x、maven3.x+、Node.js(npm)

源码地址:https://github.com/apache/zeppelin.git

文中将用${ZEPPELIN_HOME}指代源码根目录。使用如下maven命令编译并生成zeppelin的发布包:

mvn  install -Pbuild-distr -Pspark-1.6 -Dspark.version=1.6.2 -Phadoop-2.7 -Dhadoop.version=2.7.2  [-Pr|-Psparkr] -Ppyspark -Dmaven.findbugs.enable=false -Drat.skip=true -Dcheckstyle.skip=true -Denforcer.skip=true -Dcobertura.skip=true -DskipTests -X

  1.  执行install将artifact安装到maven本地仓库,便于之后import到IDE进行调试。
  2. -Pbuild-distr,表示启用build-distr这个maven profile,是为了在zeppelin-distribution这个module中生成可分发包。
  3.  [-Pr|-Psparkr]需要注意,表示这2个profile只能启用一个,这2个profile编译出来的Interpreter会bind到相同的名字%r,造成冲突(参见zeppelin的mailinglist)。–Pr,表示启用r这个mavenprofile,会将${ZEPPELIN_HOME}/r作为一个module参与编译,编译完成得到sparkR Interpreter。运行zeppelin自带的R Tutorial这个Note,需要改Interpreter。-Pspark-1.6这个profile并不会使得sparkr这个Interpreter被编译打包,因为该Interpreter的编译在${ZEPPELIN_HOME}/zeppelin-spark/pom.xml中采用id=exclude-sparkr,activeByDefault=true的profile默认禁用掉了。如下:

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

常见错误解决:

如果在maven build过程中,出现enforcer、checkstyle、rat plugin相关的错误,可以分别使用这3个plugin的user property跳过该plguin的执行:-Denforcer.skip=true, -Dcheckstyle.skip=true 和-DskipRat=true

distribution结构分析

编译完成之后,会在zeppelin-distribution/target/目录下生成如下结构的分发包:

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

bin目录存储了zeppelin的启停控制脚本:

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

各个脚本作用如下:

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

conf

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

interpreter

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

每个针对具体的某种语言实现的Interpreter,存放的是编译好的jar包,以及该interpreter的依赖,其中spark子目录的结构如下:

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

需要注意的是:如果定义了SPARK_HOME环境变量,该目录下的zeppelin-spark*.jar脚本将通过${SPARK_HOME}/bin/spark-submit到spark集群上去执行。

详情参见${ZEPPELIN_HOME}/bin/interpreter.sh脚本。

notebook

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

该目录是默认的notebook的持久化存储目录,zeppelin默认的notebook持久化实现类是org.apache.zeppelin.notebook.repo.VFSNotebookRepo,该实现会以zeppelin.notebook.dir配置参数指定的路径来存储notebook(默认是json格式)

<property>
  <name>zeppelin.notebook.dir</name>
  <value>notebook</value>
  <description>path or URI for notebook persist</description>
</property>

由于该value指定的uri不带scheme,默认会在${ZEPPELIN_HOME}目录下创建notebook子目录用于存储各个notebook,以notebook的id为子目录名字。

 zeppelin源码调试

  1. 首先必须保证执行过mvn install,该命令保证所有的artifact均已安装到maven的本地仓库。
  2. 以idea为例,安装maven和scala插件。然后import现有的maven的工程。
  3. 新建Maven Debug Configuration,有2点需要注意:a) working directory的设置必须到zeppelin-server,不能直接到zeppelin.git(我本机的${ZEPPELIN_HOME},zeppelin-server的上一级)。

    b) 使用maven 的exec:javaplugin来执行,让maven管理classpath。

  4. 打开org.apache.zeppelin.server.ZeppelinServer,在main之后设置断点即可启动调试。

源码结构分析

module组成

zeppelin的maven项目共有26个module,其中7个框架相关的module如下:

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

zeppelin的框架部分代码主要是以上几个module,余下19个module全部是为了支持各种语言的interpreter实现的module,如下:

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

关于如何定制interpreter支持新语言,参见how to write a zeppelin interpreter。

Module之间的依赖关系如下:

《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

 


 《Zeppelin源码分析(2)——编译、调试和Maven modules分析》

长按二维码,关注程序员王小闲

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>