Glue 開発エンドポイントを、ローカルWindows PC上のZeppelinから操作する

Apache Zeppelin とは、Sparkをサポートするnotebookで、SparkをいじるためのJupyter notebookみたいなやつです。これを利用して、GlueのSparkを操作してみます。

Glueのコンソールには、EC2のZeppelinサーバをLaunchするための設定が用意されていますが、結局EC2の利用コストがかかってしまうため(ただでさえ、Glue開発エンドポイントでお金がかかっているのに)、ローカルにインストールしたZeppelinを利用します。AWSにて利用方法が紹介されています。

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

WindowsにZeppelinのインストール

まずは、WindowsにZeppelinをインストールします。インストール方法は、公式サイトのQuickstartを参考に。

Apache Zeppelin 0.7.3 Documentation: Quick Start

Requirementsには、以下がオフィシャルサポート環境と記載されています。

Name Value
Oracle JDK 1.7
OS WIndows 7 pro SP1

で、以下が僕の環境情報で全然違うのですが、まあ動くだろうと続行。

  • java version "1.8.0_181"
  • windows10 Pro

環境変数JAVA_HOME を設定しておけとあるので設定します。

> setx JAVA_HOME "C:\Program Files\Java\jre1.8.0_181"

環境変数設定したので、OSを再起動しておきます。

続いて、ZeppelinのDownloadページに行って、 Binary package with all interpreters をダウンロードしてきます。ダウンロードしてくるのは、Version 0.7.3 のZeppelinにします。Version 0.8.0 以降のものは、Glueでは利用できません。下は、該当するAWSフォラームページ。

https://forums.aws.amazon.com/thread.jspa?threadID=285128

ここが分からず、僕は相当ハマりました。ちゃんとマニュアルに書いてあるのに... 0.8.0を利用すると、以下のようなjavaのエラーが出てGlueエンドポイントにアクセスできません。

org.apache.thrift.TApplicationException: Internal error processing createInterpreter
    at org.apache.thrift.TApplicationException.read(TApplicationException.java:111)
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:71)
    at org.apache.zeppelin.interpreter.thrift.RemoteInterpreterService$Client.recv_createInterpreter(RemoteInterpreterService.java:209)
    at org.apache.zeppelin.interpreter.thrift.RemoteInterpreterService$Client.createInterpreter(RemoteInterpreterService.java:192)
    at org.apache.zeppelin.interpreter.remote.RemoteInterpreter$2.call(RemoteInterpreter.java:169)
    at org.apache.zeppelin.interpreter.remote.RemoteInterpreter$2.call(RemoteInterpreter.java:165)
    at org.apache.zeppelin.interpreter.remote.RemoteInterpreterProcess.callRemoteFunction(RemoteInterpreterProcess.java:135)
    at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.internal_create(RemoteInterpreter.java:165)
    at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.open(RemoteInterpreter.java:132)
    at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.getFormType(RemoteInterpreter.java:299)
    at org.apache.zeppelin.notebook.Paragraph.jobRun(Paragraph.java:407)
    at org.apache.zeppelin.scheduler.Job.run(Job.java:188)
    at org.apache.zeppelin.scheduler.RemoteScheduler$JobRunner.run(RemoteScheduler.java:307)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Zeppelinのダウンロードページはこちら。

Download

tgz形式になっているので解凍して、適当なフォルダに配置。僕は C:\tools\zeppelin-0.7.3-bin-all に置きました。解凍したフォルダ内のbinに置いてある zeppelin.cmdコマンドプロンプトから実行。

C:\tools\zeppelin-0.7.3-bin-all\bin
> zeppelin.cmd

ログがつらつらつらと表示されて、 Done, zeppelin server started と出れば、起動完了です。ブラウザから、localhostの8080ポートにアクセスしてみて、画面が表示されればOKです。

Glue開発エンドポイントを作成

これは以前の記事を参考に作成。

AWS Glueの開発エンドポイントの利用方法 - goodbyegangsterのブログ

ローカルのZeppelinからGlueへの接続

ローカル環境からGlueのSpark環境に接続するために、以下のsshポートフォワーディングのコマンドを実行します。

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

で、ポートフォワーディングしたまま、ZeppelinのInterpreter設定画面にて、Spark部分を変更します。変更する内容は、マニュアル記載の以下通り。

  • Connect to existing process を選択
    • Hostに localhost と入力
    • Portに 9007 と入力
  • masterに yarn-client と入力
  • spark.executor.memory プロパティがある場合は削除
  • spark.driver.memory プロパティがある場合は削除

と入力して保存してあげます。実際の画面では以下の感じ。

f:id:goodbyegangster:20180824205307p:plain

で、新規でファイルを作成して、Glue用Sparkプログラムを実行してみると、ちゃんと実行してくれます。

f:id:goodbyegangster:20180824205323p:plain