简介

【百度百科】:Apache Zeppelin是一个让交互式数据分析变得可行的基于网页的notebook。Zeppelin提供了数据可视化的框架。
Apache Zeppelin是一个让交互式数据分析变得可行的基于网页的开源框架。Zeppelin提供了数据分析、数据可视化等功能。
Zeppelin是一个提供交互数据分析且基于Web的笔记本。方便你做出可数据驱动的、可交互且可协作的精美文档,并且支持多种语言,包括 Scala(使用 Apache Spark)、Python(Apache Spark)、SparkSQL、 Hive、 Markdown、Shell等等。

初识

Apache Zeppelin是一个可以进行大数据可视化分析的交互式开发系统,可以承担数据接入、数据发现、数据分析、数据可视化、数据协作等任务,其前端提供丰富的可视化图形库,不限于SparkSQL,后端支持HBase、Flink等大数据系统以插件扩展的方式,并支持Spark、Python、JDBC、Markdown、Shell 等各种常用Interpreter,这使得开发者可以方便地使用SQL在Zeppelin中做数据开发。
Zeppelin基础入门 - 图1
对于机器学习算法工程师来说,他们可以在Zeppelin中可以完成机器学习的数据预处理、算法开发和调试、算法作业调度的工作,包括当前在各类任务中表现突出的深度学习算法,因为Zeppelin的最新的版本中增加了对TensorFlow、PyTorch等主流深度学习框架的支持,此外,Zeppelin将来还会提供算法的模型Serving服务、Workflow工作流编排等新特性,使得Zeppelin可以完全覆盖机器学习的全流程工作。
在平台部署和运维方面,Zeppelin还提供了单机 Docker、分布式、K8s、Yarn 四种系统运行模式,无论你是小规模的开发团队,还是Hadoop技术栈的大数据团队、K8s技术栈的云计算团队,Zeppelin都可以让数据科学团队轻松的进行部署和使用Zeppelin丰富的数据和算法的开发能力。

原理架构

Zeppelin基础入门 - 图2

1. 基本架构

首先我们来了解下 Zeppelin的架构, Zeppelin主要分3层。

  • Web前端

Zeppelin前端负责前端页面的交互,通过Rest API 和WebSocket的方式与Zeppelin Server进行交互。

  • Zeppelin Server

Zeppelin Server是一个Web server,负责管理所有的note,interpreter等等,Zeppelin Server不做具体的代码执行,会交给Interpreter来执行代码。

  • Interpreter

Interpreter是一个独立的进程,负责具体前端用户提交的代码的执行(比如Spark Scala代码或者SQL代码等等)。Zeppelin Server与Interpreter之间是通过thrift来进行通信,而且是双向通信。Zeppelin中最核心的概念是Interpreter,一个插件允许用户使用一个指定的语言或数据处理器。每一个Interpreter都属于换一个InterpreterGroup,同一个InterpreterGroup的Interpreters可以相互引用,例如:SparkSqlInterpreter可以引用SparkInterpreter以获取SparkContext,因为他们属于同一个InterpreterGroup。当前已经实现的Interpreter有Spark解释器、Python解释器、SparkSQL解释器、JDBC、Markdown和shell等。下图是Zeppelin官网中介绍Interpreter的原理图。
Zeppelin基础入门 - 图3
Zeppelin Server是独立的进程,进程日志在logs目录下的 zeppelin-{user}-{host}.log, 每个Interpreter也是一个独立的进程,进程日志是 logs目录下的 zeppelin-interpreter-{interpreter}-*.log, 所以如果碰到任何问题可以先去这两个log文件里去查找线索。

2. Flink on Zeppelin

image.png
上图是Flink on Zeppelin的架构,左边的Flink Interpreter可以理解成Flink的客户端,负责Flink Job的编译,提交和管理(比如Cancel Job,记录Checkpoint等等)。右边的Flink Cluster就是真正运行Flink Job的地方,可以是一个MiniCluster(local 模式),Standalone Cluster (remote模式),Yarn Session Cluster (yarn 模式)。Flink Interpreter内部会有2个重要的组件:Scala Shell,Python Shell。

  • Scala Shell

整个Flink Interpreter的入口,ExecutionEnvironment,StreamExecutionEnvironment 以及所有类型的TableEnvironment都是在Scala Shell里创建,Scala shell负责Scala代码的编译和执行。

  • Python Shell

PyFlink的入口,负责Python代码的编译和执行。

3. Spark with Zeppelin

Spark是Zeppelin最重要的计算引擎,最开始的时候Zeppelin就是为了Spark而设计的。在Zeppelin上使用Spark NoteBook,有Spark和Livy两种方式。
image.png
如下图所示,整个系统分为三块:Zeppelin Web Client、Zeppelin Server和 Spark,前两个为Zeppelin的前后端模块,第三个为计算引擎。要搞清楚整体的工作原理,需要搞清楚两个问题:第一,这三者之间是如何通信的?第二,Interpreter是如何被调用的?
image.png
在Spark中,Driver负责任务的调度。在Zeppelin Web Client上编写的代码片段只有传送到Driver进程中,才能得以执行。首先,Zeppelin Web Client通过REST API与Server端进行交互,Server收到后将其提交到任务队列中顺序执行。其次,Zeppelin Server与Spark Driver是不同的进程,并且很可能不在同一台机器上,要实现这样的交互,自然少不了RPC通信,这里采用了Thrift。Spark Driver所在的进程本身是一个Thrift Server进程,由Zeppelin Server发起RPC调用,将相关信息传递过来。
每一个计算引擎都有自己对应的Interpreter类,实现了interpret(String st, InterpreterContext context) 方法,用于执行具体代码。对于每一个Paragraph的执行,都会根据NoteId和Interpreter名字来获取对应的Interpreter实例。如果是第一次执行,便会根据配置创建对应的Interpreter Group及相关的Interpreter实例。在Zeppelin Server 中,Interpreter是由RemoteInterpreter来代理的(代理模式),其集成了Thrift Client相关接口,用于RPC调用。第一次执行时,Zeppelin Server会启动Spark,Spark的主进程(Driver)入口是RemoteInterpreterServer,其集成了Thrift Server相关接口,用于RPC调用。在RPC调用中,会获取对应的Interpreter实例来完成具体执行。

