Managed Service for Apache Spark コンポーネント ゲートウェイ

Google Managed Service for Apache Spark クラスタにデフォルトで組み込まれる Apache HadoopApache Spark などの一部のオープンソース コンポーネントには、ウェブ インターフェースが備わっています。こうしたインターフェースを使用すると、YARN リソース マネージャー、Hadoop Distributed File System(HDFS)、MapReduce、Spark などのクラスタ リソースと機能を管理およびモニタリングできます。Managed Service for Apache Spark のデフォルト コンポーネントとオプション コンポーネントのウェブ エンドポイントには、コンポーネント ゲートウェイによってセキュアにアクセスできます。

サポートされている Managed Service for Apache Spark イメージ バージョンで作成されたクラスタでは、内向きトラフィックを許可するために SSH トンネルへの依存や、ファイアウォール ルールの変更を行うことなく、コンポーネントのウェブ インターフェースへのアクセスを有効にできます。

考慮事項

  • 有効なコンポーネントのウェブ インターフェースにアクセスするには、dataproc.clusters.use Identity and Access Management 権限が必要です。Managed Service for Apache Spark のロールをご覧ください。
  • コンポーネント ゲートウェイを使用して REST API(Apache Hadoop YARNApache Livy など)や履歴サーバーにアクセスすることはできません。
  • コンポーネント ゲートウェイが有効になっている場合、Managed Service for Apache Spark はクラスタの最初のマスターノードに次のサービスを追加します。
  • コンポーネント ゲートウェイは、node:port インターフェースへの直接アクセスを有効にしませんが、サービスの特定のサブセットを自動的にプロキシします。ノード上のサービス(node:port)にアクセスする必要がある場合は、SSH SOCKS プロキシを使用します。

コンポーネント ゲートウェイを使用してクラスタを作成する

Google Cloud コンソール

Google Cloud コンソールを使用してクラスタを作成すると、Managed Service for Apache Spark コンポーネントの UI(コンポーネント ゲートウェイ経由)がデフォルトで有効になります。この設定を無効にするには、[UI でコンポーネントを有効にする] チェックボックスをオフにします。

  1. [クラスタの作成] ページを開きます。
  2. [その他の構成] をクリックして、セクションを開きます。
  3. [オプション コンポーネント] を編集します。
  4. 表示されたパネルで、[UI でコンポーネントを有効にする] チェックボックスをオンまたはオフにします。
  5. [保存] をクリックします。

gcloud CLI コマンド

gcloud CLI のgcloud dataproc clusters create コマンドをターミナル ウィンドウでローカルに、または Cloud Shell で実行します。

gcloud dataproc clusters create cluster-name \
    --enable-component-gateway \
    --region=region \
    other args ...

REST API

clusters.create リクエストの一部として EndpointConfig.enableHttpPortAccess プロパティを true に設定します。

コンポーネント ゲートウェイの URL を使用してウェブ インターフェースにアクセスする

クラスタでコンポーネント ゲートウェイが有効になっている場合、 Google Cloud コンソール上のリンクをクリックして、クラスタの最初のマスターノードで実行されているコンポーネント ウェブ インターフェースに接続できます。また、コンポーネント ゲートウェイでは、endpointConfig.httpPorts に URL へのポート名のマップが設定されます。コンソールを使用する代わりに、gcloud コマンドライン ツールや Dataproc REST API を使用してこのマッピング情報を表示し、URL をコピーしてブラウザに貼り付けて、コンポーネントの UI に接続できます。

コンソール

Google Cloud コンソールで Managed Service for Apache Spark の [クラスタ] フォームに移動し、クラスタを選択して [クラスタの詳細] フォームを開きます。[ウェブ インターフェース] タブをクリックすると、クラスタにインストールされているデフォルト コンポーネントとオプション コンポーネントのウェブ インターフェースへのコンポーネント ゲートウェイ リンクのリストが表示されます。いずれかのコンポーネントのリンクをクリックすると、クラスタのマスターノード上で実行されているそのコンポーネントのウェブ インターフェースがローカル ブラウザ内に開きます。

gcloud CLI コマンド

gcloud CLI の gcloud dataproc clusters describe コマンドをターミナル ウィンドウでローカルに、または Cloud Shell で実行します。

gcloud dataproc clusters describe cluster-name \
    --region=region

出力例:

...
config:
  endpointConfig:
    enableHttpPortAccess: true
    httpPorts:
      HDFS NameNode:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/hdfs/ MapReduce Job History:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/jobhistory/ Spark HistoryServer:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/sparkhistory/ YARN ResourceManager:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/yarn/ YARN Application Timeline:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/apphistory/ ...

