Dataproc + Datalab。有人可以帮我弄清楚Dataproc主目录上/ datalab / notebooks目录的创建位置

时间:2019-04-30 05:55:03

标签: google-cloud-dataproc google-cloud-datalab

我正在纺短寿命的簇,并在达到目的后立即销毁它们。但是,我想保留在/ datalab / notebooks目录中创建的笔记本,然后在创建新集群时将它们复制到同一目录中,因此可以使用在先前集群上创建的所有笔记本。我可以在关机之前将笔记本复制到GCS存储桶中,但是在创建新的群集后无法将它们从GCS复制回/ datalab / network,因为在启动脚本运行时或之后创建目录/ datalab / notebooks初始化脚本datalab.sh已完成。有人可以将我指向创建此目录的脚本,还是可以将我从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

2 个答案:

答案 0 :(得分:1)

如果您还使用init动作而不是GCE启动脚本来运行copy-from-GCS命令,那么您可以控制init动作的运行顺序,因此只需将您的copy-from-gcs init动作< em>之后数据实验室初始化操作:

--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

答案 1 :(得分:1)

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

在Datalab的Docker容器内部,“ / datalab”目录为临时目录。对于您要保留的内容,应该使用“ / content / datalab”目录。但是,您需要特别注意以下几点:

对于初始化操作,Datalab容器内部的“ / content / datalab”目录映射到VM中的“ / root / datalab”目录(已定义here)。

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