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中使用其他可视化库,例如ggplotgoogleVis

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, grpcioprotobufjupyter 解释器 所必需的,因为 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文件使用condamamba创建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库。