REST API

ポート名と URL の endpointConfig.httpPorts マップを取得するには、clusters.get を呼び出します。

VPC-SC でコンポーネント ゲートウェイを使用する

コンポーネント ゲートウェイでは、VPC Service Controls がサポートされます。サービス境界の適用では、コンポーネント ゲートウェイを介したインターフェースへのリクエストは Dataproc API サーフェスの一部として処理され、dataproc.googleapis.com のアクセス許可を制御するアクセス ポリシーでもコンポーネント ゲートウェイの UI へのアクセスが制御されます。

Component Gateway は、外部 IP アドレスのない Managed Service for Apache Spark クラスタの限定公開の Google 接続に依存する VPC-SC 構成もサポートしていますが、次の操作を行って、Managed Service for Apache Spark マスター VM から制限付きの Google 仮想 IP 範囲 199.36.153.4/30 を介して *.dataproc.cloud.google.com にアクセスできるようにネットワークを手動で構成する必要があります。

  1. 手順に沿って、すべての Google API に対して、プライベート Google 接続を構成します。
  2. Cloud DNS によって DNS を構成するか、またはManaged Service for Apache Spark マスターノードでローカルに DNS を構成して、*.dataproc.cloud.google.com へのアクセスを許可します。

Cloud DNS を使用して DNS を構成する

*.dataproc.cloud.google.com を宛先とするトラフィックを、制限付きの Google API 仮想 IP 範囲にマッピングする Cloud DNS ゾーンを作成します。

  1. VPC ネットワーク用の非公開マネージド ゾーンを作成します。

    gcloud dns managed-zones create ZONE_NAME \
     --visibility=private \
     --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME \
     --description=DESCRIPTION \
     --dns-name=dataproc.cloud.google.com \
     --project=PROJECT_ID
    
    • ZONE_NAME は、作成するゾーンの名前です。たとえば、vpc のようにします。このゾーン名は、次の各ステップで使用されます。

    • PROJECT_ID は、VPC ネットワークをホストするプロジェクトの ID です。

    • NETWORK_NAME は VPC ネットワークの名前です。

    • DESCRIPTION は、人間が読める形式のマネージド ゾーンの説明です。これは指定しなくても構いません。

  2. トランザクションを開始します。

    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    • ZONE_NAME は、ゾーン名です。
  3. DNS レコードを追加します。

    gcloud dns record-sets transaction add --name=*.dataproc.cloud.google.com. \
        --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
        --zone=ZONE_NAME \
        --ttl=300
    
    • ZONE_NAME は、ゾーン名です。
    gcloud dns record-sets transaction add --name=dataproc.cloud.google.com. \
        --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
        --zone=ZONE_NAME \
        --ttl=300
    
    • ZONE_NAME は、ゾーン名です。
  4. トランザクションを実行します。

    gcloud dns record-sets transaction execute --zone=ZONE_NAME --project=PROJECT_ID
    
    • ZONE_NAME は、ゾーン名です。

    • PROJECT_ID は、VPC ネットワークをホストするプロジェクトの ID です。

初期化アクションを使用して Managed Service for Apache Spark マスターノードでローカルに DNS を構成する

dataproc.cloud.google.com へのプライベート接続を許可するように、Managed Service for Apache Spark マスターノードでローカルに DNS を構成できます。この手順は、短期的なテストと開発を目的としています。本番環境ワークロードでの使用は推奨されません。

  1. 初期化アクションを Cloud Storage にステージングします。

    cat <<EOF >component-gateway-vpc-sc-dns-init-action.sh
    #!/bin/bash
    readonly ROLE="$(/usr/share/google/get_metadata_value attributes/dataproc-role)"
    
    if [[ "${ROLE}" == 'Master' ]]; then
      readonly PROXY_ENDPOINT=$(grep "^dataproc.proxy.agent.endpoint=" \
        "/etc/google-managed-spark/dataproc.properties" | \
        tail -n 1 | cut -d '=' -f 2- | sed -r 's/\\([#!=:])/\1/g')
    
      readonly HOSTNAME=$(echo ${PROXY_ENDPOINT} | \
        sed -n -E 's;^https://([^/?#]*).*;\1;p')
    
      echo "199.36.153.4 ${HOSTNAME}  # Component Gateway VPC-SC" >> "/etc/hosts"
    fi
    EOF
    
    gcloud storage cp component-gateway-vpc-sc-dns-init-action.sh gs://BUCKET/
    
    • BUCKET は、Managed Service for Apache Spark クラスタからアクセスできる Cloud Storage バケットです。
  2. 初期化アクションがステージングされ、コンポーネント ゲートウェイが有効になっている Managed Service for Apache Spark クラスタを作成します。

    gcloud dataproc clusters create cluster-name \
        --region=region \
        --initialization-actions=gs://BUCKET/component-gateway-vpc-sc-dns-init-action.sh \
        --enable-component-gateway \
        other args ...
    
    • BUCKET は、手順 1 で使用した Cloud Storage バケットです。

