我已经在https://cloud.google.com/dataproc/docs/tutorials/jupyter-notebook看到了使用 dataproc 设置 Jupyter 笔记本的说明,但我不知道如何更改流程以使用 Cloud shell而不是在本地创建 SSH 隧道。我已经能够通过运行连接到数据实验室笔记本
datalab connect vmname
从云外壳,然后使用预览功能。我想做类似的事情,但使用 Jupyter 笔记本和数据处理集群。
我已经在https://cloud.google.com/dataproc/docs/tutorials/jupyter-notebook看到了使用 dataproc 设置 Jupyter 笔记本的说明,但我不知道如何更改流程以使用 Cloud shell而不是在本地创建 SSH 隧道。我已经能够通过运行连接到数据实验室笔记本
datalab connect vmname
从云外壳,然后使用预览功能。我想做类似的事情,但使用 Jupyter 笔记本和数据处理集群。
理论上,您几乎可以按照与https://cloud.google.com/shell/docs/features#web_preview相同的说明使用本地端口转发通过 Cloud Shell 的相同“网络预览”访问 Dataproc 上的 Jupyter 笔记本特征。在您的云外壳中类似于以下内容:
gcloud compute ssh my-cluster-m -- -L 8080:my-cluster-m:8123
但是,有两个问题阻止了它的工作:
您需要修改 Jupyter 配置以将以下内容添加到底部/root/.jupyter/jupyter_notebook_config.py
:
c.NotebookApp.allow_origin = '*'
Cloud Shell 的网页预览版需要添加对 websockets 的支持。
如果您不这样做 (1),那么由于 Jupyter 拒绝云外壳代理域,您将在尝试创建笔记本时收到弹出错误。不幸的是(2)需要 Cloud Shell 本身更深层次的支持;它会表现为错误A connection to the notebook server could not be established.
另一个无需等待 (2) 的可能选项是运行您自己的 nginx 代理,作为 Dataproc 集群上的 jupyter 初始化操作的一部分,前提是您可以将其适当地代理 websockets。有关类似情况,请参见此线程:https ://github.com/jupyter/notebook/issues/1311
通常,代理层中这种类型的破坏 websocket 支持是一个常见问题,因为它仍然相对较新;随着时间的推移,越来越多的东西将开始支持开箱即用的 websockets。
或者:
Dataproc 还支持使用 Datalab 初始化操作;这是这样设置的,以便已经处理了 websockets 代理。因此,如果您不是特别依赖 Jupyter,那么以下在 cloud shell 中有效:
gcloud dataproc clusters create my-datalab-cluster \
--initialization-actions gs://dataproc-initialization-actions/datalab/datalab.sh
gcloud compute ssh my-datalab-cluster-m -- -L 8080:my-datalab-cluster-m:8080
然后在端口 8080 上选择通常的“Web 预览”。或者您可以为本地绑定选择其他 Cloud Shell 支持的端口,例如:
gcloud compute ssh my-datalab-cluster-m -- -L 8082:my-datalab-cluster-m:8080
在这种情况下,您将选择8082
作为 Web 预览端口。
您无法通过安装在 VM(在 GCE 上)上的 Datalab 连接到 Dataproc。
正如您提到的文档,您必须使用 Datalab 初始化操作启动 Dataproc。
此外,Datalab connect
仅当您通过该命令创建了 Datalab 时,该Datalab create
命令才可用。
您必须使用以下命令创建到您的主节点的 SSH 隧道(如果您的集群名称为“vmname”,则为“vmname-m”):
gcloud compute ssh --zone YOUR-ZONE --ssh-flag="-D 1080" --ssh-flag="-N" --ssh-flag="-n" "vmname-m"