概要
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
「ソフトウェア設定の編集」のテキストボックスに以下を追記します。この設定により、PySparkでPython3が使用されるようになります。
[{
"Classification": "spark-env",
"Configurations": [{
"Classification": "export",
"Properties": {
"PYSPARK_PYTHON": "/usr/bin/python3"
}
}]
}]
ステップ2. ハードウェア設定
デフォルトのまま [次へ] を押下します。(クラスタスケーリングなど、必要に応じて設定してください)
ステップ3. クラスター全般設定
「クラスター名」に任意の名前を入力し、[次へ] を押下します。
ステップ4. セキュリティ
「EC2キーペア」に、マスターノード接続時に使用するキーペアを選択し、[クラスターを作成] を押下します。
しばらく待つと、クラスターのステータスが「開始中」から「実行中」または「待機中」に変化します。
2. セキュリティグループの設定
EC2マネジメントコンソールの [セキュリティグループ] メニューから、SageMaker Notebookインスタンスにアタッチするセキュリティグループを作成します。
作成したEMRクラスターのマスターノード用のセキュリティグループのインバウンドルールに以下を追加します。
- タイプ : カスタムTCP
- プロトコル : TCP
- ポート範囲 : 8998
- ソース : (作成したSageMaker Notebook用セキュリテイグループ)
3. SageMaker Notebook の作成
SageMakerマネジメントコンソールに移動し、ノートブックを作成します。Sparkインスタンスへの接続に必要な設定は以下の2つです。
ノートブックインスタンス設定
[ノートブックインスタンス設定]-[追加設定]-[ライフサイクル設定] で「新しいライフサイクル設定の作成」を押下し、以下のスクリプトを追記します。
# 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)" カーネルを選択し、ノートブックを開きます。
セルで以下を実行し、以下のような出力が得られることを確認します。
%%info
Current session configs: {'driverMemory': '1000M', 'executorCores': 2, 'kind': 'pyspark'}
No active sessions.