コンポーネント ゲートウェイを介して HTTP API をプログラムでの使用する

コンポーネント ゲートウェイは、Apache Knox が組み込まれているプロキシです。Apache Knox によって公開されるエンドポイントは、https://component-gateway-base-url/component-path を介して利用できます。

コンポーネント ゲートウェイを使用してプログラムで認証するには、ヘッダー Proxy-AuthorizationOAuth 2.0 署名なしトークンを渡します。

$ ACCESS_TOKEN="$(gcloud auth print-access-token)"
$ curl -H "Proxy-Authorization: Bearer ${ACCESS_TOKEN}" "https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/yarn/jmx"
{
  "beans" : [ {
    "name" : "Hadoop:service=ResourceManager,name=RpcActivityForPort8031",
    "modelerType" : "RpcActivityForPort8031",
    "tag.port" : "8031",
    "tag.Context" : "rpc",
    "tag.NumOpenConnectionsPerUser" : "{\"yarn\":2}",
    "tag.Hostname" : "demo-cluster-m",
    "ReceivedBytes" : 1928581096,
    "SentBytes" : 316939850,
    "RpcQueueTimeNumOps" : 7230574,
    "RpcQueueTimeAvgTime" : 0.09090909090909091,
    "RpcProcessingTimeNumOps" : 7230574,
    "RpcProcessingTimeAvgTime" : 0.045454545454545456,
...

コンポーネント ゲートウェイは、リクエストを Apache Knox に転送する前に Proxy-Authorization ヘッダーを削除します。

コンポーネント ゲートウェイのベース URL を確認するには、次の gcloud dataproc clusters describe を実行します。

$ gcloud dataproc clusters describe <var>cluster-name</var> &#92;
    &nbsp;&nbsp;&nbsp;&nbsp;--region=<var>region</var>
...
  endpointConfig:
    enableHttpPortAccess: true
    httpPorts:
      HDFS NameNode: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/hdfs/dfshealth.html
      MapReduce Job History: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/jobhistory/
      Spark History Server: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/sparkhistory/
      Tez: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/apphistory/tez-ui/
      YARN Application Timeline: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/apphistory/
      YARN ResourceManager: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/yarn/

...

ベース URL は、httpPorts の下にある URL のスキームと認証の部分です。この例では、https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/ です。

コンポーネント ゲートウェイの SSL 証明書を再生成する

コンポーネント ゲートウェイのデフォルトの Knox ゲートウェイ SSL 証明書は、次の期間に有効です。

  • イメージ バージョン 2.0.93、2.1.41、2.2.7 以降を使用して作成されたクラスタの場合、Managed Service for Apache Spark クラスタの作成日から 5 年間。

  • 以前のイメージ バージョンを使用して作成されたクラスタの場合、Managed Service for Apache Spark クラスタの作成日から 13 か月。

証明書が期限切れになると、すべてのコンポーネント ゲートウェイのウェブ インターフェース URL が非アクティブになります。

SSL 証明書が組織から提供されている場合は、その組織から新しい証明書を取得し、古い証明書を新しい証明書に置き換えます。

デフォルトの自己署名 SSL 証明書を使用している場合は、次のように更新します。

  1. SSH を使用して、m-0 名サフィックスを持つ Managed Service for Apache Spark クラスタ マスターノードに接続します。

  2. /var/lib/knox/security/keystores/gateway.jks パスで gateway.jks を見つけます。

    keytool -list -v -keystore /var/lib/knox/security/keystores/gateway.jks
    
  3. gateway.jks ファイルをバックアップ ディレクトリに移動します。

    mv /var/lib/knox/security/keystores/gateway.jks /tmp/backup/gateway.jks
    
  4. Knox サービスを再起動して、新しい自己署名証明書を作成します。

    systemctl restart knox
    
  5. コンポーネント ゲートウェイと Knox のステータスを確認します。

    systemctl status google-dataproc-component-gateway
    systemctl status knox
    

次のステップ