Dataproc クラスタで Datalab ノートブックをインストールして実行する

プロジェクトを設定する

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Dataproc, Compute Engine必要な API を有効にします。

    API を有効にする

  5. Cloud SDK をインストールして初期化します。

概要

このチュートリアルでは、クラスタに Datalab ノートブックをインストールして実行する bash シェル初期化スクリプトを使用して Dataproc クラスタを作成する方法を説明します。このスクリプトは Cloud Storage の gs://dataproc-initialization-actions/datalab/datalab.sh にあります。また、GitHub GoogleCloudPlatform/dataproc-initialization-actions リポジトリにも他の初期化スクリプトとともに置かれています。

このチュートリアルでは、クラスタに Datalab ノートブックをインストールする初期化スクリプトを使用してクラスタを作成した後、ローカル ブラウザでノートブックに接続する方法を説明します。

#!/bin/bash

set -exo pipefail

readonly ROLE="$(/usr/share/google/get_metadata_value attributes/dataproc-role)"
readonly PROJECT="$(/usr/share/google/get_metadata_value ../project/project-id)"
readonly SPARK_PACKAGES="$(/usr/share/google/get_metadata_value attributes/spark-packages || true)"
readonly SPARK_CONF='/etc/spark/conf/spark-defaults.conf'
readonly DATALAB_DIR="${HOME}/datalab"
readonly PYTHONPATH="/env/python:$(find /usr/lib/spark/python/lib -name '*.zip' | paste -sd:)"
readonly DOCKER_IMAGE="$(/usr/share/google/get_metadata_value attributes/docker-image ||
  echo 'gcr.io/cloud-datalab/datalab:local')"

readonly DEAFULT_INIT_ACTIONS_REPO=gs://dataproc-initialization-actions
readonly INIT_ACTIONS_REPO="$(/usr/share/google/get_metadata_value attributes/INIT_ACTIONS_REPO ||
  echo ${DEAFULT_INIT_ACTIONS_REPO})"
readonly INIT_ACTIONS_BRANCH="$(/usr/share/google/get_metadata_value attributes/INIT_ACTIONS_BRANCH ||
  echo 'master')"

VOLUMES="$(echo /etc/{hadoop*,hive*,*spark*})"

CONNECTORS_LIB=/usr/lib/hadoop/lib
if [[ -d /usr/local/share/google/dataproc/lib ]]; then
  CONNECTORS_LIB="/usr/local/share/google/dataproc/lib"
fi
if [[ -L ${CONNECTORS_LIB}/gcs-connector.jar ]]; then
  VOLUMES+=" ${CONNECTORS_LIB}/gcs-connector.jar"
else
  VOLUMES+=" $(compgen -G ${CONNECTORS_LIB}/gcs*)"
fi
if [[ -L ${CONNECTORS_LIB}/bigquery-connector.jar ]]; then
  VOLUMES+=" ${CONNECTORS_LIB}/bigquery-connector.jar"
elif compgen -G "${CONNECTORS_LIB}/bigquery*" >/dev/null; then
  VOLUMES+=" $(compgen -G ${CONNECTORS_LIB}/bigquery*)"
fi

readonly VOLUMES
readonly VOLUME_FLAGS="$(echo "${VOLUMES}" | sed 's/\S*/-v &:&/g')"

function err() {
  echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2
  return 1
}

