Docker上的Zeppelin解释器

Zeppelin 服务运行在本地服务器上。Zeppelin 能够在 Docker 容器中运行解释器,通过 Docker 容器隔离解释器的操作环境。Zeppelin 可以轻松使用,无需在本地节点上安装 Python、Spark 等。

主要优势是

  • 解释器环境隔离
  • 不需要在本地节点上安装python、spark等环境
  • Docker 不需要预先安装 zeppelin 二进制包,自动将本地的 zeppelin 解释器库文件上传到容器中
  • 自动将本地配置文件(如spark-conf、hadoop-conf-dir、keytab文件等)上传到容器中,使容器中的运行环境与本地完全相同。
  • Zeppelin 服务器在本地运行,使其更易于管理和维护

先决条件

  • apache/zeppelin docker 镜像
  • Spark >= 2.2.0 的 Docker 镜像(如果使用 Spark 解释器)
  • Docker 1.6+ Install Docker
  • 使用docker的主机网络,因此无需专门设置网络

Docker 配置

因为 DockerInterpreterProcess 通过 docker 的 tcp 接口进行通信。

默认情况下,docker 提供了一个作为 sock 文件的接口,因此您需要修改配置文件以远程打开 tcp 接口。

编辑 /etc/docker/daemon.json,将 tcp://0.0.0.0:2375 添加到 hosts 配置项中。

{
    ...
    "hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}

hosts 属性参考: https://docs.docker.com/engine/reference/commandline/dockerd/

安全警告

使Docker守护进程通过TCP可用是潜在危险的:正如您可以阅读这里,Docker守护进程通常具有广泛的权限,因此只有受信任的用户才能访问它。如果您通过TCP暴露守护进程,您必须使用防火墙来确保只有受信任的用户可以访问该端口。这也包括确保由Zeppelin启动的解释器Docker容器无法访问此端口。

快速开始

  1. zeppelin-site.xml中修改这两个配置项。

    <property>
    <name>zeppelin.run.mode</name>
    <value>docker</value>
    <description>'auto|local|k8s|docker'</description>
    </property>
    
    <property>
    <name>zeppelin.docker.container.image</name>
    <value>apache/zeppelin</value>
    <description>Docker image for interpreters</description>
    </property>
    
  2. 在zeppelin-env.sh中设置时区

    设置为与zeppelin服务器相同的时区,保持解释器docker容器中的时区与服务器相同。例如,"America/New_York""Asia/Shanghai"

    export ZEPPELIN_DOCKER_TIME_ZONE="America/New_York"
    

手动构建Zeppelin镜像

构建Zeppelin镜像,支持Kerberos认证并安装spark二进制文件。

使用/scripts/docker/interpreter/Dockerfile来构建镜像。

FROM apache/zeppelin:0.8.0
MAINTAINER Apache Software Foundation <dev@zeppelin.apache.org>

ENV SPARK_VERSION=2.3.3
ENV HADOOP_VERSION=2.7

# support Kerberos certification
RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -yq krb5-user libpam-krb5 && apt-get clean

RUN apt-get update && apt-get install -y curl unzip wget grep sed vim tzdata && apt-get clean

# auto upload zeppelin interpreter lib
RUN rm -rf /zeppelin

RUN rm -rf /spark
RUN wget https://www-us.apache.org/dist/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz
RUN tar zxvf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz
RUN mv spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION} spark
RUN rm spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz

然后构建docker镜像。

# build image. Replace <tag>.
$ docker build -t <tag> .

它是如何工作的

Docker上的Zeppelin解释器

Zeppelin 服务运行在本地服务器上,它会自动配置自己使用 DockerInterpreterLauncher

DockerInterpreterLauncher 通过 DockerInterpreterProcess 启动器使用 docker 镜像在容器中创建每个解释器。

DockerInterpreterProcess 将本地 zeppelin 服务的二进制文件和配置文件上传到容器中:

  • ${ZEPPELIN_HOME}/bin
  • ${ZEPPELIN_HOME}/lib
  • ${ZEPPELIN_HOME}/interpreter/${interpreterGroupName}
  • ${ZEPPELIN_HOME}/conf/zeppelin-site.xml
  • ${ZEPPELIN_HOME}/conf/log4j.properties
  • ${ZEPPELIN_HOME}/conf/log4j_yarn_cluster.properties
  • HADOOP_CONF_DIR
  • SPARK_CONF_DIR
  • /etc/krb5.conf
  • 在解释器属性中配置的Keytab文件
    • zeppelin.shell.keytab.location
    • spark.yarn.keytab
    • submarine.hadoop.keytab
    • zeppelin.jdbc.keytab.location
    • zeppelin.server.kerberos.keytab

所有上传到容器的文件路径,保持与本地路径相同。这将确保所有配置都能正确使用。

Docker上的Spark解释器

当解释器组为spark时,Zeppelin会自动设置必要的spark配置以在Docker上使用Spark。 支持zeppelin spark解释器的所有运行模式,包括local[*]yarn-clientyarn-cluster

SPARK_CONF_DIR

  1. 在zeppelin-env.sh中进行配置

    因为解释器镜像中只有spark二进制文件,所以没有包含spark配置文件。 需要将zeppelin服务本地的spark-/conf/中的配置文件上传到spark解释器容器中的/spark/conf/目录。 因此,你需要在zeppelin-env.sh文件中设置export SPARK_CONF_DIR=/spark--path/conf/

  2. 在Spark属性中配置

    您也可以在spark解释器属性中进行配置。

    属性名称 描述
    SPARK_CONF_DIR /spark--path.../conf/ Zeppelin 服务本地的 Spark--path/conf/ 路径

HADOOP_CONF_DIR

  1. 在zeppelin-env.sh中进行配置

    因为解释器镜像中只有spark二进制文件,不包含配置文件。 需要将zeppelin服务本地的hadoop-/etc/hadoop中的配置文件上传到spark解释器容器中。 因此你需要在zeppelin-env.sh文件中设置export HADOOP_CONF_DIR=hadoop--path/etc/hadoop

  2. 在Spark属性中配置

    您也可以在spark解释器属性中进行配置。

    属性名称 描述
    HADOOP_CONF_DIR hadoop--path/etc/hadoop hadoop--path/etc/hadoop 路径在 zeppelin 服务本地

访问 Spark UI(或在解释器容器中运行的服务)

因为zeppelin解释器容器使用主机网络,spark.ui.port端口会自动分配,所以不要在spark-defaults.conf中配置spark.ui.port=xxxx

未来工作

  • 通过配置可以配置不同解释器使用的容器资源。

开发

在开发过程中,不必每次都构建Zeppelin的发行包和Docker镜像,Zeppelin可以在本地运行(例如在IDE的调试模式下),并通过配置以下环境变量使用DockerInterpreterLauncher来运行解释器。

  1. zeppelin-site.xml
配置变量 描述
ZEPPELIN_RUN_MODE docker 让 Zeppelin 在 Docker 上运行解释器
ZEPPELIN_DOCKER_CONTAINER_IMAGE : 使用的Zeppelin解释器docker镜像