浅析 Apache Zeppelin

Posted by JustDoDT on February 8, 2020

概述

2013年,ZEPL(以前称为NFLabs,是一家韩国的数据分析公司)启动了Zeppelin项目。

20141223日,Zeppelin项目成为Apache Software Foundation中的孵化项目。

2016618日,Zeppelin项目从Apache的孵化项目毕业,成为Apache Software Foundation的顶级项目。

2020119日,Apache Zepplin已经到了0.8.2GA0.9.0-SNAPSHOT

什么是Apache Zeppelin

Apache Zeppelin是一个基于Web的交互式数据分析开源框架,提供了数据分析、数据可视化等功能,类似于Jupyter Notebook,不过功能比Jupyter Notebook强大很多,她是属于企业级产品,支持超过20种后端语言,比如Java/Scala/Python/SQL/MarkDown/Shell等。开发者可以自定义开发更多的解释器为Zeppelin添加执行引擎,官方现在支持的执行引擎有Spark/JDBC/Python/Alluxio/Beam/Cassandra/Elasticsearch/Flink/HBase/HDFS/Hive/Kylin /Livy/MarkDown/Neo4j/Pig/PostgreSQL/R等。

Apache Zeppelin 架构简介

Apache Zeppelin的架构比较简单直观(如下图所示),总共分为3

  • Zeppelin 前端
  • Zeppelin Server
  • Zeppelin Interpreter

zeppelin

` Zeppelin前端是基于AngularJSZeppelin Server是一个基于Jetty的轻量级Web Server`,主要负责以下一些功能:

  • 登陆权限管理
  • Zeppelin配置信息管理
  • Interpreter 配置信息和生命周期管理
  • Note存储管理
  • 插件机制管理

Zeppelin Interpreter组件是指各个计算引擎在Zeppelin这边的适配。比如PythonSparkFlink等等。每个Interpreter都运行在一个JVM进程里,这个JVM进程可以是和Zeppelin Server在同一台机器上(默认方式),也可以运行在Zeppelin集群里的其他任何机器上或者K8s集群的一个Pod里,这个由Zeppelin的不同InterpreterLauncher插件来实现。InterpreterLauncherZeppelin的一种插件类型。

组件之间的通信机制

Zeppelin前端和Zeppelin Server之间的通信机制主要有Rest apiWebSocket两种。Zeppelin ServerZeppelin Interpreter是通过Thrift RPC来通信,而且他们彼此之间是双向通信,Zeppelin Server可以向Zeppelin Interpreter发送请求,Zeppelin Interpreter也可以向Zeppelin Server发送请求。

源码编译安装Apache Zeppelin

Apache Zeppelin官方提供了源码包和二进制包,可以根据自己的需要下载相关的包,二进制包是包含所有的解释器,如果你只需要用到其中的几种可以通过源码编译来定制化安装。

mvn clean package -DskipTests -Phadoop-2.6 -Dhadoop.version=2.6.0 -P build-distr -Dhbase.hbase.version=1.2.0 -Dhbase.hadoop.version=2.6.0

二进制安装Apache Zeppelin

[hadoop@hadoop001 sourcecode]$ tar -zxvf zeppelin-0.8.2-bin-all.tgz -C ~/app/
#修改配置文件
[hadoop@hadoop001 conf]$ pwd
/home/hadoop/app/zeppelin-0.8.2-bin-all/conf
[hadoop@hadoop001 conf]$ cp zeppelin-env.sh.template zeppelin-env.sh
[hadoop@hadoop001 conf]$ vim zeppelin-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_144
export HADOOP_CONF_DIR=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop
export MASTER=yarn
export SPARK_HOME=/home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0
export SPARK_SUBMIT_OPTIONS="--jars /home/hadoop/lib/mysql-connector-java-5.1.46-bin.jar"
export FLINK_HOME=/home/hadoop/app/flink-1.7.2
export HBASE_HOME=/home/hadoop/app/hbase-1.2.0-cdh5.7.0

# 修改端口,主机名
[hadoop@hadoop001 conf]$ cp zeppelin-site.xml.template zeppelin-site.xml
[hadoop@hadoop001 conf]$vim zeppelin-site.xml
<property>
  <name>zeppelin.server.addr</name>
  <value>192.168.100.111</value>
  <description>Server binding address</description>
</property>

<property>
  <name>zeppelin.server.port</name>
  <value>9090</value>
  <description>Server port.</description>
</property>

启动Zeppelin的用户认证

Apache Zeppelin默认是以匿名用户访问的,即没有用户权限要求,如要实现用户权限限制,则需要修改zeppelin-site.xmlshiro配置文件。

# 修改zeppelin-site.xml配置文件,将以下配置项中的true改成false
<property>
  <name>zeppelin.anonymous.allowed</name>
  <value>false</value>
  <description>Anonymous user allowed by default</description>
</property>