function install_docker() {
  local init_actions_dir
  init_actions_dir=$(mktemp -d -t dataproc-init-actions-XXXX)
  if [[ ${INIT_ACTIONS_REPO} == gs://* ]]; then
    gsutil -m rsync -r "${INIT_ACTIONS_REPO}" "${init_actions_dir}"
  else
    git clone -b "${INIT_ACTIONS_BRANCH}" --single-branch "${INIT_ACTIONS_REPO}" "${init_actions_dir}"
  fi
  find "${init_actions_dir}" -name '*.sh' -exec chmod +x {} \;
  "${init_actions_dir}/docker/docker.sh"
}

function docker_pull() {
  for ((i = 0; i < 10; i++)); do
    if (gcloud docker -- pull "$1"); then
      return 0
    fi
    sleep 5
  done
  return 1
}

function configure_master() {
  mkdir -p "${DATALAB_DIR}"

  docker_pull "${DOCKER_IMAGE}" || err "Failed to pull ${DOCKER_IMAGE}"

  if ! grep -q '^spark\.sql\.warehouse\.dir=' "${SPARK_CONF}"; then
    echo 'spark.sql.warehouse.dir=/root/spark-warehouse' >>"${SPARK_CONF}"
  fi

  touch ${VOLUMES}

  pyspark_submit_args=''
  for package in ${SPARK_PACKAGES//','/' '}; do
    pyspark_submit_args+="--packages ${package} "
  done
  pyspark_submit_args+='pyspark-shell'

  mkdir -p datalab-pyspark
  pushd datalab-pyspark
  cp /etc/apt/trusted.gpg .
  cp /etc/apt/sources.list.d/dataproc.list .
  cat <<EOF >Dockerfile
FROM ${DOCKER_IMAGE}

ADD dataproc.list /etc/apt/sources.list.d/
ADD trusted.gpg /tmp/vm_trusted.gpg
RUN apt-key add /tmp/vm_trusted.gpg

RUN apt-get update
RUN apt-get install -y software-properties-common
RUN add-apt-repository 'deb http://archive.ubuntu.com/ubuntu bionic main'

RUN apt-get update
RUN apt-get install -y hive spark-python openjdk-8-jre-headless

ENV PYSPARK_PYTHON=$(ls /opt/conda/bin/python || command -v python)

ENV SPARK_HOME='/usr/lib/spark'
ENV JAVA_HOME='/usr/lib/jvm/java-8-openjdk-amd64'
ENV PYTHONPATH='${PYTHONPATH}'
ENV PYTHONSTARTUP='/usr/lib/spark/python/pyspark/shell.py'
ENV PYSPARK_SUBMIT_ARGS='${pyspark_submit_args}'
ENV DATALAB_ENV='GCE'
EOF
  docker build -t datalab-pyspark .
  popd
}

function run_datalab() {
  if docker run -d --restart always --net=host \
    -v "${DATALAB_DIR}:/content/datalab" ${VOLUME_FLAGS} datalab-pyspark; then
    echo 'Cloud Datalab Jupyter server successfully deployed.'
  else
    err 'Failed to run Cloud Datalab'
  fi
}

function main() {
  if [[ "${ROLE}" == 'Master' ]]; then
    install_docker
    configure_master
    run_datalab
  fi
}

main

クラスタを作成し、Datalab ノートブックをインストールする

gcloud コマンド

  1. 次の gcloud dataproc clusters create コマンドをターミナル ウィンドウでローカルに実行するか、Cloud Shell(Cloud Shell では Linux が動作)で実行してクラスタを作成し、クラスタのマスターノードに Datalab ノートブックをインストールします。cluster-nameproject-id の各プレースホルダの値を挿入します。--initialization-actions フラグは、Cloud Storage 内で初期化スクリプトが配置される場所を指定します(詳細は、初期化アクションをご覧ください)。

    Linux / macOS

    gcloud dataproc clusters create cluster-name \
        --project project-id \
        --initialization-actions \
            gs://dataproc-initialization-actions/datalab/datalab.sh
    

    Windows

    gcloud dataproc clusters create cluster-name ^
        --project project-id ^
        --initialization-actions ^
            gs://dataproc-initialization-actions/datalab/datalab.sh
    

Console

  1. Cloud Console の [Dataproc クラスタ] ページに移動します。
  2. [クラスタを作成] をクリックして、[クラスタの作成] ページを開きます。
  3. クラスタの名前を [名前] フィールドに入力します。
  4. クラスタのリージョンとゾーンを [リージョン] および [ゾーン] メニューで選択します(使用可能なリージョンとゾーンをご覧ください)。個別のリージョンを指定し、ゾーンとして [指定しない] を選択すると、選択したリージョン内のゾーンが Dataproc により選択されます(Dataproc の自動ゾーン プレースメントをご覧ください)。代わりに global リージョンも選択できます。これは特別なマルチリージョンの名前空間で、すべての Compute Engine ゾーンに対してグローバルにインスタンスをデプロイできます(グローバル リージョンを選択する場合は、ゾーンも選ぶ必要があります)。
  5. [詳細オプション] パネルを展開します。
  6. [初期化アクション] フィールドに gs://dataproc-initialization-actions/datalab/datalab.sh を入力します。このスクリプトは、クラスタのマスター インスタンスで Datalab ノートブックをインストールおよび実行します。また、このスクリプトは新しいクラスタを作成した直後に実行されます。
    URI は下のコードブロックからコピーして貼り付けることができます。
    gs://dataproc-initialization-actions/datalab/datalab.sh
    
  7. 他のオプションはいずれも設定されたデフォルト値を使用できます。
  8. [作成] をクリックして、クラスタを作成し、そのクラスタのマスターノードに Cloud Datalab ノートブックをインストールします。

ブラウザで Datalab ノートブックを開く

クラスタが稼働したら、次の手順に従いブラウザで Datalab ノートブックを開きます。

  1. SSH トンネルを作成します。Cloud Shell をローカルポート転送で使用して SSH トンネルを作成する場合は、クラスタのマスターノード上のウェブ インターフェース ポートとしてポート 8080 を指定します。

  2. ブラウザを構成します

  3. ノートブック インターフェースに接続します。動的ポート転送で SOCKS プロキシを使用して SSH トンネルを作成する場合は、ブラウザに URL「http://cluster-name-m:8080」を入力してノートブックに接続します。

Datalab ノートブックがブラウザのウィンドウで開きます。