https://www.jianshu.com/p/090f02005e07
1.Zeppelin是什么?
Apache Zeppelin是一款基于Web的Notebook(类似于jupyter notebook),支持交互式地数据分析。
Zeppelin可实现你所需要的:
- 数据采集
- 数据发现
- 数据分析
- 数据可视化和协作
支持多种语言,默认是Scala(背后是Spark shell),SparkSQL, Markdown ,SQL,Shell,Markdown和Python等
image.png
image.png
Apache Spark集成
特别是,Apache Zeppelin提供内置的Apache Spark集成。您不需要为其构建单独的模块,插件或库。
2.Zeppelin特性
2.1 Apache Spark 集成
Zeppelin 提供了内置的 Apache Spark 集成。你不需要单独构建一个模块、插件或者库。
Zeppelin的Spark集成提供了:
- 自动引入SparkContext 和 SQLContext
- 从本地文件系统或maven库载入运行时依赖的jar包。更多关于依赖载入器
- 可取消job 和 展示job进度
2.2 数据可视化
一些基本的图表已经包含在Zeppelin中。可视化并不只限于SparkSQL查询,后端的任何语言的输出都可以被识别并可视化。
image.png
数据透视图
Apache Zeppelin聚合值,并通过简单的拖放将其显示在透视图中。您可以轻松创建具有多个汇总值的图表,包括总和,数量,平均值,最小值,最大值。
image.png
动态表单
Apache Zeppelin可以在笔记本中动态创建一些输入表单。
image.png
通过共享您的笔记本和段落进行协作
您的笔记本网址可以在协作者之间共享。然后,Apache Zeppelin将会实时播放任何更改,就像Google文档中的协作一样。
image.png
发布
Zeppelin提供了一个URL用来仅仅展示结果,那个页面不包括Zeppelin的菜单和按钮。这样,你可以轻易地将其作为一个iframe集成到你的网站。
image.png
3.Zeppelin的快速入门
3.1 安装
Apache Zeppelin下载页面提供了两个二进制包。http://zeppelin.apache.org/download.html
-
只需将其打包在您选择的目录中即可。
-
打开包装并按照安装其他编译程序安装解释器。如果您不确定,只需运行
./bin/install-interpreter.sh --all
并安装所有解释器。
安装与运行请参考:
http://zeppelin.apache.org/docs/0.7.3/install/install.html
### 启动Apache Zeppelin
bin/zeppelin-daemon.sh start
### 停止Zeppelin
bin/zeppelin-daemon.sh stop
与service manager一起启动Apache Zeppelin
Apache Zeppelin可以使用初始化脚本作为服务自动启动,使用像upstart这样的服务管理器。这是一个保存的示例upstart脚本,因为/etc/init/zeppelin.conf 这允许使用诸如以下命令来管理服务。
sudo service zeppelin start
sudo service zeppelin stop
sudo service zeppelin restart
其他service manager可以使用与upstart传递给zeppelin-daemon.sh脚本的参数类似的方法。
bin/zeppelin-daemon.sh upstart
zeppelin.conf
description "zeppelin"
start on (local-filesystems and net-device-up IFACE!=lo)
stop on shutdown
# Respawn the process on unexpected termination
respawn
# respawn the job up to 7 times within a 5 second period.
# If the job exceeds these values, it will be stopped and marked as failed.
respawn limit 7 5
# zeppelin was installed in /usr/share/zeppelin in this example
chdir /usr/share/zeppelin
exec bin/zeppelin-daemon.sh upstart
3.2 配置
3.2.1 Zeppelin Properties
有两个位置可以配置Apache Zeppelin。
(1)环境变量可以被定义conf/zeppelin-env.sh
(2)Java属性可以定义在conf/zeppelin-site.xml
image.png
image.png
3.3 探索Apache Zeppelin UI
首页
你第一次连接到Zeppelin,你将会在主页面上看到下面的截图。
image.png
页面左侧列出所有现有的笔记。这些笔记默认存储在$ZEPPELIN_HOME/notebook
文件夹中。
您可以使用输入文本形式通过名称过滤它们。您还可以创建一个新的笔记,刷新现有笔记的列表(万一手动将其复制到$ZEPPELIN_HOME/notebook
文件夹中)并导入笔记。
image.png
当点击Import Note
链接时,会打开一个新的对话框。从那里您可以从本地磁盘或从远程位置导入您的笔记,如果您提供的URL。
image.png
默认情况下,导入的注释的名称与原始注释相同,但您可以通过提供新的名称来覆盖它。
菜单
笔记本
该Notebook
菜单提出与主页中的笔记管理部分几乎相同的功能。从下拉菜单中,您可以:
- 打开选定的音符
- 按名称过滤节点
-
创建一个新的音符
image.png
设置
此菜单可让您访问设置并显示有关Zeppelin的信息。anonymous
如果使用默认的shiro 配置,用户名设置为。如果要设置身份验证,请参阅Shiro身份验证。
image.png
关于Zeppelin
您可以在此菜单中查看Zeppelin版本。
image.png
解释器
在此菜单中,您可以:
- 配置现有的解释器实例
- 添加/删除解释器实例
image.png
凭据
此菜单允许您保存传递给口译员的数据源的凭据。
image.png
配置
此菜单显示配置文件中设置的所有Zeppelin配置 $ZEPPELIN_HOME/conf/zeppelin-site.xml
image.png
注释布局
每个Zeppelin笔记由1 .. N段组成。该笔记可以看作是一个段落容器。
image.png
段落
每个段落由两部分组成:code section
您将源代码放在result section
哪里,您可以在其中看到代码执行的结果。
image.png
在每个段落的右上角都有一些命令:
- 执行段落代码
- 隐藏/显示
code section
- 隐藏/显示
result section
- 配置段落
要配置段落,只需点击齿轮图标:
image.png
从这个对话框可以(按降序排列):
- 找到段落id(20150924-163507_134879501)
- 控制段宽。由于Zeppelin正在使用Twitter Bootstrap的网格系统,因此每段宽度可以从1变为12
- 移动第1段
- 将第1段向下移动
- 创建一个新段落
- 更改段落标题
- 显示/隐藏行号
code section
- 禁用此段落的运行按钮
- 将当前段落导出为iframe,并在新窗口中打开iframe
- 清除
result section
- 删除当前段落
注意工具栏
在笔记的顶部,您可以找到一个显示命令按钮以及配置,安全性和显示选项的工具栏。
image.png
在最右边显示注释名称,只需点击它即可显示输入表单并进行更新。
在工具栏的中间,您可以找到命令按钮:
- 执行所有段落顺序,在他们的显示顺序
- 隐藏/显示
code section
所有段落 - 隐藏/显示
result section
所有段落 - 清除
result section
所有段落 - 克隆当前笔记
- 将当前注释导出到JSON文件。_Please注意的是,
code section
和result section
所有段落将用于出口。如果您在result section
某些段落中有重的数据,建议您在导出之前清理它们 - 提交当前节点内容
- 删除注释
- 使用CRON语法调度所有段落的执行
image.png
在笔记工具栏的右侧,您可以找到配置图标:
- 显示所有的键盘摇柄
- 配置解释器绑定到当前注释
- 配置注释权限
- 开关之间的节点的显示模式
default
,simple
和report
image.png
3.4 Apache Zeppelin教程
本教程将引导您了解Zeppelin的一些基本概念。我们假设你已经安装了Zeppelin。如果没有,请先看这里。
Zeppelin当前的主要后端处理引擎是Apache Spark。如果您刚刚接触到该系统,您可能希望首先了解如何处理数据以充分利用Zeppelin。
3.4.1 本地文件教程
数据优化
在开始Zeppelin教程之前,您需要下载bank.zip。
首先,将csv格式的数据转换成RDD Bank
对象,运行以下脚本。这也将使用filter
功能删除标题。
val bankText = sc.textFile("yourPath/bank/bank-full.csv")
case class Bank(age:Integer, job:String, marital : String, education : String, balance : Integer)
// split each line, filter out header (starts with "age"), and map it into Bank case class
val bank = bankText.map(s=>s.split(";")).filter(s=>s(0)!="\"age\"").map(
s=>Bank(s(0).toInt,
s(1).replaceAll("\"", ""),
s(2).replaceAll("\"", ""),
s(3).replaceAll("\"", ""),
s(5).replaceAll("\"", "").toInt
)
)
// convert to DataFrame and create temporal table
bank.toDF().registerTempTable("bank")
数据检索
假设我们想看到年龄分布bank。为此,运行:
%sql
select age, count(1) from bank where age < 30 group by age order by age
您可以输入框通过更换设置年龄条件30用${maxAge=30}。
%sql
select age, count(1) from bank where age < ${maxAge=30} group by age order by age
现在我们要看到具有某种婚姻状况的年龄分布,并添加组合框来选择婚姻状况。跑:
%sql
select age, count(1) from bank where marital="${marital=single,single|divorced|married}" group by age order by age
3.4.2 具有流数据的教程
数据优化
由于本教程基于Twitter的示例tweet流,您必须使用Twitter帐户配置身份验证。要做到这一点,看看Twitter Credential Setup。当您得到API密钥,您应填写证书相关的值(apiKey
,apiSecret
,accessToken
,accessTokenSecret
与下面的脚本您的API密钥)。
这将创建一个Tweet
对象的RDD 并将这些流数据注册为一个表:
import org.apache.spark.streaming._
import org.apache.spark.streaming.twitter._
import org.apache.spark.storage.StorageLevel
import scala.io.Source
import scala.collection.mutable.HashMap
import java.io.File
import org.apache.log4j.Logger
import org.apache.log4j.Level
import sys.process.stringSeqToProcess
/** Configures the Oauth Credentials for accessing Twitter */
def configureTwitterCredentials(apiKey: String, apiSecret: String, accessToken: String, accessTokenSecret: String) {
val configs = new HashMap[String, String] ++= Seq(
"apiKey" -> apiKey, "apiSecret" -> apiSecret, "accessToken" -> accessToken, "accessTokenSecret" -> accessTokenSecret)
println("Configuring Twitter OAuth")
configs.foreach{ case(key, value) =>
if (value.trim.isEmpty) {
throw new Exception("Error setting authentication - value for " + key + " not set")
}
val fullKey = "twitter4j.oauth." + key.replace("api", "consumer")
System.setProperty(fullKey, value.trim)
println("\tProperty " + fullKey + " set as [" + value.trim + "]")
}
println()
}
// Configure Twitter credentials
val apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxx"
val apiSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
val accessToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
val accessTokenSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
configureTwitterCredentials(apiKey, apiSecret, accessToken, accessTokenSecret)
import org.apache.spark.streaming.twitter._
val ssc = new StreamingContext(sc, Seconds(2))
val tweets = TwitterUtils.createStream(ssc, None)
val twt = tweets.window(Seconds(60))
case class Tweet(createdAt:Long, text:String)
twt.map(status=>
Tweet(status.getCreatedAt().getTime()/1000, status.getText())
).foreachRDD(rdd=>
// Below line works only in spark 1.3.0.
// For spark 1.1.x and spark 1.2.x,
// use rdd.registerTempTable("tweets") instead.
rdd.toDF().registerAsTable("tweets")
)
twt.print
ssc.start()
数据检索
对于每个以下脚本,每次单击运行按钮,您将看到不同的结果,因为它是基于实时数据。
我们开始提取包含单词girl的最多10个tweets 。
%sql
select * from tweets where text like '%girl%' limit 10
这次假设我们想看看在过去60秒内每秒创建的tweet有多少。为此,运行:
%sql
select createdAt, count(1) from tweets group by createdAt order by createdAt
您可以在Spark SQL中进行用户定义的功能并使用它们。让我们通过命名函数来尝试sentiment。该功能将返回参数中的三种态度之一(正,负,中性)。
def sentiment(s:String) : String = {
val positive = Array("like", "love", "good", "great", "happy", "cool", "the", "one", "that")
val negative = Array("hate", "bad", "stupid", "is")
var st = 0;
val words = s.split(" ")
positive.foreach(p =>
words.foreach(w =>
if(p==w) st = st+1
)
)
negative.foreach(p=>
words.foreach(w=>
if(p==w) st = st-1
)
)
if(st>0)
"positivie"
else if(st<0)
"negative"
else
"neutral"
}
// Below line works only in spark 1.3.0.
// For spark 1.1.x and spark 1.2.x,
// use sqlc.registerFunction("sentiment", sentiment _) instead.
sqlc.udf.register("sentiment", sentiment _)
要检查人们如何看待使用sentiment上述功能的女孩,请运行以下操作:
%sql
select sentiment(text), count(1) from tweets where text like '%girl%' group by sentiment(text)
3.5 Apache Zeppelin动态表单
Apache Zeppelin动态创建输入表单。根据语言后端,创建动态表单有两种不同的方式。自定义语言后端可以选择要使用哪种类型的表单创建。
使用表单模板
此模式使用简单的模板语言创建表单。它简单易用。例如Markdown,Shell,Spark SQL语言后端使用它。
文本输入表单
要创建文本输入表单,请使用${formName}模板。
例如:
image.png
也可以提供默认值,使用${formName=defaultValue}。
image.png
选择表单
要创建选择表单,请使用 ${formName=defaultValue,option1|option2...}
例如:
image.png
此外,您可以使用选项的显示名称和值分隔 ${formName=defaultValue,option1(DisplayName)|option2(DisplayName)...}
image.png
默认情况下更改选择后,段落将自动运行。但是,如果您在一个段落中有多种类型的动态表单,则可能需要在更改所有选项后运行该段落。您可以通过取消选中设置菜单中的以下“ 运行选择更改”选项来控制此选项。即使您取消选中此选项,仍然可以通过按下来运行它Enter。
image.png
复选框表单
对于多选,您可以使用复选框来创建${checkbox:formName=defaultValue1|defaultValue2...,option1|option2...}。该变量将由基于所选项的逗号分隔字符串代替。例如:
image.png
此外,您可以使用以下命令指定分隔符${checkbox(delimiter):formName=...}:
image.png
与选择表单一样,默认情况下更改选择后,段落将自动运行。但是,如果您在一个段落中有多种类型的动态表单,则可能需要在更改所有选项后运行该段落。您可以通过取消选中设置菜单中的以下“ 运行选择更改”选项来控制此选项。即使您取消选中此选项,仍然可以通过按下来运行它Enter
。
image.png
以编程方式创建
一些语言后端使用编程方式创建表单。例如ZeppelinContext提供了表单创建API
这里有一些例子。
文本输入表单
%spark
println("Hello "+z.input("name"))
%pyspark
print("Hello "+z.input("name"))
image.png
具有默认值的文本输入表单
%spark
println("Hello "+z.input("name", "sun"))
%pyspark
print("Hello "+z.input("name", "sun"))
image.png
选择表单
%spark
println("Hello "+z.select("day", Seq(("1","mon"),
("2","tue"),
("3","wed"),
("4","thurs"),
("5","fri"),
("6","sat"),
("7","sun"))))
%pyspark
print("Hello "+z.select("day", [("1","mon"),
("2","tue"),
("3","wed"),
("4","thurs"),
("5","fri"),
("6","sat"),
("7","sun")]))
image.png
复选框表单
%spark
val options = Seq(("apple","Apple"), ("banana","Banana"), ("orange","Orange"))
println("Hello "+z.checkbox("fruit", options).mkString(" and "))
%pyspark
options = [("apple","Apple"), ("banana","Banana"), ("orange","Orange")]
print("Hello "+ " and ".join(z.checkbox("fruit", options, ["apple"])))
image.png
3.6 Apache Zeppelin发表你的段落
Apache Zeppelin提供了一个发布笔记本段落结果的功能。使用此功能,您可以在您自己的网站上显示Zeppelin笔记本段落结果。这很简单 只需<iframe>在页面中使用标签。
复制段落链接
发布段落结果的第一步是复制段落链接。
在您的Zeppelin笔记本中运行一个段落后,点击位于右侧的齿轮按钮。然后,单击链接此段落菜单,如下图所示。
image.png
只需复制提供的链接。
image.png
将段落嵌入到您的网站
要发布复制的段落,您可以<iframe>在网站页面中使用标签(注意:要将该段落嵌入网站,Apache Zeppelin需要该网站可访问。请谨慎使用此功能,并在可靠的环境中使用,因为Zeppelin整个Webapp可由访问您的网站的任何人访问)。例如:
image.png
最后,您可以在您的网站上展示您美丽的可视化结果。
image.png
3.7 自定义Zeppelin主页
Apache Zeppelin允许您使用您创建的笔记之一作为您的Zeppelin主页。为此,您可以对Zeppelin安装进行品牌定制,根据用户需求调整指导,甚至翻译成其他语言。
如何设置笔记作为您的Zeppelin主页
创建主页的过程非常简单,如下所示:
- 使用Zeppelin创建一个注释
- 在配置文件中设置note id
- 重新启动Zeppelin
使用Zeppelin创建一个注释
使用Zeppelin创建一个新的笔记,您可以使用%md
解释器进行降价内容或您喜欢的任何其他解释器。您还可以使用显示系统生成文本,html,table或Angular(后端API,前端API)。
运行(shift + Enter)注释并查看输出。(可选)将备注视图更改为报告以隐藏代码段。
在配置文件中设置note id
要在配置文件中设置注释ID,您应该将其从备注URL中的最后一个字中复制。例如:
image.png
将note id设置为ZEPPELIN_NOTEBOOK_HOMESCREEN环境变量或zeppelin.notebook.homescreen属性。
您还可以设置ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE环境变量或zeppelin.notebook.homescreen.hide属性来从记事列表中隐藏新的记事。
重新启动Zeppelin
重新启动您的Zeppelin服务器
./bin/zeppelin-daemon stop
./bin/zeppelin-daemon start
而已!打开浏览器并导航到Apache Zeppelin并查看您的自定义主页。
在自定义主页中显示注释列表
如果要在自定义Apache Zeppelin主页上显示笔记列表,您需要做的就是使用我们的%角度支持。
将以下代码添加到Apache Zeppelin注释中的段落中,并运行它。
%spark
println(
"""%angular
<div ng-include="'app/home/notebook.html'"></div>
""")
运行该段后,您将看到与此类似的输出:
image.png
3.8 升级Zeppelin版本
基本上,较新版本的Zeppelin与以前版本的笔记本电脑目录和配置配合使用。所以拷贝notebook和conf目录应该够了。
image.png
4.在Yarn上运行Apache Zeppelin & Spark
参考文献: Zeppelin on Spark Cluster Mode( Spark 集群模式下的 Zeppelin )
默认情况下,Apache Zeppelin启动Spark
是以本地模式起的,master
的值是local[*]
,我们可以通过修改conf/zeppelin-env.sh
文件里面的MASTER
的值如下:
export MASTER= yarn-client
export HADOOP_HOME=/home/q/hadoop/hadoop-2.2.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop/
此外,在编译Apache Zeppelin的时候,需要加入对YARN的依赖,解决的办法是可以在编译Apache Zeppelin的时候加上-Pyarn
来解决上面的问题:
mvn package -Pspark-1.5 -DskipTests -Dhadoop.version=2.2.0 -Phadoop-2.2 -Pyarn
然后再启动Apache Zeppelin
bin/zeppelin-daemon.sh start
这时候,启动的Spark Job就会在YARN上跑。所有的日志可以在logs目录下找,在我的例子里面记录日志的文件是 zeppelin-interpreter-spark-***.log
。
另外需要注意的是,Apache Zeppelin & Spark在YARN模式上运行只支持yarn-client模式,如果你将MASTER设置成了yarn-cluster,那么将会出现异常。
5.Apache Zeppelin解释器
5.1 概述
Zeppelin解释器的概念允许将任何语言/数据处理后端插入到Zeppelin中。
目前,Zeppelin支持许多解释器,如Scala(使用Apache Spark),Python(带有Apache Spark),Spark SQL,JDBC,Markdown,Shell等。
什么是Zeppelin解释器?
Zeppelin Interpreter是一款插件,可让Zeppelin用户使用特定的语言/数据处理后端。例如,要在Zeppelin中使用Scala代码,您需要%spark解释器。
当您+Create在解释器页面中单击按钮时,解释器下拉列表框将显示您的服务器上的所有可用的解释器。
image.png
什么是解释器设置?
Zeppelin解释器设置是Zeppelin服务器上给定解释器的配置。例如,hive JDBC解释器连接到Hive服务器需要这些属性。
image.png
当属性名称由高位字符,数字和下划线组成([A-Z_0-9])时,属性将导出为环境变量。否则将属性设置为JVM属性。
每个笔记本都可以使用笔记本电脑右上角的设置图标绑定多个解释器设置。
image.png
什么是解释器组?
每个解释器都属于解释器小组。解释器组是start/stop解释器的单位。默认情况下,每个解释器都属于单个组,但该组可能包含更多的解释器。例如,Spark解释器组包括Spark支持,pySpark,Spark SQL和依赖加载器。
技术上来说,来自同一组的Zeppelin口译员正在运行在同一个JVM中。有关更多信息,请在这里检验。
每个解释器都属于一个单一的团体,并且一起注册。他们的所有属性都列在下面的解释器设置中。
image.png
解释器绑定模式
每个解释器设置可以选择“共享”,“范围”,“隔离”解释器绑定模式之一。在“共享”模式下,绑定到解释器设置的每个笔记本都将共享单个解释器实例。在“范围”模式下,每个笔记本将在相同的解释器过程中创建新的解释器实例。在“隔离”模式下,每个笔记本都会创建新的口译过程。
image.png
连接到现有的远程解释器
Zeppelin用户可以开始在其服务中嵌入解释器线程。这将为用户提供灵活性,以便在远程主机上启动解释器。要与您的服务一起开始解释器,您必须创建一个实例RemoteInterpreterServer并启动它,如下所示:
RemoteInterpreterServer interpreter=new RemoteInterpreterServer(3678);
// Here, 3678 is the port on which interpreter will listen.
interpreter.start()
上面的代码将会在您的进程中启动解释器线程。解释器启动后,您可以通过检查连接到现有进程复选框来配置zeppelin连接到RemoteInterpreter ,然后提供如下图所示的解释器进程正在侦听的主机和端口
image.png
5.2 解释器安装
Apache Zeppelin提供了解释器安装机制,为他们下载了Zeppelin netinst二进制包,或者只是想安装另一个第三方解释器。
社区管理解释器
Apache Zeppelin提供了几个解释器作为社区管理解释器。如果您下载了netinst
二进制包,则需要使用以下命令进行安装。
安装所有社区管理的解释器
./bin/install-interpreter.sh --all
安装特定的解释器
./bin/install-interpreter.sh --name md,shell,jdbc,python
通过运行获得社区管理解释器的完整列表
./bin/install-interpreter.sh --list
5.3 解释器依赖管理
您可以通过在解释器菜单中设置依赖关系来将外部库包含到解释器中。
当你的代码需要外部库,而不是下载/复制/重新启动Zeppelin,您可以轻松地在此菜单中执行以下作业。
从Maven存储库递归加载库
从本地文件系统加载库
添加额外的maven仓库
自动将库添加到SparkCluster
加载依赖关系到解释器
点击导航栏中的“解释器”菜单。
点击要加载依赖关系的解释器的“编辑”按钮。
根据需要填写工件和排除字段。您不仅可以输入groupId:artifactId:version,还可以输入工件字段中的本地文件。
按“保存”,使用加载的库重新启动解释器。
image.png
**添加用于依赖关系解析的存储库 **
1. 按右上角的“解释器”菜单中的图标。它将显示可用的存储库列表。
2. 如果需要解决来自中央maven仓库或本地〜/.m2仓库的依赖关系,请点击[图片上传失败...(image-76600c-1517880679697)] 图标旁边的存储库列表。
3. 填写表单并单击“添加”按钮,您将可以看到添加了新的存储库。
4. 或者,如果您在企业防火墙后面,您还可以指定所有代理设置,以便Zeppelin可以使用给定的凭据下载依赖项
image.png
image.png
5.4 解释器的模拟用户
运行zeppelin解释器进程作为Web前端用户
在shiro.ini中启用shiro auth
[users]
user1 = password1, role1
user2 = password2, role2
为要模拟的用户启用无密码ssh(例如user1)。
adduser user1
#ssh-keygen (optional if you don't already have generated ssh-key.
ssh user1@localhost mkdir -p .ssh
cat ~/.ssh/id_rsa.pub | ssh user1@localhost 'cat >> .ssh/authorized_keys'
或者替代无密码,用户可以在zeppelin-env.sh 中覆盖ZEPPELIN IMPERSONATE CMD
export ZEPPELIN_IMPERSONATE_CMD='sudo -H -u ${ZEPPELIN_IMPERSONATE_USER} bash -c '
启动zeppelin服务器。
image.png
转到解释器设置页面,并在任何解释器(在我的例子中为其解释器)启用“用户模拟”
测试用一个简单的段落
%sh
whoami
请注意,--proxy-user默认情况下,“用户Impersonate”选项的使用将使Spark解释器能够使用当前用户的选项。如果要禁用--proxy-user选项,请参考ZEPPELIN_IMPERSONATE_SPARK_PROXY_USER变量inconf/zeppelin-env.sh
5.5 Elasticsearch 解释器
概述
Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它允许您快速,实时地存储,搜索和分析大量数据。它通常用作为具有复杂的搜索功能和要求的应用程序提供的底层引擎/技术。
image.png
image.png
注意#1:您可以添加更多属性来配置Elasticsearch客户端。
注意#2:如果使用Shield,您可以添加一个名称为shield.user
包含名称和密码(格式:)的值的属性username:password
。有关Shield配置的更多详细信息,请参阅Shield参考指南。不要忘记,在解释器目录(ZEPPELIN_HOME/interpreters/elasticsearch
)中复制屏蔽客户端jar 。
启用弹性搜索解释器
在笔记本中,要启用弹性搜索解释器,请单击齿轮图标,然后选择弹性搜索。
使用弹性搜索解释器
在段落中,用于%elasticsearch选择Elasticsearch解释器,然后输入所有命令。要获取可用命令的列表,请使用help。
%elasticsearch
help
Elasticsearch interpreter:
General format: <command> /<indices>/<types>/<id> <option> <JSON>
- indices: list of indices separated by commas (depends on the command)
- types: list of document types separated by commas (depends on the command)
Commands:
- search /indices/types <query>
. indices and types can be omitted (at least, you have to provide '/')
. a query is either a JSON-formatted query, nor a lucene query
- size <value>
. defines the size of the result set (default value is in the config)
. if used, this command must be declared before a search command
- count /indices/types <query>
. same comments as for the search
- get /index/type/id
- delete /index/type/id
- index /index/type/id <json-formatted document>
. the id can be omitted, elasticsearch will generate one
提示:使用(Ctrl +。)进行自动完成。
得到
使用get命令,您可以通过ID查找文档。结果是一个JSON文档。
%elasticsearch
get /index/type/id
image.png
搜索
使用该search
命令,您可以向Elasticsearch发送搜索查询。有两种查询格式:
-
您可以提供JSON格式的查询,这正是您在使用Elasticsearch的REST API时提供的。
- 有关搜索查询的内容的详细信息,请参阅Elasticsearch搜索API参考文档。
-
您还可以提供a的内容
query_string
。- 这是一个查询的快捷方式:
{ "query": { "query_string": { "query": "__HERE YOUR QUERY__", "analyze_wildcard": true } } }
- 有关此类查询的内容的详细信息,请参阅Elasticsearch查询字符串语法。
- 这是一个查询的快捷方式:
%elasticsearch
search /index1,index2,.../type1,type2,... <JSON document containing the query or query_string elements>
如果要修改结果集的大小,可以在搜索命令之前添加一个设置大小的行。
%elasticsearch
size 50
search /index1,index2,.../type1,type2,... <JSON document containing the query or query_string elements>
搜索查询还可以包含聚合。如果至少有一个聚合,则显示第一个聚合的结果,否则显示搜索命中。
使用JSON查询:
%elasticsearch
search / { "query": { "match_all": { } } }
%elasticsearch
search /logs { "query": { "query_string": { "query": "request.method:GET AND status:200" } } }
%elasticsearch
search /logs { "aggs": {
"content_length_stats": {
"extended_stats": {
"field": "content_length"
}
}
} }
使用query_string元素:
%elasticsearch
search /logs request.method:GET AND status:200
%elasticsearch
search /logs (404 AND (POST OR DELETE))
重要提示:Elasticsearch中的文档是一个JSON文档,因此它是层次结构的,而不是SQL表中的一行。对于弹性解释器,搜索查询的结果是平坦的。
假设我们有一个JSON文档:
{
"date": "2015-12-08T21:03:13.588Z",
"request": {
"method": "GET",
"url": "/zeppelin/4cd001cd-c517-4fa9-b8e5-a06b8f4056c4",
"headers": [ "Accept: *.*", "Host: apache.org"]
},
"status": "403",
"content_length": 1234
}
包含结果的表格:
image.png
您还可以使用预定义的图表:
image.png
使用JSON查询:
image.png
使用包含fields参数(用于过滤响应中的字段)的JSON查询:在这种情况下,响应中的所有字段值都是数组,因此,在平坦化结果之后,所有字段名称的格式为field_name[x]
image.png
使用查询字符串:
image.png
使用包含多值度量聚合的查询:
image.png
使用包含多桶聚合的查询:
image.png
计数
使用该count命令,您可以对某些索引和类型中可用的文档进行计数。您还可以提供查询。
%elasticsearch
count /index1,index2,.../type1,type2,... <JSON document containing the query OR a query string>
没有查询:
image.png
有一个查询:
image.png
指数
使用该index命令,您可以在Elasticsearch中插入/更新文档。
%elasticsearch
index /index/type/id <JSON document>
%elasticsearch
index /index/type <JSON document>
删除
使用该delete命令,您可以删除文档。
%elasticsearch
delete /index/type/id
应用Zeppelin动态表单
您可以在查询内使用Zeppelin 动态表单。您可以同时使用text input
和select form
参数化功能。
%elasticsearch
size ${limit=10}
search /index/type { "query": { "match_all": { } } }
5.6 HBase Shell 解释器
概述
HBase Shell是Apache HBase的JRuby IRB客户端。此解释器提供Apache Zeppelin中Apache HBase shell的所有功能。
解释器假定已安装Apache HBase客户端软件,并且可以从安装Apache Zeppelin的计算机连接到Apache HBase集群。
要开始使用HBase,请参阅HBase Quickstart。
支持HBase版本
默认情况下,Zeppelin是针对HBase 1.0.x版本而构建的。要使用HBase 1.1.x版本,请使用以下build命令:
# HBase 1.1.4
mvn clean package -DskipTests -Phadoop-2.6 -Dhadoop.version=2.6.0 -P build-distr -Dhbase.hbase.version=1.1.4 -Dhbase.hadoop.version=2.6.0
要使用HBase 1.2.0+,请使用以下build命令:
# HBase 1.2.0
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
配置
image.png
如果要连接到群集上运行的HBase,则需要执行下一步。
导出HBASE_HOME
在conf/zeppelin-env.sh中,HBASE_HOME使用HBase安装路径导出环境变量。这样可以确保hbase-site.xml可以加载。
例如:
export HBASE_HOME=/usr/lib/hbase
或者用CDH运行时
export HBASE_HOME="/opt/cloudera/parcels/CDH/lib/hbase"
您可以选择性地出口HBASE_CONF_DIR,而不是HBASE_HOME你应该有自定义的HBase的配置。
启用HBase Shell解释器
在笔记本中,要启用HBase Shell解释器,请单击Gear图标,然后选择HBase Shell。
使用HBase Shell解释器
在段落中,用于%hbase选择HBase Shell解释器,然后输入所有命令。要获取可用命令的列表,请使用help。
%hbase
help
例如,创建一个表
%hbase
create 'test', 'cf'
然后将数据放入该表中
%hbase
put 'test', 'row1', 'cf:a', 'value1'
5.7 Hive 解释器
重要的提醒
Hive Interpreter将被弃用并合并到JDBC Interpreter中。您可以使用具有相同功能的JDBC解释器使用Hive Interpreter。请参阅下面的设置和依赖关系示例。
image.png
概述
在Apache Hive™ 数据仓库软件便于查询和管理驻留在分布式存储大型数据集。Hive提供了一种机制来将结构投影到这些数据上,并使用类似SQL的语言HiveQL查询数据。同时,这种语言还允许传统的map/reduce程序员在HiveQL中表达这种逻辑不方便或低效时插入自定义映射器和缩减器。
如何使用
基本上可以使用
%hive
select * from my_table;
%hive(etl)
-- 'etl' is a ${prefix}
select * from my_table;
默认情况下,您还可以运行多达10个查询。更改这些设置尚未实现。
应用Zeppelin动态表单
您可以在查询内使用Zeppelin 动态表单。您可以同时使用text input
和select form
参数化功能。
%hive
SELECT ${group_by}, count(*) as count
FROM retail_demo.order_lineitems_pxf
GROUP BY ${group_by=product_id,product_id|product_name|customer_id|store_id}
ORDER BY count ${order=DESC,DESC|ASC}
LIMIT ${limit=10};
5.8 JDBC通用 解释器(重要重要)
概述
JDBC解释器允许您无缝地创建到任何数据源的JDBC连接。
在运行每个语句后,将立即应用插入,更新和升级。
到目前为止,已经通过以下测试:
image.png
创建一个新的JDBC解释器
首先,+ Create在解释器设置页面的右上角单击按钮。
image.png
Interpreter name用任何你想要用作别名的填充字段(如mysql,mysql2,hive,redshift等)。请注意,此别名将用于%interpreter_name在段落中调用解释器。然后选择jdbc为Interpreter group。
image.png
JDBC解释器的默认驱动程序设置为PostgreSQL。这意味着Zeppelin PostgreSQL本身就包括驱动程序jar。因此,您不需要为连接添加任何依赖项(例如PostgreSQL驱动程序jar 的工件名称或路径)PostgreSQL。JDBC解释器属性默认定义如下。
image.png
如果你想连接其他数据库如Mysql
,Redshift
和Hive
,你需要编辑的属性值。您还可以使用Credential进行JDBC身份验证。在解释器设置页面中,如果default.user
和default.password
属性被删除(使用X按钮)进行数据库连接,则JDBC解释器将从Credential获取帐户信息。
下面的例子是Mysql
连接。
image.png
最后一步是依赖关系设置。由于Zeppelin PostgreSQL默认仅包含驱动程序jar,因此您需要为其他数据库添加每个驱动程序的maven坐标或JDBC驱动程序的jar文件路径。
image.png
更多属性
您可以在下面指定更多的JDBC解释器属性。
image.png
将JDBC插件绑定到笔记本
要绑定解释器设置页面中创建的口译员,请单击右上角的齿轮图标。
image.png
根据用例选择(蓝色)或取消选择(白色)解释器按钮。如果您需要在笔记本中使用多个解释器,请激活几个按钮。不要忘记点击Save按钮,否则您将面临Interpreter *** is not found错误。
image.png
如何使用
使用JDBC解释器运行段落
要测试您的数据库和Zeppelin是否成功连接,请在段落的顶部输入
%jdbc_interpreter_name
show databases
如果段落FINISHED没有任何错误,则会在上一个之后自动添加一个新的段落%jdbc_interpreter_name。所以你不需要在每个段落的标题中键入这个前缀。
image.png
应用Zeppelin动态表单
您可以在查询内使用Zeppelin 动态表单。您可以使用参数化功能text input
和select form
参数化功能。
%jdbc_interpreter_name
SELECT name, country, performer
FROM demo.performers
WHERE name='{{performer=Sheryl Crow|Doof|Fanfarlo|Los Paranoia}}'
例子
以下是您可以参考的一些例子。包括以下连接器,您可以连接每个数据库,只要它可以配置它的JDBC驱动程序。
image.png
image.png
image.png
image.png
image.png
image.png
5.9 Markdown 解释器
概述
Markdown是一种纯文本格式化语法,可以将其转换为HTML。Apache Zeppelin使用pegdown和markdown4j作为markdown解析器。
在Zeppelin笔记本中,您可以%md
在段落的开头使用Markdown解释器,并从Markdown纯文本生成静态html。
在Zeppelin中,Markdown解释器默认启用,并使用pegdown解析器。
image.png
案例
以下示例演示了Zeppelin笔记本中Markdown的基本用法。
image.png
数学表达
Markdown解释器在内部利用%html显示系统。这意味着您可以将数学表达式与markdown语法相结合。有关更多信息,请参阅数学表达部分。
配置
image.png
5.10 Python 2&3解释器
image.png
image.png
image.png
image.png
image.png
5.11 Shell 解释器
image.png
5.12 Spark 解释器(重要重要)
image.png
image.png
image.png
%spark.dep
z.reset() // clean up previously added artifact and repository
// add maven repository
z.addRepo("RepoName").url("RepoURL")
// add maven snapshot repository
z.addRepo("RepoName").url("RepoURL").snapshot()
// add credentials for private maven repository
z.addRepo("RepoName").url("RepoURL").username("username").password("password")
// add artifact from filesystem
z.load("/path/to.jar")
// add artifact from maven repository, with no dependency
z.load("groupId:artifactId:version").excludeAll()
// add artifact recursively
z.load("groupId:artifactId:version")
// add artifact recursively except comma separated GroupID:ArtifactId list
z.load("groupId:artifactId:version").exclude("groupId:artifactId,groupId:artifactId, ...")
// exclude with pattern
z.load("groupId:artifactId:version").exclude(*)
z.load("groupId:artifactId:version").exclude("groupId:artifactId:*")
z.load("groupId:artifactId:version").exclude("groupId:*")
// local() skips adding artifact to spark clusters (skipping sc.addJar())
z.load("groupId:artifactId:version").local()
image.png
image.png
image.png
6.Apache Zeppelin安全问题
6.1 Shiro 授权
概述
Apache Shiro 是一个功能强大且易于使用的** Java** 安全框架,可执行身份验证,授权,加密和会话管理。在本文档中,我们将逐步介绍 Shiro 如何用于 Zeppelin ****notebook authentication ( 笔记本验证 )。
当您连接到 Apache Zeppelin 时,系统将要求您输入凭据。登录后,您可以访问包括其他用户注释在内的所有备注。
安全设置
您可以通过一些简单的步骤设置 Zeppelin notebook authentication 。
(1).启用 Shiro
默认情况下是在 conf ,你将会找到 shiro.ini.template ,以此文件为例,强烈建议您通过执行以下命令创建文件 shiro.ini
cp conf/shiro.ini.template conf/shiro.ini
(2).Secure the Websocket channel ( 固定 WebSocket 通道 )
在 conf/zeppelin-site.xml 中设置属性 zeppelin.anonymous.allowed 为 false 。如果您还没有这个文件,只需将 conf/zeppelin-site.xml.template 复制到 conf/zeppelin-site.xml 。
(3).启动Zeppelin
bin/zeppelin-daemon.sh start (or restart)
然后你可以浏览 Zeppelin 在 http://localhost:8080 。
(4).登录
最后,您可以使用以下 用户名/密码 组合之一进行登录。
image.png
[users]
admin = password1, admin
user1 = password2, role1, role2
user2 = password3, role3
user3 = password4, role2
你可以为密码旁边的每个用户设置角色。
Groups and permissions (optional) ( 组和权限(可选) )
如果要利用用户组和权限,请在 shiro.ini 中的 [main] 段下使用 LDAP 或 AD 的以下配置之一。
activeDirectoryRealm = org.apache.zeppelin.realm.ActiveDirectoryGroupRealm
activeDirectoryRealm.systemUsername = userNameA
activeDirectoryRealm.systemPassword = passwordA
activeDirectoryRealm.searchBase = CN=Users,DC=SOME_GROUP,DC=COMPANY,DC=COM
activeDirectoryRealm.url = ldap://ldap.test.com:389
activeDirectoryRealm.groupRolesMap = "CN=aGroupName,OU=groups,DC=SOME_GROUP,DC=COMPANY,DC=COM":"group1"
activeDirectoryRealm.authorizationCachingEnabled = false
ldapRealm = org.apache.zeppelin.server.LdapGroupRealm
# search base for ldap groups (only relevant for LdapGroupRealm):
ldapRealm.contextFactory.environment[ldap.searchBase] = dc=COMPANY,dc=COM
ldapRealm.contextFactory.url = ldap://ldap.test.com:389
ldapRealm.userDnTemplate = uid={0},ou=Users,dc=COMPANY,dc=COM
ldapRealm.contextFactory.authenticationMechanism = SIMPLE
还要定义系统中要拥有的角色/组,如下所示;
[roles]
admin = *
hr = *
finance = *
group1 = *
Configure Realm (optional) ( 配置领域(可选) )
领域负责** Apache Zeppelin** 的身份验证和授权。默认情况下,Apache Zeppelin 使用 IniRealm (用户和组可配置在 conf/shiro.ini 文件** [user] 和 [group]** 部分)。您还可以利用** Shiro Realms** ,如 JndiLdapRealm ,** JdbcRealm **或创建 我们自己的 。要了解有关 Apache Shiro 领域的更多信息,请查看 此文档。
我们还提供社区自定义领域。
(5)活动目录
activeDirectoryRealm = org.apache.zeppelin.realm.ActiveDirectoryGroupRealm
activeDirectoryRealm.systemUsername = userNameA
activeDirectoryRealm.systemPassword = passwordA
activeDirectoryRealm.hadoopSecurityCredentialPath = jceks://file/user/zeppelin/conf/zeppelin.jceks
activeDirectoryRealm.searchBase = CN=Users,DC=SOME_GROUP,DC=COMPANY,DC=COM
activeDirectoryRealm.url = ldap://ldap.test.com:389
activeDirectoryRealm.groupRolesMap = "CN=aGroupName,OU=groups,DC=SOME_GROUP,DC=COMPANY,DC=COM":"group1"
activeDirectoryRealm.authorizationCachingEnabled = false
而不是在 shiro.ini 管理员的明文中指定 systemPassword 管理员可以选择在 “hadoop凭据” 中指定相同。使用 hadoop 凭据命令行创建密钥库文件,因为 hadoop commons 应该在类路径中
hadoop credential create activeDirectoryRealm.systempassword -provider jceks://file/user/zeppelin/conf/zeppelin.jceks
更改Shiro.ini文件中的以下值,并取消注释行:
activeDirectoryRealm.hadoopSecurityCredentialPath = jceks://file/user/zeppelin/conf/zeppelin.jceks
LDAP
ldapRealm = org.apache.zeppelin.realm.LdapGroupRealm
# search base for ldap groups (only relevant for LdapGroupRealm):
ldapRealm.contextFactory.environment[ldap.searchBase] = dc=COMPANY,dc=COM
ldapRealm.contextFactory.url = ldap://ldap.test.com:389
ldapRealm.userDnTemplate = uid={0},ou=Users,dc=COMPANY,dc=COM
ldapRealm.contextFactory.authenticationMechanism = SIMPLE
PAM
PAM 认证支持允许在 Zeppelin 正在运行的主机上重用现有的认证模块。在典型的系统模块中,每个服务配置例如 sshd ,** passwd** 等 /etc/pam.d/ 。您可以重新使用这些服务之一或为 Zeppelin 创建自己的服务。激活 PAM 认证需要两个参数:1. realm:正在使用的 Shiro 域 2. service :配置为使用的服务 /etc/pam.d/ 。这里的名称需要与下面的文件名相同 /etc/pam.d/
[main]
pamRealm=org.apache.zeppelin.realm.PamRealm
pamRealm.service=sshd
ZeppelinHub
ZeppelinHub 是一种服务,可同步您的 Apache Zeppelin 笔记本,并使您轻松协作。
为了使登录您的 ZeppelinHub 证书,应用以下变化**conf/shiro.ini**
下 **[main]**
节。
### A sample for configuring ZeppelinHub Realm
zeppelinHubRealm = org.apache.zeppelin.realm.ZeppelinHubRealm
## Url of ZeppelinHub
zeppelinHubRealm.zeppelinhubUrl = https://www.zeppelinhub.com
securityManager.realms = $zeppelinHubRealm
保护您的Zeppelin信息(可选)
默认情况下,定义的任何人都 [users] 可以在 Apache Zeppelin 中共享解释器设置,凭证和配置信息。有时您可能希望隐藏这些用于您的用例的信息。由于 Shiro 提供了基于 URL 的安全性,您可以通过在下面的行中注释或取消注释来隐藏信息 conf/shiro.ini 。
[urls]
/api/interpreter/** = authc, roles[admin]
/api/configurations/** = authc, roles[admin]
/api/credential/** = authc, roles[admin]
在这种情况下,只有具有 admin 角色的角色才能看到解释器设置,凭据和配置信息。如果要向其他用户授予此权限,您可以按照在部分中定义的角色[]进行更改 [users] 。
6.2 笔记本授权
概述
我们假设有一个Shiro Authentication组件,它将用户字符串和一组组字符串与每个NotebookSocket相关联。如果您尚未设置身份验证组件,请先检查Apache Zeppelin的Shiro身份验证。
授权设置
您可以在每个笔记本中设置Zeppelin笔记本的权限。当然只有笔记本拥有者可以改变这个配置。只需单击锁定图标,然后打开笔记本中的权限设置页面。
您可以看到,每个Zeppelin笔记本有3个实体:
Owners ( users or groups )
Readers ( users or groups )
Writers ( users or groups )
image.png
用逗号分隔的用户和组中配置的conf/shiro.ini文件填写每个表单。如果表单为空(*),则表示任何用户都可以执行该操作。
如果没有读权限的人尝试访问笔记本电脑,或者没有写权限的人正在尝试编辑笔记本,则Zeppelin将要求登录或阻止用户。
image.png
image.png
6.3 数据源授权
概述
数据源授权涉及对数据源进行身份验证,如 Mysql 数据库,并确定用户权限。 Apache Zeppelin 允许用户使用自己的凭据与数据源进行身份验证。
例如,假设您在具有凭据的 Vertica 数据库中有一个帐户。您可能希望使用此帐户创建一个 JDBC 连接,而不是在 conf / shiro.ini 中定义的所有用户创建一个共享帐户。在这种情况下,您可以将凭据信息添加到 Apache Zeppelin 中,并使用以下简单步骤。
How to save the credential information? ( 如何保存凭证信息? )
您可以在数据源的下拉菜单中添加新的凭据,可以传递给解释器。
image.png
Entity ( 实体 ) 可以是区分每个凭证集的关键(我们建议** Entity** ( 实体 ) 的惯例是 [Interpreter Group].[Interpreter Name] )请查看 解释器组 的详细信息。
键入用户名和密码为您自己的凭据。 ex)** MySQL** 解释器的 Mysql 用户和密码。
image.png
根据** conf / shiro.ini** 中定义的用户保存凭据。如果您没有在 Apache Zeppelin 中激活 shiro 身份验证,则您的凭据信息将被保存为匿名。所有凭证信息也可以在 conf / credentials.json 中找到。
JDBC interpreter ( JDBC解释器 )
您需要维护每个用户的连接池。解释方法将用户字符串作为参数,并使用用户连接池中的连接执行 jdbc 调用。
Presto
如果** Presto DB** 服务器使用用户的 HDFS 授权运行后端代码,则不需要密码。
Vertica and Mysql
您必须存储用户的密码信息。