# 复制conf目录下的shiro.ini.template 为 shiro.ini , 将shiro.ini 的[user]块中的内容修改为以下内容:
[hadoop@hadoop001 conf]$ cp shiro.ini.template shiro.ini
[hadoop@hadoop001 conf]$ vim shiro.ini
[users]
admin = admin
user1 = password2, role1, role2
user2 = password3, role3
user3 = password4, role2
.
.
.
[urls]
/api/version = anon
#/api/interpreter/setting/restart/** = authc, roles[admin,hive]
#/api/interpreter/** = authc, roles[admin,hive]
#/api/configurations/** = authc, roles[admin,hive]
#/api/credential/** = authc, roles[admin,hive]
#/** = anon
/** = authc

启动Apache Zeppelin

[hadoop@hadoop001 ~]$ cd app/zeppelin-0.8.2-bin-all/
[hadoop@hadoop001 zeppelin-0.8.2-bin-all]$ bin/zeppelin-daemon.sh start
Log dir doesn't exist, create /home/hadoop/app/zeppelin-0.8.2-bin-all/logs
Pid dir doesn't exist, create /home/hadoop/app/zeppelin-0.8.2-bin-all/run
Zeppelin start                                             [  OK  ]
[hadoop@hadoop001 zeppelin-0.8.2-bin-all]$ 

zeppelin

创建 mysql notebook

zeppelin

zeppelin

  • 往下拉,选择 jdbc

zeppelin

zeppelin

需要填写的有5个地方

default.driver
default.password
default.url
default.user
artifact

查询mysql里面的数据

zeppelin

zeppelin

zeppelin

zeppelin

zeppelin

Apache Zepplin 对接Apache Spark

zeppelin

当出现 java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.defaultNumHeapArena()I

解决办法:

# cd $ZEPPELIN_HOME/lib  
# mv netty-all-4.0.23.Final.jar netty-all-4.0.23.Final.jar_bak  
# cp $SPARK_HOME/jars/netty-all-4.1.17.Final.jar  $ZEPPELIN_HOME/lib 

zeppelin

当出现 com.fasterxml.jackson.databind.JsonMappingException: Incompatible Jackson version: 2.8.11-1

解决办法:

# cd $ZEPPELIN_HOME/lib  
# mv jackson-databind-2.8.11.1.jar jackson-databind-2.8.11.1.jar_bak  
# cp $SPARK_HOME/jars/jackson-databind-2.6.7.1.jar $ZEPPELIN_HOME/lib  

Spark 样例代码

zeppelin

Spark SQL

zeppelin

zeppelin

SparkSQL处理HDFS上的数据

zeppelin

Apark Zeppelin里面自带Apache Spark,并且自带了sc,用 Apache Zeppelin还是比直接用Spark Shell或者Spark SQL 来调试方便不少。

Apache Zeppelin 操作Shell

zeppelin

Apache Zeppelin 操作MarkDown

Apache Zeppelin 里面自带了 MarkDown

zeppelin

zeppelin

Zeppelin将创建6个变量来表示flink的入口点

  • senv (StreamExecutionEnvironment),
  • benv (ExecutionEnvironment)
  • stenv (StreamTableEnvironment for blink planner)
  • btenv (BatchTableEnvironment for blink planner)
  • stenv_2 (StreamTableEnvironment for flink planner)
  • btenv_2 (BatchTableEnvironment for flink planner)

Apache Zeppelin 集成 Apache HBase

[hadoop@hadoop001 hbase]$ pwd
/home/hadoop/app/zeppelin-0.8.2-bin-all/interpreter/hbase
[hadoop@hadoop001 hbase]$ mkdir hbase_jar
[hadoop@hadoop001 hbase]$ mv hbase*.jar hbase_jar/
[hadoop@hadoop001 hbase]$ mv hadoop*.jar hbase_jar/
[hadoop@hadoop001 hbase]$ mv zookeeper-3.4.6.jar hbase_jar/
[hadoop@hadoop001 hbase]$ 
[hadoop@hadoop001 hbase]$ cp -f /home/hadoop/app/hbase-1.2.0-cdh5.7.0/lib/*.jar /home/hadoop/app/zeppelin-0.8.2-bin-all/interpreter/hbase/
  • 编辑interpreter.json,位置/home/hadoop/app/zeppelin-0.8.2-bin-all/interpreter/hbase/interpreter.json,修改hbase.home
  "hbase.home": {
        "name": "hbase.home",
        "value": "/home/hadoop/app/hbase-1.2.0-cdh5.7.0/",
        "type": "string"
      },
  • 重启 Apache Zeppelin

    cd /home/hadoop/app/zeppelin-0.8.2-bin-all/bin
    zeppelin-daemon.sh restart
    
  • 测试

zeppelin

Apache Zeppelin 集成 HDFS

zeppelin

Apache Zeppelin 集成 Apache Hive

  • 添加hiveInterpreters

zeppelin

zeppelin

zeppelin

  • 启动hive2

[hadoop@hadoop001 lib]$ hiveserver2 &

  • 测试

zeppelin

Apache Zeppelin 集成 Elasticsearch

zeppelin

  • 可以直接用 ElasticsearchInterpreters

zeppelin

  • 也可以直接用 shellInterpreters

zeppelin

Apache Zeppelin VS Jupyter Notebook

Jupyter NotebookIPython Notebook的演变版,更出名。

对比 Zeppelin Jupyter
开发语言 python java
GithubStar 4.6k 6.8k
安装 简单 简单
诞生 2012年 2013年
支持Spark 支持 支持
支持Flink 支持 暂不支持
多用户 支持 不支持
权限 支持 不支持

Apache Zeppelin 功能强大,适合于企业级应用,而Jupyter 更适用于个人测试学习,Apache Zeppelin集成了Flink/Spark等大数据知名产品,而Jupyter未集成Flink,功能远不如Apache Zeppelin强大。

参考文档