多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Apache Zeppelin 的 Docker 部署与镜像构建完整指南

Apache Zeppelin 的 Docker 部署与镜像构建完整指南 数据分析数据可视化大数据后端前端任务调度【免费下载链接】zeppelinWeb-based notebook that enables>项目地址https://gitcode.com/gh_mirrors/zeppe/zeppelin点击查看免费下载本指南基于 Apache Zeppelin 仓库中 docs/setup/deployment/docker.md 的官方说明系统讲解如何为 Zeppelin 发行版构建、发布和运行 Docker 镜像并深入展开 0.9 版本引入的「Zeppelin Server 与 Interpreter 拆分镜像」架构以及基于 Docker 的解释器隔离运行模式。读者读完可以掌握一条命令启动 Zeppelin 发行版容器、本地手工构建与多阶段构建镜像、配置解释器容器并理解其底层上传与启动机制从而在生产环境安全、可控地容器化部署 Zeppelin。一、概述Zeppelin 发行版的 Docker 化Zeppelin 官方提供两种 Docker 化路线全量一体化镜像all-in-oneZeppelin Server 与所有解释器打包在同一个容器中通过docker run一条命令即可启动整个服务适合快速试用与本地开发。Server / Interpreter 拆分镜像0.9 起支持借鉴 Kubernetes 中「控制面与工作负载分离」的思路Zeppelin Server 只承担 Web 界面与作业调度解释器则以独立容器按需拉起。这样既能按需裁剪镜像体积也为在 Docker/K8s 环境下的弹性伸缩打下基础。无论哪种路线容器内都遵循同一个约定Zeppelin 安装于/opt/zeppelin对应zeppelin.docker.container.home默认值见 ZeppelinConfiguration.javaWeb 端口固定为8080。二、快速开始运行 Zeppelin 发行版镜像2.1 前置条件需要先在宿主机上安装 Docker 引擎官方文档建议参考 Docker 官网的安装指南并确认 Docker 守护进程可用。2.2 一条命令启动 Zeppelin从 Docker Hub 拉取官方镜像并启动例如0.9.0版本docker run -p 8080:8080 -e ZEPPELIN_IN_DOCKERtrue --rm --name zeppelin apache/zeppelin-server:release-version参数说明-p 8080:8080将容器内 8080 端口映射到宿主机启动后通过http://localhost:8080访问 Zeppelin Web UI-e ZEPPELIN_IN_DOCKERtrue必须设置。该环境变量告知 Zeppelin 处于容器环境中否则无法看到解释器日志日志默认写向 stdout 之外的文件描述符容器退出后即丢失--rm容器停止后自动删除避免残留--name zeppelin为容器指定固定名称便于docker logs、docker exec等管理操作apache/zeppelin-server:release-version官方发布的 Zeppelin Server 镜像release-version替换为具体发行版本号如0.9.0、0.11.2。注意ZEPPELIN_IN_DOCKER只适用于从scripts/docker/zeppelin/bin构建的一体化镜像。而下面「构建 Zeppelin Server 与 Interpreter 拆分镜像」得到的zeppelin-server/zeppelin-interpreter镜像默认就把日志输出到 stdout不需要也不支持该变量。2.3 挂载日志与 Notebook 目录若要持久化日志与 Notebook 数据可以通过-v挂载卷并配合环境变量指定目录docker run -p 8080:8080 --rm \ -v $PWD/logs:/logs \ -v $PWD/notebook:/notebook \ -e ZEPPELIN_LOG_DIR/logs \ -e ZEPPELIN_NOTEBOOK_DIR/notebook \ -e ZEPPELIN_IN_DOCKERtrue \ --name zeppelin apache/zeppelin-server:release-version # e.g 0.9.0这里的关键点ZEPPELIN_LOG_DIR与ZEPPELIN_NOTEBOOK_DIR必须与卷挂载的目标路径/logs、/notebook保持一致否则 Zeppelin 会写到容器内的默认路径挂载不生效容器删除后$PWD/logs与$PWD/notebook中的数据仍然保留在宿主机实现数据与容器生命周期解耦。社区也提供了基于 docker-compose 的快速启动编排见 docker-compose-zeppelin-only.yml其中通过环境变量设置了ZEPPELIN_PORT8080与ZEPPELIN_MEM-Xmx1024m -XX:MaxMetaspaceSize512m。三、本地构建 Dockerfile不依赖官方镜像时可以在本地直接构建cd $ZEPPELIN_HOME cd scripts/docker/zeppelin/bin docker build -t my-zeppelin:my-tag ./$ZEPPELIN_HOME指向本地 Zeppelin 源码/发行目录构建上下文为脚本目录-t指定自定义镜像名与标签。在当前仓库中与这条说明对应的实际构建上下文位于 scripts/docker/zeppelin-server/Dockerfile含一体化镜像所需的全部文件与启动命令与 scripts/docker/zeppelin-interpreter/Dockerfile。四、构建 Zeppelin Server 与 Interpreter 拆分镜像自 0.9 版本起Zeppelin 支持在 k8s 或 docker 中运行因此官方新增了「Server 与 Interpreter 各自独立镜像」的构建能力。官方建议按需修改 Dockerfile 以适配自身环境并减小镜像体积。4.1 构建 zeppelin-distribution 基础镜像server 与 interpreter 镜像都从发行版内容出发因此第一步是先构建一个包含完整 Zeppelin 发行包的中间镜像cd $ZEPPELIN_HOME docker build -t zeppelin-distribution .该镜像充当多阶段构建的「源镜像」后续镜像通过COPY --fromzeppelin-distribution ...精确挑选所需文件WAR 包、bin、lib、plugins、notebook、k8s 配置等从而避免把整个发行版塞进最终产物。4.2 构建 Zeppelin Server 镜像cd $ZEPPELIN_HOME/scripts/docker/zeppelin-server docker build -t zeppelin-server .从源码 scripts/docker/zeppelin-server/Dockerfile 可以看到该镜像的关键设计基于ubuntu:22.04安装openjdk-11-jre-headless与tinitini 作为 PID 1 的 init 进程负责回收僵尸进程并正确转发信号见该文件的ENTRYPOINT [/usr/bin/tini, --]环境变量固化ZEPPELIN_HOME/opt/zeppelin、ZEPPELIN_ADDR0.0.0.0、ZEPPELIN_WAR_TEMPDIR/tmp/webapps从 distribution 镜像拷贝两个 Web 应用包zeppelin-web-version.war与zeppelin-web-angular-version.war以及 conf/bin/lib/plugins/k8s 目录与示例 notebook解释器按需裁剪默认把 distribution 镜像中所有解释器的interpreter-setting.json拷贝进镜像对应注释 Copy and activate all interpreters (default)若只想启用部分解释器可注释默认行、按需逐个COPY注释中给出了 spark、jdbc、md 的示例——这是减小镜像体积最直接的手段以非 root 用户USER 1000运行同时通过chgrp root /etc/passwd chmod ugrw /etc/passwd允许容器启动时动态写入用户条目EXPOSE 8080启动命令CMD [bin/zeppelin.sh]。4.3 构建 Zeppelin Interpreter 基础镜像cd $ZEPPELIN_HOME/scripts/docker/zeppelin-interpreter docker build -t zeppelin-interpreter-base .该镜像是解释器容器运行时的基础环境。从 scripts/docker/zeppelin-interpreter/Dockerfile 可见其重点同样基于ubuntu:22.04 OpenJDK 11并安装micromamba用于通过 conda 环境管理 Python 运行时默认全量拷贝interpreter目录注释 Build a huge image with all interpreters (default)如需瘦身可只拷贝zeppelin-interpreter-shaded-version.jar所有解释器运行所必需加上指定的单个解释器目录使用仓库中的 env_python_3.yml 创建/opt/condaPython 环境并设置SPARK_HOME/opt/conda/lib/python3.9/site-packages/pysparkPySpark 由 conda 环境提供拷贝 log4j.properties 与 log4j_yarn_cluster.properties 作为容器内日志配置以USER 1000运行ENTRYPOINT同样使用 tini。五、基于 Docker 的解释器隔离运行模式除了把整个 Zeppelin 容器化之外还有一种更精细的用法Zeppelin Server 运行在宿主机上只有解释器进程跑在 Docker 容器中。官方文档 docs/quickstart/docker.md 详细阐述了该模式与发行版镜像部署同属 Docker 生态是本节的核心参考。它的核心收益是解释器运行环境隔离不同解释器如 Python、Spark互不影响容器崩溃不影响 Server宿主机免安装运行时无需在本地安装 Python、Spark 等由容器提供自动上传本地解释器依赖Docker 镜像无需预装 Zeppelin 二进制Server 启动时自动把本地lib文件传入容器自动上传本地配置spark-conf、hadoop-conf-dir、keytab 文件等一并上传使容器内运行环境与本地完全一致Server 本地化、易运维Web 服务留在宿主机管理与监控更简单。5.1 前置条件与 Docker 守护进程配置前置条件包括apache/zeppelin镜像或自建解释器镜像若使用 Spark 解释器需要 Spark 2.2.0 的镜像Docker 1.6并建议使用宿主机网络host network以避免额外的网络配置。由于DockerInterpreterProcess通过 Docker 的TCP 接口与守护进程通信而 Docker 默认只提供 Unix socket 接口因此需要修改/etc/docker/daemon.json在hosts中同时开启 TCP 监听{ ... hosts: [tcp://0.0.0.0:2375,unix:///var/run/docker.sock] }其中hosts属性的完整取值语义可参考 Docker 引擎命令行参考dockerd。安全警告通过 TCP 暴露 Docker 守护进程是有潜在危险的。Docker 守护进程通常拥有较高权限只有可信用户才应能访问它。一旦通过 TCP 暴露必须借助防火墙确保只有可信用户能访问该端口同时确保 Zeppelin 启动的解释器容器本身无法访问这个端口否则可能被容器内恶意代码利用。5.2 快速配置在zeppelin-site.xml中修改两项配置切换解释器运行模式并指定解释器容器镜像property namezeppelin.run.mode/name valuedocker/value descriptionauto|local|k8s|docker/description /property property namezeppelin.docker.container.image/name valueapache/zeppelin/value descriptionDocker image for interpreters/description /propertyzeppelin.run.mode取值auto|local|k8s|docker默认值为auto见 ZeppelinConfiguration.java设置为docker后 Server 会自动装配 Docker 启动器zeppelin.docker.container.image默认值为apache/zeppelin:当前版本可通过 getDockerContainerImage() 读取。同时在zeppelin-env.sh中设置与 Server 相同的时区保证解释器容器与 Server 的时钟一致export ZEPPELIN_DOCKER_TIME_ZONEAmerica/New_York例如可取值America/New_York或Asia/Shanghai。对应环境变量模板见 zeppelin-env.sh.template注释为# export DOCKER_TIME_ZONE # Set to the same time zone as the zeppelin server。该时区会通过容器环境变量TZ注入见下节源码。5.3 工作原理从 Launcher 到容器的完整链路Zeppelin Server 运行于宿主机时会自动配置使用DockerInterpreterLauncher该启动器通过DockerInterpreterProcess为每个解释器组创建一个基于指定镜像的容器。这条链路的源码实现位于 zeppelin-plugins/launcher/docker/src/main/java/org/apache/zeppelin/interpreter/launcher/DockerInterpreterLauncher.java 与其配套的 DockerInterpreterProcess.java。5.3.1 启动器选择DockerInterpreterLauncher.launchDirectly()会按解释器类型选择底层的环境构建逻辑Spark 解释器使用SparkInterpreterLauncher、Flink 使用FlinkInterpreterLauncher其余使用StandardInterpreterLauncher随后统一交由DockerInterpreterProcess创建容器。5.3.2 容器启动流程DockerInterpreterProcess.start()源码位置的执行序列如下通过zeppelin.docker.host默认http://0.0.0.0:2375见 ZeppelinConfiguration.java创建 Docker 客户端检查并清理同名的遗留容器removeExistContainer避免 Docker「同名容器创建失败」的问题随机分配一个宿主机空闲端口作为解释器 RPC 服务端口并绑定0.0.0.0HostConfig使用networkMode(host)宿主网络这正是官方文档要求使用 host 网络的原因渲染 Jinja 模板生成容器内启动命令并注入环境变量ZEPPELIN_HOME、ZEPPELIN_CONF_DIR、SPARK_HOME、TZ时区、ZEPPELIN_FORCE_STOPtrue等见 getListEnvs()同时移除宿主机JAVA_HOME与PATH避免误配影响容器docker.pull拉取镜像如果本地没有createContainer、startContainer创建并启动容器向容器内上传运行所需文件见下文清单随后exec启动RemoteInterpreterServer进程容器内另有监控脚本持续探测该进程进程退出则容器随之退出通过 Thrift RPC 等待解释器回报processStarted(port, host)并在zeppelin.interpreter.connect.timeout超时窗口内探测 RPC 端点可达性超时会主动stop()并抛出 Launching zeppelin interpreter on docker is time out, kill it now 异常。5.3.3 自动上传到容器内的文件copyRunFileToContainer()源码位置会把下列本地文件打包tar后上传并解压到容器并保持与本地一致的路径从而保证所有配置在容器内依然有效${ZEPPELIN_HOME}/binZeppelin 启动脚本${ZEPPELIN_HOME}/libZeppelin 运行库${ZEPPELIN_HOME}/interpreter/${interpreterGroupName}对应解释器组的依赖${ZEPPELIN_HOME}/conf/zeppelin-site.xml${ZEPPELIN_HOME}/conf/log4j.properties、log4j2.properties、log4j_yarn_cluster.propertiesHADOOP_CONF_DIR若设置了该环境变量整目录上传SPARK_CONF_DIR上传到容器内/opt/spark/conf并回写SPARK_CONF_DIR环境变量指向容器内路径/etc/krb5.confKerberos 认证若存在解释器配置中指定的 keytab 文件依次检查zeppelin.shell.keytab.location、spark.yarn.keytab、zeppelin.livy.keytab、zeppelin.jdbc.keytab.location以及zeppelin.server.kerberos.keytab上传行为受zeppelin.docker.upload.local.lib.to.container控制默认true见 ZeppelinConfiguration.java开启后本地解释器lib目录中所有.jar文件也会一并上传其源码注释说明了这样做的三个好处——避免容器内 Zeppelin 版本与本地不一致、规避不同版本RemoteInterpreterServer参数差异、便于开发调试时快速更新库文件。5.4 Spark 解释器在 Docker 中的配置当解释器组为spark时Zeppelin 会自动设置必要的 Spark 配置以在 Docker 上运行 Spark且支持local[*]、yarn-client、yarn-cluster三种 Spark 运行模式。SPARK_CONF_DIR解释器镜像内只有 Spark 二进制不包含 Spark 配置文件因此需要把 Zeppelin 服务本地的spark-version/conf/上传到解释器容器内的/spark/conf/在zeppelin-env.sh中设置export SPARK_CONF_DIR/spark-version-path/conf/或在 Spark 解释器属性中配置属性名值说明SPARK_CONF_DIR/spark-version-path/conf/Zeppelin 服务本地的spark-version-path/conf/路径HADOOP_CONF_DIR同理解释器镜像不包含 Hadoop 配置文件需要上传 Zeppelin 服务本地的hadoop-version/etc/hadoop在zeppelin-env.sh中设置export HADOOP_CONF_DIRhadoop-version-path/etc/hadoop或在 Spark 解释器属性中配置属性名值说明HADOOP_CONF_DIRhadoop-version-path/etc/hadoopZeppelin 服务本地的 Hadoop 配置目录访问 Spark UI由于解释器容器使用宿主网络spark.ui.port会自动分配可用端口因此不要在spark-defaults.conf中手工配置spark.ui.portxxxx以免端口冲突导致 Spark UI 无法访问。5.5 手动构建解释器镜像支持 Kerberos 与 Spark官方在 scripts/docker/interpreter/Dockerfile 提供了可手动定制的解释器镜像支持 Kerberos 认证并预装 Spark 二进制。其核心内容当前仓库版本以 Spark 3.5.1 hadoop3 为例源码中已参数化为SPARK_VERSION/SPARK_BIN_NAME构建参数FROM apache/zeppelin:0.11.2-SNAPSHOT LABEL maintainerApache Zeppelin Community devzeppelin.apache.org ARG SPARK_VERSION3.5.1 ARG SPARK_BIN_NAMEhadoop3 USER root # 支持 Kerberos 认证 RUN export DEBIAN_FRONTENDnoninteractive 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 # 自动上传 zeppelin 解释器 lib容器内不保留 /opt/zeppelin由 Server 动态上传 RUN rm -rf /opt/zeppelin RUN rm -rf /spark RUN wget -O spark-${SPARK_VERSION}-bin-${SPARK_BIN_NAME}.tgz https://www.apache.org/dyn/closer.lua/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-${SPARK_BIN_NAME}.tgz?actiondownload RUN tar zxvf spark-${SPARK_VERSION}-bin-${SPARK_BIN_NAME}.tgz RUN mv spark-${SPARK_VERSION}-bin-${SPARK_BIN_NAME} /opt/spark RUN rm spark-${SPARK_VERSION}-bin-${SPARK_BIN_NAME}.tgz构建命令tag替换为自己的标签# build image. Replace tag. $ docker build -t tag .要点解读通过krb5-user、libpam-krb5支持 Kerberostzdata用于容器内时区rm -rf /opt/zeppelin配合「Server 自动上传本地解释器 lib」机制保证镜像内解释器与 Server 版本完全一致Spark 二进制下载并解压到/opt/spark与zeppelin.docker.container.spark.home默认/opt/spark见 ZeppelinConfiguration.java保持一致该 Dockerfile 的FROM apache/zeppelin:0.11.2-SNAPSHOT是历史的版本示例实际构建时应替换为当前使用的 Zeppelin 镜像版本。六、运维要点与故障排查结合DockerInterpreterProcess的实现以下是容器化部署时最值得关注的几点连接超时Docker 模式需要拉镜像、创建并启动容器耗时长。DockerInterpreterLauncher在zeppelin.interpreter.connect.timeout小于 200 秒时会打印警告并建议调大该值推荐 200 秒见 DockerInterpreterLauncher.java。若容器创建失败优先检查该项。容器命名冲突Docker 不允许同名容器。DockerInterpreterProcess在启动前会先清理同名遗留容器removeExistContainer若 Server 异常退出导致容器残留再次启动时会自动 kill 并删除。容器生命周期stop()会先通过 RPC 关闭RemoteInterpreterServer再killContainerremoveContainer并关闭 Docker 客户端启动过程中任何异常都会执行cleanupContainerQuietly()回滚避免孤儿容器泄漏。故障信息getErrorMessage()会检查容器状态若容器因OOMKilled被杀死或非零退出码退出会返回诸如 Interpreter container xxx was OOMKilled (exitCode...) 的明确错误见 describeContainerFailure。TCP 暴露 Docker 守护进程的风险务必按 5.1 节的安全警告配置防火墙并确保解释器容器无法访问2375端口。七、开发调试模式开发迭代阶段无需每次重新构建发行包与镜像Zeppelin 可以本地运行例如在 IDE 中以 debug 模式启动并配合DockerInterpreterLauncher让解释器运行在 Docker 中只需配置以下环境变量zeppelin-site.xml配置变量值说明ZEPPELIN_RUN_MODEdocker让 Zeppelin 在 Docker 上运行解释器ZEPPELIN_DOCKER_CONTAINER_IMAGEimage:version使用的 Zeppelin 解释器 Docker 镜像上传机制的关键在于zeppelin.docker.upload.local.lib.to.containertrue默认开启本地改动后的 lib 会随每次启动自动同步到容器实现「改代码 → 重启 Server → 容器内即为最新库」的快速调试循环——这正是源码注释中强调的in the debugging phase for easy updating设计意图。八、相关资源本文涉及的仓库资源一览官方部署文档docs/setup/deployment/docker.md解释器 Docker 模式文档docs/quickstart/docker.md镜像构建脚本scripts/docker/zeppelin-server/Dockerfile、scripts/docker/zeppelin-interpreter/Dockerfile、scripts/docker/interpreter/Dockerfile启动器源码DockerInterpreterLauncher.java、DockerInterpreterProcess.java配置项定义ZeppelinConfiguration.java、zeppelin-site.xml.template、zeppelin-env.sh.template快速启动编排docker-compose-zeppelin-only.yml整体来看Zeppelin 的 Docker 化部署遵循「官方镜像开箱即用 拆分镜像按需裁剪 解释器容器动态装配」的分层思路发行版镜像解决快速启动问题Server/Interpreter 拆分镜像解决镜像体积与资源隔离问题而DockerInterpreterProcess的「本地文件自动上传、路径保持一致」机制则保证了容器内运行环境与宿主机配置的严格一致。掌握这三层即可在开发、测试与生产环境中灵活驾驭 Zeppelin 的容器化运行。赞分享数据分析数据可视化大数据后端前端任务调度【免费下载链接】zeppelinWeb-based notebook that enables>项目地址https://gitcode.com/gh_mirrors/zeppe/zeppelin点击查看免费下载相关推荐Apache Zeppelin Docker部署完全指南Apache Zeppelin Docker部署完全指南 概述 Apache Zeppelin作为一款强大的交互式数据分析和可视化工具通过Docker容器化部数据分析数据可视化大数据后端前端任务调度Apache Druid Docker 镜像构建与集群部署完全指南Apache Druid Docker 镜像构建与集群部署完全指南 导读 本文以 Apache Druid 官方仓库中的 distribution/docke数据库OLAP大数据后端Docker部署Meshroom3步构建Ubuntu与Rocky镜像的完整指南Docker部署Meshroom3步构建Ubuntu与Rocky镜像的完整指南 Meshroom 是一款开源的节点式可视化编程工具箱Node based V计算机视觉桌面应用图形学上一篇如何快速修复损坏的MP4视频Untrunc视频修复工具完整指南下一篇SeetaFaceEngine API使用指南从基础调用到高级配置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表