AWS Glue
開発者ガイド

チュートリアル: ローカル Apache Zeppelin ノートブックをセットアップして ETL スクリプトをテストしリモートでデバッグする

このチュートリアルでは、ローカルマシン上の Apache Zeppelin ノートブックを開発エンドポイントに接続して、デプロイする前に AWS Glue ETL (抽出、変換、ロード) スクリプトをインタラクティブに実行、デバッグ、およびテストできるようにします。このチュートリアルでは、SSH ポートフォワーディングを使用して、ローカルマシンを AWS Glue 開発エンドポイントに接続します。詳細については、Wikipedia の Port forwarding を参照してください。

このチュートリアルでは、「チュートリアルの前提条件」にまとめられているステップが実行済みであることを前提としています。

Apache Zeppelin ノートブックのインストール

  1. ローカルマシンに Java の最新バージョンがインストールされていることを確認してください (最新バージョンについては、Java のホームページを参照してください)。

    Microsoft Windows で実行している場合は、JAVA_HOME 環境変数が適切な Java ディレクトリを指していることを確認します。この変数を更新せずに Java が更新される可能性があります。変数が存在しなくなったフォルダを指していると、Zeppelin は起動に失敗します。

  2. Zeppelin のダウンロードページからローカルマシンに Apache Zeppelin (すべてのインタプリタがあるバージョン) をダウンロードします。

    ダウンロードページから zeppelin-0.7.3-bin-all.tgz という古いリリースをダウンロードし、インストール手順に従います。オペレーティングシステムに適した方法で Zeppelin を起動します。Zeppelin 使用中、ノートブックサーバーを開始するターミナルウィンドウは開けたままにしておきます。サーバーが正常に起動されたら、"Done, zeppelin server started." で終わる行がコンソールに表示されます。

  3. http://localhost:8080 に移動して、ブラウザで Zeppelin を開きます。

  4. ブラウザの Zeppelin で、ページの右上隅にある [anonymous] (匿名) のドロップダウンメニューを開き、[Interpreter] (インタープリタ) を選択します。[interpreters] (インタープリタ) ページで spark を検索して、右側にある [edit] (編集) を選択します。以下の変更を加えます。

    • [Connect to existing process] (既存のプロセスに接続) チェックボックスを選択し、[Host] (ホスト) を localhost に、[Port] (ポート) を 9007 (またはポート転送に使用している任意の他のポート) に設定します。

    • [Properties] (プロパティ) で、[master] (マスター) に yarn-client を設定します。

    • spark.executor.memory プロパティがある場合は、[action] (アクション) 列で [x] を選択してそのプロパティを削除します。

    • spark.driver.memory プロパティがある場合は、[action] (アクション) 列で [x] を選択してそのプロパティを削除します。

    ページの下部にある [Save] (保存) を選択し、次に [OK] を選択してインタープリタを更新して再起動することを確定します。ブラウザの [back] (戻る) ボタンを使用して Zeppelin 開始ページに戻ります。

DevEndpoint に接続するための SSH ポート転送の開始

次に、SSH ローカルポート転送を使用して、ローカルポート (ここでは 9007) を AWS Glue (169.254.76.1:9007) で定義されたリモート送信先に転送します。

SSH セキュアシェルプロトコルへのアクセスができるターミナルウィンドウを開きます。Microsoft Windows の場合、Git for Windows が提供する BASH シェルを使用するか、Cygwin をインストールすることができます。

次のように変更した、以下の SSH コマンドを実行します。

  • private-key-file-path を、開発エンドポイントを作成するのに使用したパブリックキーに対応するプライベートキーを含む .pem ファイルへのパスに置き換えます。

  • 9007 とは異なるポートを転送している場合は、9007 をローカルで実際に使用しているポート番号に置き換えます。このアドレス、169.254.76.1:9007 はリモートポートです。変更することはできません。

  • dev-endpoint-public-dns を開発エンドポイントのパブリック DNS アドレスで置き換えます。このアドレスを確認するには、AWS Glue コンソールで開発エンドポイントに移動して名前を選択し、[Endpoint details (エンドポイントの詳細)] ページに一覧表示されている [Public address (パブリックアドレス)] をコピーします。

ssh -i private-key-file-path -NTL 9007:169.254.76.1:9007 glue@dev-endpoint-public-dns

以下のような警告メッセージが表示されます。

The authenticity of host 'ec2-xx-xxx-xxx-xx.us-west-2.compute.amazonaws.com (xx.xxx.xxx.xx)' can't be established. ECDSA key fingerprint is SHA256:4e97875Brt+1wKzRko+JflSnp21X7aTP3BcFnHYLEts. Are you sure you want to continue connecting (yes/no)?

yes」と入力し、Zeppelin ノートブックを使用中はターミナルウィンドウを開けたままにしておきます。

ノートブックの段落におけるシンプルスクリプトフラグメントの実行

Zeppelin 開始ページで、[Create new note] (新しいメモの作成) を選択します。新しいメモに Legislators という名前を付け、spark がインタープリタであることを確認します。

次のスクリプトフラグメントをノートブックに入力して実行します。AWS Glue データカタログ にあるその人物のメタデータを使用して、サンプルデータから DynamicFrame を作成します。次に、このデータの項目数およびスキーマが出力されます。

%pyspark import sys from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.transforms import * # Create a Glue context glueContext = GlueContext(SparkContext.getOrCreate()) # Create a DynamicFrame using the 'persons_json' table persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json") # Print out information about this data print "Count: ", persons_DyF.count() persons_DyF.printSchema()

スクリプトの出力は次のとおりです。

Count: 1961 root |-- family_name: string |-- name: string |-- links: array | |-- element: struct | | |-- note: string | | |-- url: string |-- gender: string |-- image: string |-- identifiers: array | |-- element: struct | | |-- scheme: string | | |-- identifier: string |-- other_names: array | |-- element: struct | | |-- note: string | | |-- name: string | | |-- lang: string |-- sort_name: string |-- images: array | |-- element: struct | | |-- url: string |-- given_name: string |-- birth_date: string |-- id: string |-- contact_details: array | |-- element: struct | | |-- type: string | | |-- value: string |-- death_date: string

ローカルノートブック接続のトラブルシューティング

  • 接続拒否エラーが発生した場合、古い開発エンドポイントを使用している可能性があります。新しい開発エンドポイントを作成して再接続してみます。

  • 接続がタイムアウトになったり何らかの理由で機能しなくなった場合に、復元するのに以下のステップの実行が必要な場合があります。

    1. Zeppelin で、ページの右上隅にあるドロップダウンメニューの [Interpreters (インタープリタ)] を選択します。[interpreters] (インタプリタ) ページで spark を検索します。[edit] (編集) を選択し、[Connect to existing process] (既存のプロセスに接続) チェックボックスをオフにします。ページの下部にある [Save] (保存) を選択します。

    2. 前述のとおり、SSH ポート転送を開始します。

    3. Zeppelin で spark インタープリタの [Connect to existing process] (既存のプロセスに接続) 設定を再度有効にして、再び保存します。

    このようにインタープリタをリセットすることで、接続が復元するはずです。これを実現するもう 1 つの方法は、[Interpreters] (インタープリタ) ページで Spark インタープリタの [restart] (再起動) を選択することです。その後、リモートインタープリタが確実に再起動されるように最大 30 秒間待機します。

  • 開発エンドポイントに、リモート Zeppelin インタープリタにアクセスするためのアクセス許可があることを確認します。適切なネットワークアクセス権限がないと、「開くことができませんでした、接続に失敗しました、接続が拒否されました」などのエラーが発生する可能性があります。