如何克隆JupyterHub已有预配置kernel自定义安装所需软件包?
操作全程不需要管理员权限,克隆后的kernel完整保留默认kernel预初始化的spark/sc等Spark对象,同时支持个人独立安装第三方包,不影响全局环境、不干扰其他用户。
第一步:定位默认Spark Kernel的存储路径
启动一个默认Spark Kernel的Notebook,在单元格里执行命令列出所有已注册的kernel:!jupyter kernelspec list在输出结果里找到标记为默认、名称带pyspark/spark的条目,记下它对应的系统路径,全局安装的kernel一般在
/usr/local/share/jupyter/kernels/pyspark这类系统目录下。第二步:复制全局Kernel配置到个人目录
打开JupyterHub的终端(Terminal),执行命令把全局Spark Kernel的整个配置文件夹复制到你个人的Jupyter Kernel目录,新文件夹名就是你自定义kernel的标识,比如命名为pyspark-personal:# 先确保个人kernel目录存在 mkdir -p ~/.local/share/jupyter/kernels/ # 复制全局配置到个人目录 cp -r /usr/local/share/jupyter/kernels/pyspark ~/.local/share/jupyter/kernels/pyspark-personal第三步:修改新Kernel配置,保留Spark能力+开启个人包支持
进入刚复制的新kernel文件夹,编辑里面的kernel.json配置文件:- 把
display_name字段的值改成你在Jupyter启动页想看到的名称,比如个人专属PySpark - 不要改动 配置里和Spark启动、预初始化逻辑相关的内容:包括
PYSPARK_PYTHON等环境变量、Spark提交参数、预执行的初始化脚本路径,这部分是保留默认预初始化Spark对象的核心,改动会导致Spark对象无法正常加载 - 找到启动命令
argv数组里的Python启动参数,把里面的-s参数删掉——这个参数的作用是禁用Python加载用户目录下的本地site-packages,删掉之后就能正常读取你个人安装的包 - (可选)如果要固定个人包路径优先级,可以在
env配置块里加一行"PYTHONUSERBASE": "/home/你的用户名/.local",替换成你自己的用户home路径即可。
- 把
第四步:验证效果
保存kernel.json之后刷新JupyterHub页面,就能在Kernel列表里看到你新建的自定义Kernel:验证项1:启动新Kernel后直接输入
spark执行,能正常返回SparkSession实例对象,和默认Kernel的初始化状态完全一致,说明Spark对象保留成功
验证项2:执行!pip install --user 你需要的包名(比如pandas),安装完成后直接import对应包能正常导入;切回全局默认Spark Kernel执行import,不会读到你刚装的个人包,说明包隔离生效,不会影响全局环境。
注意事项
- 后续装第三方包一律加
--user参数,否则会因为没有全局目录写权限报错,也不会污染全局环境 - 不要随意改动
kernel.json里的Spark master地址、部署模式、pyspark依赖路径等配置,否则会导致Spark上下文启动失败 - 如果管理员后续更新了全局默认Spark Kernel的配置,你的个人克隆版不会自动同步,需要重新复制一次配置再按上述步骤修改即可。
内容的提问来源于stack exchange,提问作者neves

