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容器无法访问此端口。
快速开始
在
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>在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-client和yarn-cluster。
SPARK_CONF_DIR
在zeppelin-env.sh中进行配置
因为解释器镜像中只有spark二进制文件,所以没有包含spark配置文件。 需要将zeppelin服务本地的
spark-中的配置文件上传到spark解释器容器中的/conf/ /spark/conf/目录。 因此,你需要在zeppelin-env.sh文件中设置export SPARK_CONF_DIR=/spark-。-path/conf/ 在Spark属性中配置
您也可以在spark解释器属性中进行配置。
属性名称 值 描述 SPARK_CONF_DIR /spark- -path.../conf/ Zeppelin 服务本地的 Spark- -path/conf/ 路径
HADOOP_CONF_DIR
在zeppelin-env.sh中进行配置
因为解释器镜像中只有spark二进制文件,不包含配置文件。 需要将zeppelin服务本地的
hadoop-中的配置文件上传到spark解释器容器中。 因此你需要在/etc/hadoop zeppelin-env.sh文件中设置export HADOOP_CONF_DIR=hadoop-。-path/etc/hadoop 在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来运行解释器。
- zeppelin-site.xml
| 配置变量 | 值 | 描述 |
|---|---|---|
ZEPPELIN_RUN_MODE |
docker |
让 Zeppelin 在 Docker 上运行解释器 |
ZEPPELIN_DOCKER_CONTAINER_IMAGE |
|
使用的Zeppelin解释器docker镜像 |