尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

如何开发自定义内核启动器:为 Jupyter Enterprise Gateway 接入新语言内核的完整教程

如何开发自定义内核启动器:为 Jupyter Enterprise Gateway 接入新语言内核的完整教程 如何开发自定义内核启动器为 Jupyter Enterprise Gateway 接入新语言内核的完整教程【免费下载链接】enterprise_gatewayA lightweight, multi-tenant, scalable and secure gateway that enables Jupyter Notebooks to share resources across distributed clusters such as Apache Spark, Kubernetes and others.项目地址: https://gitcode.com/gh_mirrors/en/enterprise_gatewayJupyter Enterprise Gateway 是一个轻量级、多租户、可扩展且安全的内核网关它让 Jupyter Notebook 能够跨 Apache Spark、Kubernetes、YARN 等分布式集群共享计算资源。当官方预置的 Python、R、Scala 内核无法满足你的需求时编写一个**自定义内核启动器Kernel Launcher**就是接入新语言内核的核心工作。本教程将带你从零理解内核启动器的原理与四大任务一步步完成一个可用、可调试、可部署的自定义内核启动器。一、先看懂架构Jupyter Enterprise Gateway 是怎么运作的在动手写代码之前先建立整体认知。Enterprise Gateway 位于客户端与分布式集群之间客户端Jupyter Notebook通过 HTTPS/WSS 连接网关网关负责在集群的某个工作节点上拉起内核进程并通过 ZeroMQ 端口维持 Jupyter 协议通信。每个内核对应一套连接信息而内核启动器正是负责创建这套连接信息、把内核送进集群的搬运工。官方架构文档 system-architecture.md 中对网关、进程代理Process Proxy和启动器的关系有完整描述建议作为深读参考。二、内核启动器是什么它要完成的四大核心任务内核启动器是一个独立的脚本或程序它替内核完成网关无法在本地完成的工作。官方将其职责归纳为四个任务创建连接信息基于 5 个 ZeroMQ 端口、签名密钥与算法标识以及一个网关监听套接字生成内核所需的连接文件回传连接信息用 AES 加密连接信息再用网关下发的公钥加密 AES 密钥把结果送回 Enterprise Gateway启动目标内核真正调用内核的入口如IRKernel::main()或IPKernelApp监听中断与关闭请求在通信套接字上等待网关发来的信号事件和关闭请求并执行。如果你只想先跑通最小案例建议直接基于官方 Python 启动器改造它是最完整、最容易阅读的参考实现launch_ipykernel.py。三、认识内核规范kernel.json 是你的第一块敲门砖Enterprise Gateway 通过**内核规范Kernelspec**来识别一个内核。每个内核在/usr/local/share/jupyter/kernels下对应一个目录目录里的kernel.json描述了启动命令argv、环境变量env和进程代理配置metadata.process_proxy。网关正是通过argv中的占位符把内核 ID、回传地址、公钥、端口范围等参数传给启动器的。以 spark_python_yarn_cluster/kernel.json 为例你会发现argv中出现了{kernel_id}、{response_address}、{public_key}、{port_range}这些占位符它们会在启动时被网关替换成真实值——你的自定义内核启动器必须能解析这些参数。详细的规范说明见 kernel-specification.md。四、第一步创建连接信息与通信端口你的启动器首先需要为目标内核准备一套连接信息。这套信息包含 5 个 ZeroMQ 端口shell、iopub、stdin、hb、control、一个 IP 地址、签名密钥与签名算法最终写入一个 JSON 连接文件。需要注意两点端口范围约束如果网关注入了--port-range每个端口都必须落在指定范围内。参考 launch_ipykernel.py 中的_select_ports()实现它会在范围内随机挑选可用端口网关通信端口启动器与网关之间用于传输信号/关闭请求的通信端口也应遵守该范围但它不是 ZeroMQ 端口。如果你的目标语言生态中没有现成的 ZeroMQ 端口创建库别慌——可以采用下文介绍的混合语言方案把连接信息、加密、监听这部分交给 Python 完成。五、第二步安全地把连接信息送回网关连接信息必须加密回传。流程是启动器生成一个 16 字节 AES 密钥用它对连接信息加密再用--public-key参数携带的网关公钥加密这个 AES 密钥最后把版本号、加密后的密钥、加密后的连接信息打包成 JSON 并 Base64 编码通过--response-address指定的地址发回网关。这段逻辑在 launch_ipykernel.py 的_encrypt()与return_connection_info()中实现得非常清晰同时也是 R 启动器的 server_listener.py 的同款代码——你可以直接复用这套加密模式保证与网关兼容。六、第三步启动目标内核完成回传后启动器调用内核本体。官方三个语言启动器展示了三种典型做法Python通过IPKernelApp启动。一个非常实用的技巧是Python 启动器支持--kernel-class-name参数任何ipykernel.kernelbase.Kernel的子类都能被它启动——这意味着你只需写一个内核类无需重写整个启动器R初始化 SparkContext 后调用IRKernel::main()启动 IRKernel见 launch_IRkernel.RScalaApache Toree 内核自带启动入口启动器把 SparkContext 初始化需求直接传达给内核见 ToreeLauncher.scala。七、第四步监听中断与关闭请求启动器还必须在通信端口上持续监听两类请求信号事件{signum: n}其中2表示 SIGINT中断当前计算0表示探活网关用它实现poll()判断进程是否存活关闭请求{shutdown: 1}收到后启动器应放弃监听并退出。八、混合语言方案R 内核启动器的智慧做法如果你的目标内核用其他语言编写比如 Julia、Go、Java最省力的路线是参考 R 启动器的混合方案用 Python 实现连接信息创建、AES/RSA 加密回传、信号监听这些通用骨架即 server_listener.py用目标语言只实现启动内核这一部分。这样你既不用重复实现加密协议又能把任何语言的进程接入网关。九、注册你的内核编写一份完整的 kernel.json完成启动器后写一份kernel.json让它被网关识别。一个面向分布式场景如 YARN Cluster的规范通常长这样{ language: python, display_name: My Custom Kernel, metadata: { process_proxy: { class_name: enterprise_gateway.services.processproxies.yarn.YarnClusterProcessProxy } }, env: { SPARK_HOME: /usr/hdp/current/spark2-client, LAUNCH_OPTS: }, argv: [ /usr/local/share/jupyter/kernels/my_custom_kernel/bin/run.sh, --RemoteProcessProxy.kernel-id, {kernel_id}, --RemoteProcessProxy.response-address, {response_address}, --RemoteProcessProxy.public-key, {public_key}, --RemoteProcessProxy.port-range, {port_range} ] }若你的内核运行在容器环境argv则改为调用launch_docker.py或launch_kubernetes.py并指定metadata.process_proxy.config.image_name参考 python_docker/kernel.json 与 scala_kubernetes/kernel.json。十、在 Kubernetes 与容器集群中部署自定义内核Kubernetes 是 Enterprise Gateway 最热门的部署场景网关以 Service/Deployment 形式运行在集群内内核以 Pod 形式动态创建内核镜像由 kernelspec 中的image_name指定。在容器场景接入自定义内核通常只需三步把启动器与内核打进自定义镜像 → 编写引用launch_kubernetes.py的 kernel.json模板见 kernel-pod.yaml.j2→ 在process_proxy.config中声明镜像名。Kubernetes 部署细节可参考官方文档 deploy-kubernetes.md。十一、本地调试与排错技巧 调试启动器最直接的方式是在 IDE 中本地运行 Enterprise Gateway通过环境变量控制行为KERNEL_LAUNCH_TIMEOUT默认 30 秒内核启动超时阈值超时会触发handle_timeout()并返回 HTTP 500EG_ENABLE_TUNNELING控制 SSH 隧道开关--EnterpriseGatewayApp.remote_hosts指定分布式启动器的目标主机列表。排查问题时先看网关侧日志确认启动器是否被调用、参数是否完整再看工作节点上的启动器日志确认连接文件是否生成、加密回传是否成功。官方 troubleshooting.md 收录了不少常见坑值得收藏。总结四个步骤让你的语言内核跑在分布式集群上回顾一下完整路线理解四大任务 → 复用官方启动器骨架 → 按需实现内核调用 → 编写 kernel.json 注册。Enterprise Gateway 的设计理念就是拥抱自带启动器只要你的启动器能创建连接信息、加密回传、拉起内核并响应信号任何语言内核都能无缝接入 Spark、Kubernetes、YARN 等集群。动手前建议先git clone https://gitcode.com/gh_mirrors/en/enterprise_gateway获取官方示例源码对照 etc/kernel-launchers 目录下的三种语言实现你会事半功倍。【免费下载链接】enterprise_gatewayA lightweight, multi-tenant, scalable and secure gateway that enables Jupyter Notebooks to share resources across distributed clusters such as Apache Spark, Kubernetes and others.项目地址: https://gitcode.com/gh_mirrors/en/enterprise_gateway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表