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のダウンロードページはこちら。
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
と入力
- Hostに
- masterに
yarn-client
と入力 - spark.executor.memory プロパティがある場合は削除
- spark.driver.memory プロパティがある場合は削除
と入力して保存してあげます。実際の画面では以下の感じ。
で、新規でファイルを作成して、Glue用Sparkプログラムを実行してみると、ちゃんと実行してくれます。