如何通过命令行检测AWS EMR中JupyterHub环境的活跃代码执行笔记本
针对JupyterHub 0.8.1+ EMR环境的活跃笔记本检测方案
核心判断逻辑
需要识别的正在执行代码的活跃笔记本,本质是检测当前内核处于执行占用状态的进程,而非识别常驻的单用户服务、已启动但闲置的内核、仅打开UI界面的空笔记本。
你之前使用的命令失效的核心原因:
jupyter notebook list仅展示常驻运行的单用户服务入口,不跟踪内核实际执行状态- 直接请求9443端口根路径下的
/api/sessions无有效输出,是因为JupyterHub的代理规则将每个用户的Notebook服务路由在/user/<用户名>/路径下,根路径不挂载单用户API ps aux | grep ipykernel会抓取所有已启动的ipykernel进程,哪怕内核已经完成执行、长期闲置,无法区分是否在运行代码- 用户接口返回的
last_activity在0.8.1版本中仅同步Hub层面的UI操作动作,不会更新单用户内核的代码执行状态,判定精度不足
可直接落地的命令行实现
第一步:获取Hub管理员访问权限
在EMR主节点执行以下命令,从本地Hub配置读取有效的管理员认证Token,避免手动配置凭证的麻烦:
# 读取0.8.1版本Hub容器内的本地认证凭证 ADMIN_TOKEN=$(sudo docker exec jupyterhub cat /data/jupyterhub_cookie_secret | head -c 32) HUB_API_BASE="https://localhost:9443"
第二步:拉取所有在线用户的Notebook服务路由
通过Hub管理员接口获取所有已启动单用户服务的用户列表,拿到对应用户的API访问路径:
ONLINE_USERS=$(curl -sk -H "Authorization: token $ADMIN_TOKEN" \ "$HUB_API_BASE/hub/api/users" | jq -r '.[].name')
第三步:逐用户检测正在执行代码的内核
利用单用户Notebook Server自带的内核状态接口,遍历所有用户的内核,判断是否存在执行状态为busy的活跃内核(状态为idle的即为打开但未运行代码的闲置内核):
TOTAL_ACTIVE_KERNELS=0 for username in $ONLINE_USERS; do # 拼接对应用户的内核状态API地址 KERNEL_API="$HUB_API_BASE/user/$username/api/kernels" # 统计当前用户下处于执行中状态的内核数量 BUSY_COUNT=$(curl -sk -H "Authorization: token $ADMIN_TOKEN" \ "$KERNEL_API" | jq '[.[] | select(.execution_state == "busy")] | length') if [ "$BUSY_COUNT" -gt 0 ]; then echo "用户 $username 存在 $BUSY_COUNT 个正在执行代码的活跃内核" TOTAL_ACTIVE_KERNELS=$((TOTAL_ACTIVE_KERNELS + BUSY_COUNT)) fi done # 输出最终集群层面的判定结果 if [ $TOTAL_ACTIVE_KERNELS -eq 0 ]; then echo "Jupyter层面无正在执行代码的活跃笔记本,符合空闲判定标准" else echo "当前共存在 $TOTAL_ACTIVE_KERNELS 个正在执行代码的活跃笔记本,集群不满足空闲终止条件" fi
EMR环境适配注意事项
- 所有请求走Hub内置的反向代理即可完成全量状态检查,不需要逐个进入用户容器执行内部命令
- 若需要叠加闲置时长判定,可以在请求内核状态时同时读取返回结果中的
last_activity字段,将连续处于idle状态超过设定阈值(如30分钟)的内核判定为闲置,进一步提升空闲检测的精度 - 0.8.1版本的单用户API默认开启权限校验,所有遍历请求必须携带有效的Hub管理员Token,否则会返回401无权限响应
内容的提问来源于stack exchange,提问作者Emme
相关产品推荐
相关产品推荐

