オフライン環境でのVSCodeを使ったSpark開発環境構築

皆さんこんにちは、Marketing Solution Divisionの伊藤です。私は2020年の4月に新卒として入社し、研修期間終了後に現在のチームに配属されました。現在は、KDDIの位置情報データを活用し、マーケティング対象の店舗に立ち寄りそうな顧客を予測するシステムを制作しております。

このプロジェクトでは、位置情報や顧客の個人情報という秘匿性が高い情報を扱うため、セキュリティの観点からインターネットから隔離された分析環境でシステムの開発環境を構築する必要がありました。さらに、システムの処理や開発方針決定のための分析にApache Sparkを使用していたため、分析環境とおなじプライベートネットワーク内でAmazon EMRを使用する必要がありました。

今回開発環境を構築するにあたって、エディタにはVisual Studio Code(VSCode)を採用することにしました。VSCodeは軽量にもかかわらず、強力な拡張機能群により快適なコーディングが可能です。SparkのPythonラッパーであるPysparkを用いたコーディングの際にも、Python関連の拡張機能により様々な便利機能(強力な補完、デバッグ・テスト機能、Jupyter Notebookの使用など)が使用できます。

上記のようなセキュアなオフライン環境でも、VSCodeで快適にSparkを使用する環境を整えたので、実際に実施した設定方法を紹介したいと思います。(記事内の画像は別環境のWindowsのものなので様々な点が実際の環境と異なりますが、ご了承ください。)

この記事で扱う内容

  • ホスト・EMRがともにオフラインな環境でVSCodeを使用してEMRに接続する方法
  • Pysparkシェル以外からPySparkを実行する際に設定が必要な環境変数
  • VSCodeでPySparkを使用したコードをデバッグ・テストする方法

この記事で扱わない内容

  • EMRとSSH接続する際の鍵の作成
  • Python以外の言語でのSparkの設定

環境構築時のバージョン

  • RedHat系のLinux(セキュリティ上の理由で詳細は割愛します)
  • Visual Studio Code 1.51.1
  • Amazon EMR 6.1.0
    • Spark 3.0.0
    • Python3.7.8

オフライン環境でVSCodeをEMRに接続する

ARISE Analyticsでは大量のデータを処理するため、Amazon Web ServiceのEMRを使っています。システム開発にあたって、EMRに接続して簡単にコードを実行できるように設定する必要がありました。今回のシステム開発では、メインのエディタとしてVSCodeを使用することになったので、VSCodeの拡張機能であるRemote-SSHを使用して、VSCodeから直接EMRを触れるようにしました。しかしながら、Remote-SSHはホストまたはEMRのどちらかがインターネットに接続する前提で作成されているため、今回のようなオフライン開発環境の場合、そのままでは上手く動作しません。そこで、オフライン環境でも利用できるようにRemote-SSHを改造し、使用するまでの手順を以下に示します。

1. VSCodeと拡張機能をインストール

まずはインターネット環境で必要なファイルをダウンロードします。

ARISE Analyticsの分析環境はRedHat系のLinuxなので、VSCodeの公式サイトから本体のrpmファイルをダウンロードします。

また、こちらのページの右側にある、Download ExtensionをクリックしてRemote-SSHのvsixファイルをダウンロードします。

今回のシステム開発ではPysparkを使用して開発を行うため、先ほどと同様にしてPythonJupyterの拡張機能をダウンロードします。

これらのファイルをオフライン環境に移送出来たら、「sudo yum localinstall」を使ってVSCodeのrpmファイルをインストールします。

次に、VSCodeを起動し、拡張機能タブの右上から「install from VSIX…」または「VSIXからのインストール」を選択して、先ほどのvsixファイルをインストールします。

ここまでで、オフライン環境のローカルでVSCodeを利用する準備が整いました。

2. Remote-SSHをオフライン環境用に改造

Remote-SSHは接続先にVSCodeのサーバー版をwgetやcurlでダウンロードしてからインストールする仕組みになっているため、ここまでの作業ではサーバー版VSCodeがダウンロードできず、利用することができません。そこで、先ほどオフライン環境にインストールしたVSCodeに対応したファイルをインターネット環境でダウンロードする必要があります。

インストールしたVScodeを開き、Help>Aboutをクリックすると、VSCodeのバージョン情報が表示されます。

Commitとなっている部分の文字列を確認し、以下のようなリンクから対応したバージョンのファイルをダウンロードします。(もしくは、VSCodeのGitHubリポジトリから各バージョンに対応したコミットidを確認してもよいです。)

https://update.code.visualstudio.com/commit:{$コミットの文字列}/server-linux-x64/stable

例えば、バージョン1.5.1の場合

https://update.code.visualstudio.com/commit:e5a624b788d92b8d34d1392e4c4d9789406efe8f/server-linux-x64/stable

のようになります。

このファイルをオフライン環境で利用できるWEBサーバに移送しておきます。

