SageMaker NotebookからEMRのSparkクラスターに接続する


## 概要

SageMaker NotebookからEMRで構築したSparkクラスターに接続する際の手順についてまとめてみました。


## 1. EMRクラスターの作成

EMRのマネジメントコンソールを開いて [クラスターを作成] を押下し、さらに [詳細オプションに移動する] を押下して詳細オプション画面に遷移します。

#### ステップ1. ソフトウェアおよびステップ

「ソフトウェア設定」で、必要なソフトウェアにチェックを入れます。ここではデフォルトで選択されているHadoop, Pig, Hive, Hueに加え以下のソフトウェアを選択し、[次へ] を押下します。

* Livy 0.7.0 ... SparkのRESTサービス
* JupyterEnterpriseGateway 2.1.0 ... EMR Notebookを利用する際に必要
* Spark 2.4.7

![スクリーンショット 2021-03-13 16.48.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342646/ac989013-63c0-563c-8133-05be46964495.png)


「ソフトウェア設定の編集」のテキストボックスに以下を追記します。この設定により、PySparkでPython3が使用されるようになります。

```json
[{
  "Classification": "spark-env",
  "Configurations": [{
    "Classification": "export",
    "Properties": {
      "PYSPARK_PYTHON": "/usr/bin/python3"
    }
  }]
}]
```

#### ステップ2. ハードウェア設定

デフォルトのまま [次へ] を押下します。(クラスタスケーリングなど、必要に応じて設定してください)

![スクリーンショット 2021-03-13 16.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342646/063ce2c3-63ca-7694-f175-be325732c165.png)


#### ステップ3. クラスター全般設定

「クラスター名」に任意の名前を入力し、[次へ] を押下します。

![スクリーンショット 2021-03-13 16.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342646/53cdd426-deb1-44c5-e0ce-ed12cd90204c.png)


#### ステップ4. セキュリティ

「EC2キーペア」に、マスターノード接続時に使用するキーペアを選択し、[クラスターを作成] を押下します。


![スクリーンショット 2021-03-13 16.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342646/a9349a26-a86f-e2de-9b08-2d6821153ce9.png)

しばらく待つと、クラスターのステータスが「開始中」から「実行中」または「待機中」に変化します。

## 2. セキュリティグループの設定

EC2マネジメントコンソールの [セキュリティグループ] メニューから、SageMaker Notebookインスタンスにアタッチするセキュリティグループを作成します。

![スクリーンショット 2021-03-13 17.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342646/906e4250-e20b-6a26-26f8-1ecc5b691d27.png)


作成したEMRクラスターのマスターノード用のセキュリティグループのインバウンドルールに以下を追加します。

* **タイプ** : カスタムTCP
* **プロトコル** : TCP
* **ポート範囲** : 8998
* **ソース** : (作成したSageMaker Notebook用セキュリテイグループ)

![スクリーンショット 2021-03-13 17.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342646/f887afb1-4ae1-c456-343f-7d0d19855e4b.png)

## 3. SageMaker Notebook の作成

SageMakerマネジメントコンソールに移動し、ノートブックを作成します。Sparkインスタンスへの接続に必要な設定は以下の2つです。

#### ノートブックインスタンス設定

[ノートブックインスタンス設定]-[追加設定]-[ライフサイクル設定] で「新しいライフサイクル設定の作成」を押下し、以下のスクリプトを追記します。

```sh
# PARAMETERS
EMR_MASTER_IP=your.emr.master.ip

cd /home/ec2-user/.sparkmagic

echo "Fetching Sparkmagic example config from GitHub..."
wget https://raw.githubusercontent.com/jupyter-incubator/sparkmagic/master/sparkmagic/example_config.json

echo "Replacing EMR master node IP in Sparkmagic config..."
sed -i -- "s/localhost/$EMR_MASTER_IP/g" example_config.json
mv example_config.json config.json

echo "Sending a sample request to Livy.."
curl "$EMR_MASTER_IP:8998/sessions"
```

`EMR_MASTER_IP` を、作成したEMRクラスターのマスターノードのものに書き換えます。

#### セキュリティグループ設定

[ネットワーク] より、VPCおよびサブネットを選択し、セキュリティグループに既に作成した "SageMakerSecurityGroup" を選択します。



## 4. EMRインスタンスとの接続確認

起動したノートブックインスタンスからJupyterLabを開きます。"Sparkmagic (pyspark)" カーネルを選択し、ノートブックを開きます。

![スクリーンショット 2021-03-13 17.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342646/3539cfae-3568-9da4-5293-7145da577c85.png)


セルで以下を実行し、以下のような出力が得られることを確認します。

```:In
%%info
```

```:Out
Current session configs: {'driverMemory': '1000M', 'executorCores': 2, 'kind': 'pyspark'}
No active sessions.
```


## 参考

* [Control an Amazon EMR Spark Instance Using a Notebook ｜ aws](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-lifecycle-config-emr.html)
* [Amazon EMRでSparkクラスタを作ってSageMakerからジョブを実行する | け日記](https://ohke.hateblo.jp/entry/2020/06/06/230000)