优缺点

Zeppelin 描述
优点
1. 提供restful和webSocket两种接口。
1. 使用spark解释器,用户按照spark提供的接口编程即可,用户可以自己操作SparkContext,不过用户不能自己去stop SparkContext。SparkContext可以常驻。
1. 包含更多的解释器,扩展性也很好,可以方便增加自己的解释器。
1. 提供了多个数据可视化模块,数据展示方便。
缺点
1. 没有提供jar包的方式运行spark任务。
1. 只有同步的方式运行,客户端可能需要等待较长时间。

新特性

为了支持机器学习工作负载,Zeppelin社区开发出了很多相关的特性,包括Zeppelin集群模式(Cluster Mode)、Zeppelin Cluster + Docker、Zeppelin On Yarn、多集群支持、动态配置、模型预测与增量训练、可视化调参和Zeppelin WorkFlow等重要特性。

  • Zeppelin 集群模式(Cluster Mode)

非集群模式,即只有一个ZeppelinServer,解释器可以运行在这个Server上,但若算法工程师数量很多,用户对服务可用性的要求可能无法满足。集群模式下,我们可以同时启动多个Zeppelin Server,基于Raft算法选主(Master)、同步,共同对外提供服务。用户通过Nginx反向代理域名访问这些Zeppelin服务。同时,集群模式还提供了Cluster元数据管理的能力,集群中所有的Zeppelin Server的运行状况,以及所有的解释器进程,都会记录在元数据中,用户可以通过Nginx配置访问不同的Server,创建不同的解释器。解释器进程可以在集群中自动寻找资源最为富余的Server来运行,而当某个Server挂了且难以恢复,用户仍然可以通过元数据启动另外一个Server,继续未完成的工作。Zeppelin集群模式只需在参数中配置3个服务器的列表,并将其启动,即可自动组建Zeppelin 集群,不需要借助ZooKeeper。通过专门的集群管理页面,用户可以清晰看到集群中的服务器、解释器的数量和运行状态。
image.png

  • 本机Docker

无论是单机模式还是集群模式,用户都可以在本机Docker上创建解释器进程。通过集群模式+Docker,用户不需要Yarn或者Kubernetes,即可创建Zeppelin集群,提供高可用服务,核心功能和Zeppelin On Yarn/ Kubernetes并无二致,而且部署和维护也很简单,无需复杂的网络配置。

  • Zeppelin On Yarn

Zeppelin的解释器可以创建在Yarn的运行环境中,支持Yarn 2.7及以上的版本。Zeppelin容器的维护需要模拟终端,Zeppelin支持通过shell命令进入Docker进行维护,如安装所需的Python库、修改环境变量等。

  • 多Hadoop集群

Zeppelin支持通过配置,即指定不同的Hadoop/Spark Conf文件,即可用一个Zeppelin集群,去连接所有的Hadoop集群,而无需为所有Hadoop集群分别创建多个Zeppelin服务,从而简化管理和维护的复杂度,同时保证服务的可靠性。

  • 动态配置

Zeppelin提供服务接口,用户可以连接到自己的KDC或者LDAP认证系统,获取所需的信息,以便完成在不同的Hadoop集群上的操作。

  • 模型预测与增量训练

Zeppelin支持通过Spark或者Flink的解释器,使用批处理或者流处理的方式,把用户新产生的数据结合后台的模型训练服务进行增量训练,并把训练出来的新模型保存到模型库中。
Zeppelin基础入门 - 图8

  • 可视化调参

不同的机器学习框架有不同的参数配置,甚至不同的算法参数都不同,传统命令行的方式容易配置出错,Zeppelin基于其前端可视化展示能力,将支持针对每个算法自行设置一个参数调整界面,和模型一起发布,模型使用者可以使用该可视化界面,根据需要动态地调整参数。
Zeppelin基础入门 - 图9

  • Zeppelin WorkFlow

用户可以在按照Zeppelin提供的一种类似Azkaban的数据格式,编写Node之间的依赖,下方形成一个可视化的WorkFlow图,通过拖拽的方式可以编排整个工作流,设置每个节点的动作。结合参数的配置,用户可以编写一个复杂的Zeppelin工作流,在右边设置触发的条件,如按时间点、Rest接口手动触发,或者按照周期性时间、数据变化来设置。

总结

Apache Zeppelin覆盖机器学习全流程,让数据科学工作者能够以可视化的方式,方便地编写机器学习算法、调参和进行机器学习任务管理。针对大数据任务的特点,Zeppelin也做了分布式的优化。同时,Zeppelin还能与其他Apache大数据生态项目也能很好地集成,可以更好地满足不同团队的需求。

参考

官网:Zeppelin官网
http://zeppelin.apache.org
GitHub:Zeppelin源码地址
https://github.com/apache/zeppelin
JIRA:Zeppelin JIRA
https://issues.apache.org/jira/projects/ZEPPELIN/summary
知乎:Apache Zeppelin: 让大数据插上机器学习的翅膀
https://zhuanlan.zhihu.com/p/71136801
CSDN:当Spark遇上Zeppelin
https://bruce.blog.csdn.net/article/details/86417429
InfoQ**:Flink on Zeppelin文章教程


B站:Flink on Zeppelin视频教程