次に、Remote-SSHにオフライン環境用の改造を施します。

「~/.vscode/extensions/ms-vscode-remote.remote-ssh-{$Remote-SSHのバージョン}/out/」にある「extension.js」をエディタで開いてください。そして、「DOWNLOAD_URL=」と検索して出てきた部分を先ほどオフライン環境に移送したファイルのURLに変更します。(バージョンによっては変わっているかもしれません。(画像は別環境のVSCodeのRemote-SSH 0.63.0の場合ですが、0.56.0でも同様の箇所を変更します。)

これでRemote-SSHの改造が完了しました。

3. EMRに接続するための設定を行う

Remote-SSHは「~/.ssh/config」を読み込んで、接続先の一覧を表示します。そのため、以下のようなEMRの接続設定を追記する必要があります。(configファイルがなければ作りましょう。)

Host 好きな名前
HostName EMRのURL or IPアドレス
User hadoop
IdentityFile ~/.ssh/EMR用の秘密鍵

以上までの作業を行うと、VSCodeのRemote Explorerタブに上記で設定したEMRが表示されるようになります。EMRをクリックして、接続できるようになっていれば成功です。

VSCodeでPySparkの環境変数を設定

VSCodeにはPythonコードの実行やデバッグ、テストなどで便利な機能がたくさん搭載されています。しかしながら、EMRのデフォルトのSparkの設定ではpysparkコマンドやspark-submitコマンドから実行することが前提になっているため、PySparkを使ったPythonコードはそれらの便利な機能を使用することができません。

ここでは、通常のpythonコマンドでもPySparkを実行できるように環境変数を設定し、VSCodeの便利な機能を使用できるようにする方法を紹介します。

1.  設定が必要な環境変数

pysparkコマンドやspark-submitコマンドでは、Sparkのインストール先にあるPySparkをPythonが読み込むパッケージに追加してからコードを実行しています。しかしながらこの方法では、通常のpythonコマンドやエディタの補完機能などはPySparkパッケージを発見できず、使用できません。そこで、環境変数のPYTHONPATHに必要なパッケージの場所を追加します。

また、PySpark実行時にはSPARK_HOME、PYSPARK_PYTHON、PYSPARK_DRIVER_PYTHONの3つを設定する必要があります。

EMRでPython3を使用したい場合、これらの環境変数を以下のように設定する必要があります。(Sparkやpythonのインストール先や設定によって異なるので、適宜読み替えてください)

SPARK_HOME=/usr/lib/spark
PYSPARK_PYTHON=python3
PYSPARK_DRIVER_PYTHON=python3
PYTHONPATH=/usr/lib/spark/python:/usr/lib/spark/python/lib/py4j-*-src.zip:/usr/lib/spark/python/lib/py4j-src.zip

ところで、VSCodeでコードを実行する場合、統合ターミナルで直接実行する方法とデバッグ/テスト用のターミナルで実行する方法の2つがあります。bashrcで設定する場合は問題ないはずですが、VSCode上で設定したい場合、統合ターミナル、デバッグ/テスト用ターミナルそれぞれで設定が必要です。

2. 統合ターミナルの環境変数の設定

VSCodeの統合ターミナルは設定ファイル(プロジェクトのパス/.vscode/setting.json)で環境変数を設定できます。setting.jsonを開き、以下の内容を追記します。

"terminal.integrated.env.linux": {
    "SPARK_HOME": "usr/lib/spark",
    "PYSPARK_PYTHON": "python3",
    "PYSPARK_DRIVER_PYTHON": "python3",
    "PYTHONPATH": "/usr/lib/spark/python:/usr/lib/spark/python/lib/py4j-*-src.zip:/usr/lib/spark/python/lib/py4j-src.zip"
}

3. デバッグ/テスト用ターミナルの環境変数の設定

デバッグ/テストの際は、上記設定が適用されません。そのため、デバッグ/テスト用の設定ファイルを作成します。

デバッグタブを開くと、launch.jsonを作成するといった趣旨の文が出てくるので、クリックします。選択肢がいくつか出るので、Pythonを選択します。

次に、環境変数を書き込んだファイル(.env)をプロジェクトルートに作成します。launch.jsonはデフォルトでこのファイルを読み込んで環境変数を設定してくれます。.envファイルの内容は以下のようにします。

SPARK_HOME=/usr/lib/spark
PYSPARK_PYTHON=python3
PYSPARK_DRIVER_PYTHON=python3
PYTHONPATH=/usr/lib/spark/python:/usr/lib/spark/python/lib/py4j-*-src.zip:/usr/lib/spark/python/lib/py4j-src.zip

 

これで、デバッグ/テストでもPySparkを使用できるようになりました。

おわりに

今回は、EMR、PySpark、VSCodeを組み合わせて使用する方法を紹介しました。SparkやEMRの設定は難しく、日本語の情報も少ないので今回の記事が皆様の役に立てば幸いです。

関連記事