在 Dataproc 主节点上创建的 /datalab/notebooks 目录在哪里?



我正在启动短暂的集群,并在达到目的后立即销毁它们。但是,我想保留在/datalab/notebooks 目录中创建的笔记本,然后在创建新群集时将它们复制到同一目录,以便在上一个群集上创建的所有笔记本都可用。

我可以在关闭之前将笔记本复制到 GCS 存储桶,但在创建新集群后无法将它们从 GCS 复制回/datalab/network,因为在我的启动脚本运行时或初始化脚本 datalab.sh 完成后会创建目录/datalab/notebooks。

此目录在哪里创建,或者如何以某种方式将笔记本从我的 GCS 存储桶复制到/datalab/notebooks?

关键是/datalab/notebooks 需要在此复制发生时可用。

更新

我的集群创建失败,出现以下错误。

gsutil cp 'gs://dataproc-datalab-srinid/notebooks/*' /datalab/notebooks/
CommandException: Destination URL must name a directory, bucket, or bucket
subdirectory for the multiple source form of the cp command.

但是,当我登录到主服务器并查看 dataproc-initialization-script-2.log 日志时,复制已成功(见下文)。

+ '[' -d /datalab/notebooks ']'
+ echo 'Sleeping since /datalab/notebooks doesnt exist yet...'
Sleeping since /datalab/notebooks doesnt exist yet...
+ sleep 50
+ '[' -d /datalab/notebooks ']'
+ gsutil cp 'gs://dataproc-datalab-srinid/notebooks/*' /datalab/notebooks/
Copying gs://dataproc-datalab-srinid/notebooks/BABA_notebook.ipynb...
/ [0 files][    0.0 B/ 40.8 KiB]                                                ^M/ [1 files][ 40.8 KiB/ 40.8 KiB]                                                ^MCopying gs://dataproc-datalab-srinid/notebooks/Untitled Notebook.ipynb...
/ [1 files][ 40.8 KiB/ 67.7 KiB]                                                ^M/ [2 files][ 67.7 KiB/ 67.7 KiB]                                                ^MCopying gs://dataproc-datalab-srinid/notebooks/hello.ipynb...
/ [2 files][ 67.7 KiB/ 68.7 KiB]                                                ^M/ [3 files][ 68.7 KiB/ 68.7 KiB]                                                ^MCopying gs://dataproc-datalab-srinid/notebooks/test-Copy1.ipynb...
/ [3 files][ 68.7 KiB/ 69.7 KiB]                                                ^M/ [4 files][ 69.7 KiB/ 69.7 KiB]                                                ^M
==> NOTE: You are performing a sequence of gsutil operations that may
run significantly faster if you instead use gsutil -m cp ... Please
see the -m section under "gsutil help options" for further information
about when gsutil -m can be advantageous.
Copying gs://dataproc-datalab-srinid/notebooks/test.ipynb...
/ [4 files][ 69.7 KiB/ 70.7 KiB]                                                ^M-^M- [5 files][ 70.7 KiB/ 70.7 KiB]                                                ^M
Operation completed over 5 objects/70.7 KiB.

法典

if [ -d '/datalab/notebooks' ]; then
gsutil cp gs://${BUCKET}/notebooks/* /datalab/notebooks/
else
echo 'Sleeping since /datalab/notebooks doesnt exist yet...'
sleep 50
if [ -d '/datalab/notebooks' ]; then
gsutil cp gs://${BUCKET}/notebooks/* /datalab/notebooks/
else
echo "Even after 50secs, the directory is not found, waiting for another 30secs.."
sleep 30
gsutil cp gs://${BUCKET}/notebooks/* /datalab/notebooks/
fi
fi

我假设您正在尝试将复制作为初始化操作的一部分。如果不是这种情况,请告诉我们您如何运行命令,因为这会影响它们的运行方式。

在 Datalab 的 docker 容器中,"/datalab"目录是临时的。对于要保留的内容,应改用"/content/datalab"目录。但是,您需要特别注意:

对于初始化操作,Datalab 容器内的"/content/datalab"目录映射到虚拟机中的"/root/datalab"目录(此处定义)。

因此,要将笔记本从GCS复制到"/content/datalab/notebooks"目录,请尝试创建"/root/datalab/notebooks"目录(例如"mkdir -p ${HOME}/datalab/notebooks",假设您在init操作中运行安装程序),然后将笔记本从GCS复制到该位置。

如果您也使用 init 操作而不是从 GCE 启动脚本运行从 GCS 复制命令,则可以控制初始化操作的运行顺序,因此您只需将复制自 gcs 初始化操作放在datalab 初始化操作之后:

--initialization-actions gs://dataproc-initialization-actions/datalab/datalab.sh,gs://your-bucket/copy-notebooks-from-gcs.sh

或者,如果该目录的创建是异步的,则可以添加一个 init 操作或启动脚本,该脚本在目录可用之前一直处于睡眠状态;假设您使用的是 init 操作,并且您可能只希望它在主节点上运行:

#!/bin/bash
readonly ROLE="$(/usr/share/google/get_metadata_value attributes/dataproc-role)"
if [[ "${ROLE}" == 'Master' ]]; then
if [ -d '/datalab/notebooks' ]; then
gsutil cp ${GCS_NOTEBOOK_DIRECTORY] /datalab/notebooks
else
echo 'Sleeping since /datalab/notebooks doesnt exist yet...'
sleep 5
fi
fi

最新更新