Apache Zeppelin 的 R 解释器
概述
R 是一个用于统计计算和图形的免费软件环境。
要在Apache Zeppelin中运行R代码并可视化图表,您需要在Zeppelin服务器节点(或您的开发笔记本电脑)上安装R。
- 对于Centos系统:
yum install R R-devel libcurl-devel openssl-devel - 对于Ubuntu系统:
apt-get install r-base
使用一个简单的R命令验证您的安装:
R -e "print(1+1)"
要享受绘图功能,请安装额外的库:
带有开发工具的
R -e "install.packages('devtools', repos = 'http://cran.us.r-project.org')"knitr 与
R -e "install.packages('knitr', repos = 'http://cran.us.r-project.org')"使用ggplot2
R -e "install.packages('ggplot2', repos = 'http://cran.us.r-project.org')"其他可视化库:
R -e "install.packages(c('devtools','mplot', 'googleVis'), repos = 'http://cran.us.r-project.org'); require(devtools); install_github('ramnathv/rCharts')"
我们建议您也安装以下可选的R库,以便愉快地进行数据分析:
- glmnet
- pROC
- data.table
- caret
- sqldf
- 词云
支持的解析器
Zeppelin 支持在 3 种解释器中使用 R 语言
| 名称 | 类别 | 描述 |
|---|---|---|
| %r.r | RInterpreter | Vanilla r 解释器,依赖最少,仅需要 R 环境和 knitr。
始终建议使用完全限定的解释器名称 %r.r,因为 %r 是模糊的,
当当前笔记的默认解释器是 %spark 时,它可能意味着 %spark.r,而当默认解释器是 %r 时,它可能意味着 %r.r |
| %r.ir | IRInterpreter | 通过[IRKernel](https://github.com/IRkernel/IRkernel)提供更高级的R运行时体验,几乎与在Jupyter中使用R的体验相同。它需要更多的配置,但这是在Zeppelin中使用R的推荐解释器。 |
| %r.shiny | ShinyInterpreter | 在Zeppelin中运行Shiny应用程序 |
如果你想在Spark中使用R,通过%spark.r、%spark.ir和%spark.shiny几乎是一样的。你可以参考Spark解释器文档了解更多详情。
配置
| 属性 | 默认值 | 描述 |
|---|---|---|
| zeppelin.R.cmd | R | 已安装的R二进制文件的路径。如果R不在你的$PATH中,你应该明确设置这个属性(例如:/usr/bin/R)。
|
| zeppelin.R.knitr | true | 是否使用knitr。建议安装[knitr](https://yihui.org/knitr/) |
| zeppelin.R.image.width | 100% | R绘图图像的宽度 |
| zeppelin.R.shiny.iframe_width | 100% | Shiny应用的IFrame宽度 |
| zeppelin.R.shiny.iframe_height | 500px | Shiny应用的IFrame高度 |
| zeppelin.R.shiny.portRange | : | Shiny 应用程序会在某个端口启动一个网页应用,此属性用于通过格式 'start':'end' 指定端口范围,例如 '5000:5001'。默认情况下为 ':',表示任意端口。 |
| zeppelin.R.maxResult | 1000 | 使用 z.show 时显示的数据框行数的最大值 |
在Zeppelin docker中运行R
对于初学者,我们建议您先在Zeppelin docker中尝试使用R。在Zeppelin docker镜像中,我们已经安装了R和许多有用的R库,包括IRKernel的先决条件,因此%r.ir是可用的。
无需任何额外配置,您可以直接运行R Tutorial文件夹下的大部分教程笔记。
docker run -u $(id -u) -p 8080:8080 -p:6789:6789 --rm --name zeppelin apache/zeppelin:0.11.2
运行上述命令后,您可以打开http://localhost:8080在Zeppelin中玩R。
上述命令中暴露的端口6789用于R shiny应用程序。您需要设置以下2个解释器属性,以便在Zeppelin docker容器中启用shiny应用程序作为iframe访问。
zeppelin.R.shiny.portRange设置为6789:6789- 将
ZEPPELIN_LOCAL_IP设置为0.0.0.0

解释器绑定模式
默认的解释器绑定模式是globally shared。这意味着所有笔记共享同一个R解释器。
因此,我们建议您使用isolated per note,这意味着每个笔记都有自己的R解释器,互不影响。但如果创建了太多的R解释器,可能会耗尽您的机器资源。您可以在yarn模式下运行R来避免这个问题。
如何使用R解释器
R解释器有两种不同的实现:%r.r 和 %r.ir。
- Vanilla R 解释器(
%r.r) 的行为类似于普通的 REPL,并使用 SparkR 在 R 进程和 JVM 进程之间进行通信。它需要安装knitr。 - IRKernel R 解释器(
%r.ir) 的行为类似于在 Jupyter notebook 中使用 IRKernel。它基于 jupyter 解释器。除了 jupyter 解释器的先决条件外,还需要安装 IRkernel。
查看教程笔记 R Tutorial/1. R Basics 了解如何在 Zeppelin 中编写 R 代码。
R 基础表达式
R 基本表达式在 %r.r 和 %r.ir 中都得到支持。

R 基础绘图
R 基础绘图在 %r.r 和 %r.ir 中都得到支持。

其他绘图
除了R基础绘图,你还可以在%r.r和%r.ir中使用其他可视化库,例如ggplot和googleVis


z.show
z.show() 仅在 %r.ir 中可用,用于可视化 R 数据框,例如。

默认情况下,z.show 只会显示1000行,你可以通过 z.show(df, maxRows=2000) 指定最大行数。
在Zeppelin中创建Shiny应用
Shiny 是一个R包,可以轻松地从R直接构建交互式Web应用程序(应用)。
%r.shiny 用于在Zeppelin笔记本中开发R Shiny应用。它仅在启用IRKernel解释器(%r.ir)时有效。
要在Zeppelin中开发一个Shiny应用,您需要至少编写3个段落(服务器类型段落、UI类型段落和运行类型段落)。
- 服务器类型 R shiny 段落
%r.shiny(type=server)
# Define server logic to summarize and view selected dataset ----
server <- function(input, output) {
# Return the requested dataset ----
datasetInput <- reactive({
switch(input$dataset,
"rock" = rock,
"pressure" = pressure,
"cars" = cars)
})
# Generate a summary of the dataset ----
output$summary <- renderPrint({
dataset <- datasetInput()
summary(dataset)
})
# Show the first "n" observations ----
output$view <- renderTable({
head(datasetInput(), n = input$obs)
})
}
- UI 类型 R shiny 段落
%r.shiny(type=ui)
# Define UI for dataset viewer app ----
ui <- fluidPage(
# App title ----
titlePanel("Shiny Text"),
# Sidebar layout with a input and output definitions ----
sidebarLayout(
# Sidebar panel for inputs ----
sidebarPanel(
# Input: Selector for choosing dataset ----
selectInput(inputId = "dataset",
label = "Choose a dataset:",
choices = c("rock", "pressure", "cars")),
# Input: Numeric entry for number of obs to view ----
numericInput(inputId = "obs",
label = "Number of observations to view:",
value = 10)
),
# Main panel for displaying outputs ----
mainPanel(
# Output: Verbatim text for data summary ----
verbatimTextOutput("summary"),
# Output: HTML table with requested number of observations ----
tableOutput("view")
)
)
)
- 运行类型 R shiny 段落
%r.shiny(type=run)
执行运行类型R shiny段落后,shiny应用程序将启动并作为iframe嵌入段落中。
查看教程笔记R Tutorial/2. Shiny App了解如何开发R shiny应用程序。

运行多个Shiny应用程序
如果你想运行多个Shiny应用程序,你可以在段落本地属性中指定app来区分不同的Shiny应用程序。
例如。
%r.shiny(type=ui, app=app_1)
%r.shiny(type=server, app=app_1)
%r.shiny(type=run, app=app_1)
在yarn集群中运行R
Zeppelin 支持 在 yarn 集群中运行解释器。但是在 yarn 集群中运行 R 有一个关键问题:如何在 yarn 容器中管理 R 环境。 因为 yarn 集群是一个由许多节点组成的分布式集群,而你的 R 解释器可以在任何节点上启动。 在每个节点上管理 R 环境是不现实的。
因此,为了在yarn集群中运行R,我们建议您使用conda来管理您的R环境,Zeppelin可以将您的R conda环境发送到yarn容器中,这样每个R解释器都可以拥有自己的R环境而不会相互影响。
需要注意的是,您只能在yarn集群中运行IRKernel解释器(%r.ir)。因此,请确保在下面的conda环境中至少包含以下先决条件:
- python
- jupyter
- grpcio
- protobuf
- r-base
- R 基础
- r-irkernel
python, jupyter, grpcio 和 protobuf 是 jupyter 解释器 所必需的,因为 IRKernel 解释器基于 jupyter 解释器。其他的是用于 R 运行时的。
以下是关于如何在Yarn集群中运行R的说明。你可以在教程笔记R Tutorial/3. R Conda Env in Yarn Mode中找到所有代码。
步骤 1
我们建议您使用 conda pack 来创建 conda 环境的存档。
这是一个用于生成包含R和一些有用R库的conda环境的yaml文件示例。
- 为conda环境创建一个yaml文件,将以下内容写入文件
r_env.yml
name: r_env
channels:
- conda-forge
- defaults
dependencies:
- python=3.9
- jupyter
- grpcio
- protobuf
- r-base=3
- r-essentials
- r-evaluate
- r-base64enc
- r-knitr
- r-ggplot2
- r-irkernel
- r-shiny
- r-googlevis
- 通过此yaml文件使用
conda或mamba创建conda环境
conda env create -f r_env.yml
mamba env create -f r_env.yml
- 使用
conda打包 conda 环境
conda pack -n r_env
步骤 2
指定以下属性以通过内联配置为R解释器启用yarn模式
%r.conf
zeppelin.interpreter.launcher yarn
zeppelin.yarn.dist.archives hdfs:///tmp/r_env.tar.gz#environment
zeppelin.interpreter.conda.env.name environment
zeppelin.yarn.dist.archives 是第一步中创建的R conda环境tar文件。这个tar文件将被发送到yarn容器,并在yarn容器的工作目录中解压。
hdfs:///tmp/r_env.tar.gz 是你在第二步中创建的R conda归档文件。hdfs:///tmp/r_env.tar.gz#environment 中的 environment 是解压后的文件夹名称。
这个文件夹名称应与 zeppelin.interpreter.conda.env.name 相同。
步骤 3
现在你可以在yarn容器中运行R解释器,并且可以使用你在步骤1中指定的任何R库。